source.unsplash.com Kayboldu: Otopsi Raporu ve Yerine Geçecek Her Yöntem

2021'de “mevcut kullanımlar çalışmaya devam edecek” denilerek kullanımdan kaldırıldı, Haziran 2024'te tamamen kapatıldı ve bugün hâlâ yeni kodlara yazılıyor. Ölçülü bir otopsi raporu — ve anahtarsız rastgeleliği geri veren proxy dahil üç alternatif.

Soluk renkli ahşap bir yüzeyde duran, ekranı çatlamış bir akıllı telefonun siyah beyaz fotoğrafı; hasarlı ekranda Unsplash logosu görünüyor.
Fotoğraf: Unsplash

Bir stok fotoğraf hizmeti bir alt alan adını kapattı ve iki yıl sonra hâlâ dokümantasyon sitelerini, giriş ekranlarını, kurs alıştırmalarını ve yeni üretilen kodları bozmaya devam ediyor. Bu yazı bir URL'nin ölüm sonrası incelemesi — ne işe yaradığı, onu ne öldürdüğü ve yerine ne konması gerektiği — ve hikayenin daha tuhaf kısmına ölçülü bir bakış: kodumuzu yazan makineler onun gittiğini fark etmemiş.

HTTP yanıtları, kelimesi kelimesine alıntılanan iki changelog kaydı, API sınırları, bozulan projelerin issue takipçileri ve GitHub, npm ile Stack Overflow'dan alınan sayılar birincil kaynaklardan geliyor; her biri için yöntem dipnotlarda yer alıyor. Sadece çözümü istiyorsanız geçiş tablosuna atlayın.

Bugün hâlâ istekte bulunursanız ne alırsınız

Tek komut, anahtar yok, herhangi bir makineden tekrarlanabilir:

terminal
curl -I https://source.unsplash.com/random

HTTP/2 503
cache-control: no-cache, no-store
content-type: text/html; charset=utf-8
server: Heroku
via: 2.0 heroku-router
# gövde: herokucdn.com/error-pages/application-error.html adresine işaret eden bir iframe

Burada bir DNS hatası yok. source.unsplash.com hâlâ çözümleniyor — bir herokudns.com host'una CNAME olarak bağlı — bu yüzden istek yanıtlanıyor, sadece bir uygulama tarafından değil. Bu ayrıntı göründüğünden daha önemli: hızlı bir HTML gövdeli 503 alan bir tarayıcı bozuk bir görsel yer tutucusu çizer ve response.ok ya da hiç yazmadığınız bir onerror işleyicisini okuyan herhangi bir kod, hiç test etmediğiniz hata yolunu izler.

URL kalıbı Eskiden ne döndürüyordu Bugün
source.unsplash.com/randomHerhangi bir boyutta rastgele bir fotoğraf503
source.unsplash.com/random/1600x900Boyuta kırpılmış rastgele bir fotoğraf503
source.unsplash.com/1600x900/?apple,deskArama terimleriyle eşleşen rastgele bir fotoğraf503
source.unsplash.com/featured/1600x900?natureRastgele bir öne çıkan fotoğraf503
source.unsplash.com/collection/190727/800x600Bir koleksiyondan rastgele bir fotoğraf503
source.unsplash.com/user/scottwebb/1600x900Tek bir fotoğrafçıdan rastgele bir fotoğraf503
source.unsplash.com/dailyGünün fotoğrafı503

Her biri curl -o /dev/null -w "%{http_code}" ile ayrı ayrı kontrol edildi. Duyurulduğu üzere arama özelliği önce kademeli olarak kapatıldı; bugün uygulamanın tamamı kapalı olduğundan bu ayrım artık geçerli değil.

“Kullanımdan kaldırıldı” ile “kapatıldı” arasında geçen üç yıl

Her iki duyuru da tek bir yerde, unsplash.com/documentation/changelog adresinde hâlâ okunabilir durumda. Tam metinleriyle alıntılanmıştır, çünkü ifade tarzı hikayenin kendisidir:

25 Kasım 2021 — “Unsplash Source kullanımdan kaldırılıyor”
“Unsplash Source kullanımdan kaldırılıyor. Mevcut kullanımlar çalışmaya devam edecek, ancak yeni projeler için tam Unsplash API'sini kullanın.”

11 Haziran 2024 — “Unsplash Source kapatılıyor”
“Unsplash Source, 2021'deki kullanımdan kaldırılmasından bu yana resmi olarak desteklenmemektedir. Nihai kapatmanın bir parçası olarak, önce arama özelliğini devre dışı bırakarak kademeli olarak kapatacağız ve önümüzdeki haftalarda uygulamayı tamamen kapatacağız. Source'un mevcut kullanımlarının — özellikle üretim düzeyindekilerin — mümkün olan en kısa sürede tam Unsplash API'sine geçmesi gerekir.”

İkisini sırayla okuyunca hata modu açıkça ortaya çıkıyor. 2021 bildirimi bir vaat içeriyordu (mevcut kullanımlar çalışmaya devam edecek) ve tarih içermiyordu. Bunu 2021'de okuyan bir geliştiricinin çalışan kodu olduğu gibi bırakması için her türlü nedeni vardı; 2022'de katılan bir geliştirici ise bunu hiç okumadı. 2024 bildirimi, üç yıl sonra, kimsenin yer imlerine eklemediği bir sayfada “önümüzdeki haftalar” dedi.

Unsplash gerçekten bir kullanımdan kaldırma politikası yayınlıyor ve bu makul bir politika — dokümantasyon, açıkça belgelenmiş alanlar ve uç noktalar için değişikliklerin changelog üzerinde en az 3 hafta önceden duyurulduğunu ve uç noktaların kullanımdan kaldırma dönemi boyunca bir Warning başlığı döndürdüğünü belirtiyor. Aynı paragraf, hiçbirinin Source'u korumamasının nedenini açıklayan cümleyi de içeriyor: “Açıkça belgelenmemiş herhangi bir alan veya uç nokta için önceden uyarı yapmadan değişiklik yapabiliriz.” Source hiçbir zaman belgelenmiş API'nin bir uç noktası olmadı. Kendisini kapsayacak politikanın dışında kaldı.

  • Buradaki pratik ders “Unsplash özensiz davrandı” değil. Ders şu: hiçbir dokümantasyon okumadan kullanabileceğiniz bir URL, aynı zamanda kullanımdan kaldırma politikasını da okumadığınız bir URL'dir.
  • Bozulma duyurudan önce başladı. 28 Kasım 2022 tarihinde açılan bir Drupal issue'sunda zaten “hep bir Heroku uygulama hatası alıyorum” raporu var — kapatmadan on sekiz ay önce. Bu tür hizmetler böyle ölür: yavaşça, sonra hiç görmediğiniz bir duyuruda.

Duyuruyu bulmak, kesintiyi bulmaktan daha zor

2021 kullanımdan kaldırma duyurusu changelog.unsplash.com üzerinde yayınlanmıştı ve yukarıdaki Drupal issue'su dahil olmak üzere o dönemin tüm hata raporları bu URL'ye bağlantı veriyor. Üç ölçüm:

  1. HTTPS uç noktası bozuk. openssl s_client -connect changelog.unsplash.com:443 tlsv1 alert internal error döndürüyor — el sıkışma herhangi bir sertifika sunulmadan başarısız oluyor. Bu yüzden https:// olan her 2021 dönemi bağlantısı bir tarayıcıda ölü.
  2. Düz HTTP üzerinden yönlendiriyor, ama işe yaramaz şekilde. http://changelog.unsplash.com/deprecations/2021/11/25/source-deprecation.html adresini takip etmek, iki atlamadan sonra unsplash.com/@documentation/changelog/deprecations/2021/11/25/source-deprecation/html adresinde bir 400 ile sonuçlanıyor — yol, sitenin kullanıcı adı rotası tarafından yutulmuş.
  3. Arşivde kapatmanın olduğu yerde bir boşluk var. Wayback Machine'in eski changelog'un son başarılı kaydı 24 Mart 2024; yenisinin ilk kaydı 23 Ağustos 2024. Kapatma 11 Haziran 2024'te duyurulmuştu — bu beş aylık boşluğun içinde.

Bunların hiçbiri bir komplo değil; sıradan bir CMS geçişi. Ama sonucu gerçek ve bu makalenin her iki kaydı da tam metniyle alıntılamasının nedeni bu: bir kullanımdan kaldırmanın birincil kaydı, kullanımdan kaldırdığı şeyden daha uzun ömürlü olmalı, ve burada neredeyse öyle olmadı.

Gerçekte ne bozuldu

Yan projeler değil. Aşağıdaki hatalar herkese açık issue takipçisi kayıtlarıdır; başlıklar, tarihler ve durumlar GitHub ve drupal.org API'lerinden geliyor.

Proje Issue Açıldı Ne diyor
MUI (Material UI) #42736 24 Haz 2024 “[docs] Rastgele Unsplash fotoğraf URL'si artık çalışmıyor” — resmi Sign-in side şablonu ölü bir görsel sunuyordu. Üç gün sonra kapatıldı.
Nextcloud #115 17 Oca 2023 “Unsplash API'sine geç” — arka plan uygulaması Source URI'leri üzerine kurulmuştu. On sekiz ay açık kaldı, 16 Temmuz 2024'te kapatıldı.
sindresorhus/Actions #248 28 May 2024 “Get Unsplash Image: 503 Error” — bir iOS/macOS Shortcuts eylemi, kapatma duyurusundan iki hafta önce bozuldu.
Drupal — Gin Login #3324054 28 Kas 2022 “Unsplash source.unsplash.com'u kullanımdan kaldırdı — bu, reCAPTCHA'nın yüklenmesini geciktiriyor ve kullanıcıların giriş yapmasını engelliyor.”

Son satırı bir kez daha okuyun, çünkü içselleştirilmeye değer olan bu. Bir giriş formunun yanındaki dekoratif bir görsel — sayfadaki açıkça en az kritik varlık — bir kimlik doğrulama kesintisine dönüştü, çünkü yavaş bir üçüncü taraf isteği, giriş formunun ihtiyaç duyduğu CAPTCHA'nın önünde bekliyordu. Kimse bunu böyle yazmadı. Bir tarayıcının şeyleri yükleme sırasından ortaya çıktı.

Kodlama asistanınız bu notu almadı

İşte 2024 kesintisini 2026 sorununa dönüştüren kısım. source.unsplash.com yaklaşık sekiz yıl boyunca belgelendi, blog yazılarına konu oldu, öğretildi ve kopyalandı. Bütün bu metinler, artık başlangıç kodumuzu yazan modellerin eğitim verisinde bulunuyor — ve metnin son kullanma tarihi yoktur. Üç sayım:

Ölçüm30 Ağu 2026'daki değerNasıl elde edildi
source.unsplash.com içeren dosyalar 3.344 GitHub kod arama API'si, q=source.unsplash.com (yalnızca indekslenmiş genel kod — bir taban değer, toplam değil)
100 dosyalık örneklemde kapatmadan sonra oluşturulan depolar 77'de 12 Aynı sorgu, 100 sonuç, 77 depoya kadar tekilleştirildi, created_at 11 Haz 2024 ile karşılaştırıldı
…ve o örneklemde son 12 ayda push yapılan depolar 77'de 20 Canlı depolar, arşivler değil — demo dosyası hâlâ imageUrl: 'https://source.unsplash.com/64x64/?dingo' okuyan elastic/kibana dahil
unsplash-source-es6'nın aylık indirmesi 23 npm registry API'si — ölü bir hizmet için bir sarmalayıcı, son olarak 2022'de yayınlandı, hâlâ kuruluyor
Bundan bahseden Stack Overflow gönderileri 1.459 Stack Exchange API'si, /search/excerpts toplamı

En doğrudan kanıt uygulama kodunda bile değil — istemlerde. Bu aramanın en üstteki sonucu, “lütfen unsplash API'sini kullan ( https://source.unsplash.com/1280x720/?<SORGUNUZU BURAYA YAZIN>” satırını içeren bir GPT sistem istemleri kütüphanesi. Bu talimat bugün hâlâ yeni asistanlara kopyalanıyor. Model URL'yi doğrulamıyor; onu kullanması söylendi ve gördüğü her örnek buna uygundu.

Yani üretilen kod hatasının iki bağımsız nedeni var ve birini düzeltmek diğerini düzeltmiyor: bayat eğitim verisi ve bunun üzerine insanlar tarafından yazılan bayat talimatlar. Her iki durumda da belirti aynı: hiç yüklenmeyen görsellerin aynı ailesi:

grep'lenmeye değer ölü-görsel kalıpları
source.unsplash.com/random/1200x800   # 2024 ortasından beri 503 — asla geri gelmiyor
images.unsplash.com/photo-…           # gerçek CDN, ama ezberlenmiş ID'ler mevcut olmayabilir
via.placeholder.com/400               # gri dikdörtgen, üretime gönderilmiş
placehold.co/800x600                  # gri dikdörtgen, kasıtlı olarak
picsum.photos/800/600                 # gerçek bir fotoğraf, sayfanızla alakasız
/placeholder.png                      # depoya hiç eklenmemiş bir dosya

Bu listenin ikinci satırına bir dipnot: bu yazı hazırlanırken, via.placeholder.com test ağımızdan bir TLS el sıkışmasını da tamamlayamadı ve düz HTTP üzerinden 403 yanıtı verdi. Bu araçların başvurduğu yedek çözümün kendi kesinti hikayesi olabilir — kendi ağınızdan güvenmeden önce kontrol edin.

Sadece ilki gerçekten bozuk. Diğerleri daha ince bir şekilde daha kötü: yükleniyorlar, düzen bitmiş gibi görünüyor ve kimse sayfanın belirli bir şeyle değil, hiçbir şeyle görselleştirildiğini fark etmiyor. Ve bunların hiçbiri görsellere özgü değil — bu, sorunun genel şekli. Bir modelin webe dair görüntüsü bir anlık kesittir ve deklanşör kapandıktan sonra uç noktalar, CLI bayrakları, paket adları ve ücretsiz katmanlar hareket etmeye devam eder.

Geçiş tablosu

Tam olarak üç varış noktası var ve bunları sunmanın dürüst yolu neyden vazgeçtiğinizi göstermektir. Önce sütunu seçin, sonra satırınızı okuyun.

Eski Source URL'si A. Sabit CDN URL'sianahtar yok · rastgelelik yok B. Unsplash API'sianahtar · sunucu tarafı çağrı C. Kendi proxy'nizanahtar gizli · rastgelelik geri
/random images.unsplash.com/photo-… — sizin seçtiğiniz bir fotoğraf GET /photos/random /?w=1600
/random/1600x900 …?w=1600&h=900&fit=crop /photos/random + döndürülen URL üzerinde Imgix parametreleri /?w=1600&h=900&fit=crop
/1600x900/?apple,desk Karşılığı yok — bir fotoğrafı elle seçin /photos/random?query=apple,desk /?query=apple,desk&w=1600
/featured/1600x900?nature Karşılığı yok /photos/random?query=nature “featured”in bir devamı yok /?query=nature&w=1600
/collection/67920491/1600x900 Karşılığı yok /photos/random?collections=67920491 /?collections=67920491&w=1600
/user/scottwebb/1600x900 Karşılığı yok /photos/random?username=scottwebb /?username=scottwebb&w=1600
/daily Bir fotoğrafı sabitleyin, derlemede döngüye sokun Karşılığı yok — rastgele bir fotoğrafı kendiniz 24 saat önbelleğe alın Aynısı, önbellek proxy'de olacak şekilde

Seçenek A çoğu insanın aslında istediği şey. Görsel dekoratifse — bir hero görseli, bir giriş yan paneli, bir kart arka planı — zaten her istekte farklı bir fotoğrafa ihtiyacınız yoktu. Birini seçin, CDN URL'sini saklayın, ve sayfa artık hiçbir rastgele şeye bağımlı olmaktan çıkar:

sabit, yeniden boyutlandırılabilir bir Unsplash URL'si — anahtar yok, API çağrısı yok
<img src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1600&h=900&fit=crop&auto=format"
     width="1600" height="900" alt="…">
# Resmi olarak desteklenen parametreler: w, h, crop, fit, fm, auto=format, q, dpr.
# API'nin size verdiği ixid parametresini koruyun — görüntülemeyi raporlayan odur.

Seçenek B resmi yol ve çağrıyı sunucu tarafına taşır, çünkü ön uç JavaScript'te bir Client-ID, yayınlanmış bir kimlik bilgisidir. İnsanları tökezleten iki kuralı unutmayın: collections/topics, aynı istekte query ile birleştirilemez ve count (maks. 30), yanıt şeklini değeri 1 olsa bile bir diziye çevirir.

/random için resmi yenileme
curl "https://api.unsplash.com/photos/random?query=nature&orientation=landscape" \
  -H "Authorization: Client-ID YOUR_ACCESS_KEY" \
  -H "Accept-Version: v1"

# → JSON. Görsel .urls.regular / .urls.raw adresinde bulunur (w/h/fit'i kendiniz ekleyin).
# → X-Ratelimit-Limit: 1000   X-Ratelimit-Remaining: 999

Seçenek C: Source'u yaklaşık kırk satırda yeniden inşa edin

Kaybettiğiniz şey gerçekten davranışın kendisiyse — her seferinde farklı bir fotoğraf döndüren, doğrudan bir <img> etiketinden, bir CMS alanından ya da sunucu olmayan bir statik siteden kullanılabilen anahtarsız bir URL — o zaman bu uç noktayı kendiniz çalıştırmanız gerekir. API'nin önünde küçük bir worker ve onu üretimle temasa dayanıklı kılan üç şey: önbellek, referrer kontrolü ve sorgu dizisinin geri kalanını CDN'e aktarmak.

worker.js — /photos/random üzerine kurulu, anahtarsız, Source biçimli bir uç nokta
// Cloudflare Workers. Başka yerlerde (Deno Deploy, Val Town…) şekil aynı,
// ama caches.default yerine caches.open() ile adlandırılmış bir önbellek açın.
// UNSPLASH_KEY sunucu tarafında kalır. Çağıranlar onu asla görmez.
const ALLOWED = ["example.com", "www.example.com"];   // yalnızca kendi alanlarınız
const API_PARAMS = ["query", "collections", "topics", "username", "orientation"];
const TTL = 60;                                       // saniye — saatlik kotayı korur

const host = (value) => { try { return new URL(value).hostname; } catch { return null; } };

export default {
  async fetch(req, env, ctx) {
    // 0. Yalnızca GET: Cache API başka herhangi bir şeyi saklamayı reddeder ve bir görsel
    //    uç noktasının yanıtlayacak başka bir fiili yoktur.
    if (req.method !== "GET")
      return new Response("Method not allowed", { status: 405 });
    const url = new URL(req.url);

    // 1. Yalnızca kendi sayfalarınız bunu gömebilir — açık internette herkese açık bir
    //    rastgele fotoğraf uç noktası, başkasının hız sınırını tüketmek demektir.
    const ref = req.headers.get("referer");       // birçok meşru istemcide yok
    if (ref && !ALLOWED.includes(host(ref)))
      return new Response("Forbidden", { status: 403 });

    // 2. Parametre kombinasyonuna göre önbelleğe alın, böylece 12 görselli bir sayfa
    //    her render için on iki değil, dakikada bir API çağrısına mal olur.
    const cache = caches.default;
    const hit = await cache.match(req);
    if (hit) return hit;

    // 3. Resmi API'den rastgele bir fotoğraf isteyin.
    const api = new URL("https://api.unsplash.com/photos/random");
    for (const p of API_PARAMS)
      if (url.searchParams.has(p)) api.searchParams.set(p, url.searchParams.get(p));

    const r = await fetch(api, { headers: {
      Authorization: "Client-ID " + env.UNSPLASH_KEY,
      "Accept-Version": "v1",
    }});
    // Buradaki 403 genellikle kötü bir anahtar değil, saatlik kota demektir — panik değil, TTL'yi yükseltin.
    if (!r.ok) return new Response("Upstream " + r.status, { status: 502 });
    const photo = await r.json();

    // 4. Görsel URL'sini yeniden oluşturun: ixid'i koruyun, çağıranın boyutlandırma parametrelerini ekleyin.
    const img = new URL(photo.urls.raw);          // .raw zaten ixid'i taşıyor
    for (const [k, v] of url.searchParams)
      if (!API_PARAMS.includes(k)) img.searchParams.set(k, v);  // w, h, fit, q…

    const res = new Response(null, { status: 302, headers: {
      Location: img.toString(),
      "Cache-Control": "public, max-age=" + TTL,
      // Kredi yönlendirmeyle birlikte gider; başlık değerleri ASCII olmalı, dolayısıyla kodlama.
      "X-Photo-Credit": encodeURIComponent(photo.user.name + " on Unsplash"),
      "X-Photo-Link": photo.links.html,
    }});
    ctx.waitUntil(cache.put(req, res.clone()));
    return res;
  },
};

Bir URL'yi taşımak o zaman bir bul-değiştir işlemine dönüşür ki bu da tam olarak bu seçeneği yirmi dakikaya değer kılan şeydir:

bire bir değiştirme
- https://source.unsplash.com/collection/67920491/1600x900
+ https://img.example.com/?collections=67920491&w=1600&h=900&fit=crop

İki tasarım notu, ikisi de yazıya dökülmeden önce birine kötü bir öğleden sonraya mal oldu. Baytları proxy'lemek yerine yönlendirme (302) yapmak, sizi bant genişliği sorumluluğundan kurtarır ve görüntülemenin Unsplash'in CDN'inde sayılmasını sağlar — ki yönergelerin istediği de budur. Referer kontrolü de başlık yokken bilerek esnek bırakılmıştır — birçok meşru istemci onu kaldırır — ama uç noktanızın başkasının ücretsiz görsel API'sine dönüştüğü bariz durumu yine de engeller.

API'yi kullandığınız anda devraldığınız kurallar

Source'un kuralı yoktu çünkü hesabı yoktu. API'nin, işi nasıl kurguladığınızı değiştiren beş kuralı var, hepsi güncel dokümantasyondan:

  • Hız sınırları saatliktir ve başta küçüktür. Demo modunda saatte 50 istek; uygulamanız üretim için onaylandıktan sonra saatte 1.000. Yalnızca api.unsplash.com'a yapılan çağrılar sayılır — images.unsplash.com'a yapılan görsel istekleri sayılmaz. Her yanıtta X-Ratelimit-Remaining'i okuyun.
  • Doğrudan bağlantı vermek (hotlinking) yalnızca izinli değil, zorunludur. Unsplash, fotoğraf görüntülemelerinin fotoğrafçıya atfedilebilmesi için API'nin döndürdüğü görsel URL'lerinin doğrudan gömülmesini şart koşuyor. Dosyayı kendi CDN'inize yansıtmak, yapmakta özgür olmadığınız tek optimizasyon.
  • ixid parametresini koruyun. Döndürülen URL'yi yeniden boyutlandırmak ve kırpmak beklenir; uygulamanızı tanımlayan parametreyi kaldırmak beklenmez.
  • Atıf ve indirme takibi anlaşmanın bir parçasıdır — fotoğrafçı ve Unsplash kredilendirilir, ve bir kullanıcı dosyayı aldığında bir “indirme”nin, fotoğrafın indirme uç noktası üzerinden raporlanması gerekir; bu, sizin kendinizin tetiklemeniz gereken bir olaydır.
  • Dağıtılmış ürünler dinamik istemci kaydı gerektirir. Bir eklenti, bir tema ya da kendi barındırdığınız bir CMS gönderiyorsanız, tek bir paylaşılan anahtar hem politika ihlali hem de tek bir hata noktasıdır; API tam olarak bu durum için bir kayıt akışına sahiptir.

Bu, kapsam konusunda dürüst olma anı: zaten bir API ve anahtar bağlıyorsanız, hangi görsel API'sini seçeceğiniz sorusu birden açık hale gelir ve istemciyi yazmadan önce beş dakika harcamaya değer. Ücretsiz olanları — kotalar, kurallar, arama davranışı ve yanıt şekilleri — ücretsiz stok fotoğraf API karşılaştırmasında karşılaştırdık.

Sadece bir yer tutucu istiyorsanız, bunu açıkça söyleyin

Source kullanımının büyük bir kısmı hiçbir zaman Unsplash ile ilgili değildi. “Düzeni kurgularken buraya görsel şeklinde bir şey koy” demekti. Bunun için anahtarsız hizmetler hâlâ var ve doğru cevap onlar:

HizmetAnahtar?Ne alırsınızNerede yetersiz kalır
Lorem Picsum Hayır Gerçek fotoğraflar: picsum.photos/800/600, /id/237/… ya da /seed/xxx/… ile sabit bir tane, artı ?grayscale ve ?blur=1..10. /v2/list uç noktası her fotoğrafın Unsplash sayfasını ve yazarını kredilendirir. Hiçbir konu hedeflemesi yok. Fotoğraf sayfanızla alakalı olmayacak.
placehold.co Hayır Herhangi bir boyutta etiketli dikdörtgenler — dürüst wireframe doldurma. Bir gri kutudur ve bir müşteriyle paylaşılan ekran görüntüsünde de öyle görünür.
Openverse Hayır WordPress.org tarafından işletilen, herkese açık bir API'ye sahip, açık lisanslı bir katalog. Anahtar kelime eşleştirmesi ve lisanslar öğeye göre değişir — bunları okumanız gerekir.

Önemli olan ayrım şu: bir yer tutucu tanım gereği geçicidir. Görsel üretime kadar hayatta kalırsa artık bir yer tutucu değildir — kimsenin seçmediği bir illüstrasyondur ve okuyucu bunu anlar.

Üç yerine bir anahtar

Kimsenin planlamadığı geçiş kısmı burada: Source'tan ayrılan insanlar nadiren tek bir API'ye yerleşir. Bir sayfa bir hero görseli, iki bölüm görseli ve bir kart grid'i için bir şeye ihtiyaç duyar ve dürüst cevap genellikle Unsplash artı Pexels artı Pixabay'dir — aynı <img> etiketlerini doldurmak için üç kayıt, üç kimlik doğrulama şeması, üç JSON şekli, üç sayfalama modeli ve üç atıf kuralı seti. Bu entegrasyon işi, anahtarsız bir URL'nin ortadan kalkmasının gerçek faturasıdır ve bu, faturaya neden olan kesintiden haftalar sonra elinize ulaşır.

Bunu tek bir entegrasyona indirmek için Pexafy'ı kurduk: tek bir şemada 9 ücretsiz lisanslı kütüphane üzerinde tek bir anahtar, cümle düzeyinde anlamsal aramayla — böylece “üstten çekilmiş, ahşap bir masa üzerinde çatlak bir telefon ekranı” gibi tam bir açıklama, hiçbir şey yerine sıralanmış sonuçlar döndürür. İki sınır, açıkça belirtilmiş, çünkü bu makalenin tamamı iki kez şaşırmamakla ilgili: bir anahtar gerektirir, dolayısıyla Source'un olduğu şeyi geri getirmez — yukarıdaki resmi Unsplash API'siyle aynı kategoriye girer; ve editoryal ya da marka görselleri değil, ücretsiz lisanslı fotoğrafçılık taşır.

Gerçekten yeni olan kısım yukarıdaki asistanlara yönelik: mcp.pexafy.com/mcp adresindeki bir MCP sunucusu, aksi takdirde belleğinden bir görsel URL'si okuyacak bir modelin gerçek bir kataloğu aramasını ve kredi satırı ekli, var olan bir fotoğrafı döndürmesini sağlar. Bu, makine tarafından yazılan ölü URL'lere herhangi bir lint kuralından daha iyi bir cevaptır ve gerekçesi AI ajanları için görsel arama altyapısında yazılmıştır.

Envanterinizi on dakikada denetleyin

Neye göç ederseniz göç edin, önce bunu yapın — bulmadığınız URL'leri düzeltemezsiniz. Source sadece bugünün örneği; aynı üç adım gömdüğünüz her harici varlık için geçerli.

her ölü referansı bulun, sonra onları uzak tutun
# 1. Depodaki her şey, dokümanlar, testler, fixture'lar ve README'ler dahil.
grep -rn --binary-files=without-match \
  -e "source.unsplash.com" -e "via.placeholder.com" -e "/placeholder.png" .

# 2. Veritabanının tuttuğu her şey — CMS gövdeleri bunların en uzun süre saklandığı yerdir.
psql -c "SELECT id FROM posts WHERE body LIKE '%source.unsplash.com%'"

# 3. Derlenmiş sitenin gerçekten istediği her şey: onu tarayın ve hataları listeleyin.
#    Dosya uzantısına değil, özniteliğe eşleştirin — görsel URL'leri nadiren .jpg ile biter.
grep -rhoE 'src="[^"]+"' dist/ \
  | cut -d'"' -f2 | grep -E '^https?://' | sort -u \
  | xargs -P8 -I{} curl -s -o /dev/null -w "%{http_code} {}\n" {} \
  | grep -v "^200"

# 503 https://source.unsplash.com/random/1200x800   ← aradığınız şey bu

Sonra bir kez karar verin: harici görsellerin size ne kadara mal olmasına izin veriyorsunuz. Bir sonraki kapanmayı kim yaparsa yapsın hayatta kalan dört kural:

  1. İstek anında değil, derleme anında getirin. Derleme sırasında çözümlenen bir görsel, gece 3'te bir kullanıcının önünde değil, CI'da bir geliştiricinin önünde başarısız olur.
  2. Dekoratif bir varlığın kritik bir yolu asla engellemesine izin vermeyin. Bir giriş formunun üzerinde harici hiçbir şeyi önceden yüklemeyin; her üçüncü taraf <img>'ye bir onerror yedeği ve açık width/ height verin, böylece bir hata bir düzen kaymasına ya da takılmış bir betiğe değil, boş bir kutuya mal olsun.
  3. Kontrolü CI'ya ekleyin. Yukarıdaki 3. adım, derlenmiş çıktınız üzerinde çalıştırıldığında, “birileri sonunda fark etti”yi kırmızı bir derlemeye çevirir. Bu, tekrarı önleyen tek adımdır.
  4. Harici bağımlılıklarınız için de bir bütçe belirleyin, tıpkı diğerleri gibi. Sayfalarınızın hangi host'lara bağımlı olmasına izin verildiğini ve her biri kapandığında ne olacağını yazın. Kayıt olmanıza gerek kalmayan bir URL hâlâ bir bağımlılıktır — Source, bunun sadece kimsenin sahiplenmediği bir bağımlılık olduğunu kanıtladı.

Kaynaklar ve dipnotlar

1 Bu makaledeki her durum kodu, sayı ve alıntılanan satır, 30 Ağustos 2026 tarihinde birincil kaynağından alınmıştır. HTTP durum kodları her URL kalıbına karşı curl ile alındı; hepsi server: Heroku ile ve herokucdn.com/error-pages/application-error.html gömülü bir gövdeyle 503 döndürdü. DNS çözümlemesi aynı gün doğrulandı (bir herokudns.com host'una CNAME).

2 Her iki changelog kaydı da unsplash.com/documentation/changelog'dan kelimesi kelimesine alıntılanmıştır. Kullanımdan kaldırma politikası ifadesi (3 hafta önceden bildirim, Warning başlığı ve açıkça belgelenmemiş uç noktalar için istisna) aynı gün unsplash.com/documentation'dan alınmıştır.

3 TLS hatası openssl s_client -connect changelog.unsplash.com:443 (tlsv1 alert internal error) ile yeniden üretildi. Yönlendirme zinciri curl -L ile takip edildi. Arşiv boşluğu Wayback CDX API'sinden alındı: changelog.unsplash.com'un son 200 kaydı 20240324 tarihinde, unsplash.com/documentation/changelog'un ilk kaydı 20240823 tarihinde.

4 Issue başlıkları, oluşturma ve kapatma tarihleri GitHub REST API'sinden (mui/material-ui#42736, nextcloud/unsplash#115, sindresorhus/Actions#248) ve gin_login issue 3324054 için drupal.org JSON API'sinden okunmuştur; bu issue'nun gövdesi Kasım 2022'de “hep bir Heroku uygulama hatası alıyorum” raporunu içermektedir.

5 Sayımlar: GitHub kod arama API'si (3.344 dosya; 77 depoya tekilleştirilmiş 100 sonuçluk bir örneklem, bunlardan 12'si 11 Haziran 2024'ten sonra oluşturulmuş ve 20'sine önceki 12 ay içinde push yapılmış); npm registry indirme API'si (unsplash-source-es6, önceki 30 günde 23 indirme); Stack Exchange /search/excerpts (1.459 gönderi). Kod araması yalnızca indekslenmiş genel depoları kapsar, dolayısıyla her rakam bir taban değerdir.

Sıkça sorulan sorular

source.unsplash.com çöktü mü, yoksa kalıcı olarak mı kapatıldı?
Kalıcı olarak kapatıldı. Unsplash, 25 Kasım 2021'de servisi kullanımdan kaldırdıktan sonra 11 Haziran 2024'te kapanışı duyurdu — “önce arama özelliğini devre dışı bırakarak kademeli olarak kapatacağız, önümüzdeki haftalarda ise uygulamayı tamamen kapatacağız.” Her desen (/random, /1600x900/?query, /collection/…, /daily) artık Heroku'nun genel Application Error sayfasıyla birlikte HTTP 503 döndürüyor. Alan adı hâlâ çözümlendiği için hata, bir ağ hatası değil bozuk bir görsel olarak karşınıza çıkıyor.
source.unsplash.com/random'ın doğrudan yerine ne geçer?
Anahtarsız birebir bir alternatif yok ve bunu baştan kabul etmekte fayda var. Üç alternatif mevcut. Sabit bir CDN URL'si — images.unsplash.com/photo-…?w=1600&h=900&fit=crop — anahtar gerektirmez ama her zaman aynı fotoğrafı döndürür; ki dekoratif kullanımların çoğu zaten buna ihtiyaç duyuyordu. Resmi API, yani Authorization: Client-ID başlığıyla çağrılan GET https://api.unsplash.com/photos/random, rastgeleliği geri getirir ama sunucu tarafında çağrılmalıdır. Bu uç noktanın önüne kurduğunuz küçük bir proxy, doğrudan bir <img> etiketine yerleştirebileceğiniz anahtarsız bir URL veren tek seçenektir.
Yapay zeka kodlama araçları 2026'da hâlâ neden source.unsplash.com URL'leri üretiyor?
Çünkü bu URL yaklaşık sekiz yıl boyunca belgelendi, öğretildi ve kopyalandı; bir servis sona erdiğinde eğitim verisi süresi dolmuyor. 30 Ağustos 2026'da ölçüldüğünde: GitHub kod aramasında hâlâ bunu içeren 3.344 dosya bulunuyor ve 100 dosyalık bir örneklemde 77 depodan 12'si kapanıştan sonra oluşturulmuş. İnsanlar tarafından yazılan prompt kütüphaneleri de bu talimatı tekrarlıyor — yaygın olarak kopyalanan bir GPT promptu hâlâ modele “unsplash API'sini kullan ( https://source.unsplash.com/1280x720/?… )” diyor. Bir modelin yazdığı herhangi bir görsel URL'sini doğrulanmamış kabul edin ve CI'da durum kodlarını kontrol edin.
API anahtarı olmadan hâlâ rastgele bir Unsplash fotoğrafı alabilir miyim?
Unsplash'ten doğrudan alamazsınız — rastgele seçim artık Client-ID gerektiren /photos/random uç noktasının arkasında. Anahtarsız iki yolunuz var: anahtarın sunucu tarafında kaldığı ve genel URL'nin eskisine benzediği kendi barındırdığınız bir proxy, ya da Lorem Picsum (picsum.photos/800/600) gibi üçüncü taraf bir yer tutucu servis; bu, anahtar gerektirmeden gerçek fotoğraflar sunar ama konu hedeflemesi hiç yoktur.
Unsplash API görsellerin indirilip kendi sunucumda barındırılmasına izin veriyor mu?
Hayır. Çoğu API'nin aksine Unsplash hotlinking zorunlu kılar: API'nin döndürdüğü görsel URL'leri doğrudan gömülmeli, böylece fotoğraf görüntülemeleri fotoğrafçı için sayılır. Bununla birlikte üç yükümlülük gelir — URL'yi yeniden boyutlandırırken veya kırparken ixid parametresini koruyun, fotoğrafçıyı ve Unsplash'i kredilendirin ve bir kullanıcı dosyayı indirdiğinde fotoğrafın indirme uç noktasını tetikleyin. Dosyaları kendi CDN'inize yansıtmak, yapmakta özgür olmadığınız tek optimizasyon.
2021'deki kullanımdan kaldırma bildirimi neden mevcut kullanıcıları korumadı?
Çünkü bildirim ile politika aynı şeyi kapsamıyordu. 25 Kasım 2021 tarihli değişiklik günlüğü kaydı “mevcut kullanımlar çalışmaya devam edecek” diyordu ve herhangi bir bitiş tarihi vermiyordu. Unsplash'in yayımladığı kullanımdan kaldırma politikası — en az üç haftalık bildirim artı bir Warning başlığı — kamuya açık olarak belgelenmiş alanlara ve uç noktalara uygulanır; aynı paragraf, belgelenmemiş herhangi bir şeyin hiçbir uyarı olmadan değişebileceğini de belirtir. Source, API'nin belgelenmiş bir uç noktası hiçbir zaman olmadığından, onu koruyacak politikanın dışında kaldı.
Projemdeki her ölü source.unsplash.com URL'sini nasıl bulurum?
Üç geçiş, on dakika. Depoyu grep'leyin — belgeler, testler, fixture'lar ve README'ler dahil — grep -rn "source.unsplash.com" . — çünkü bu URL'ler en uzun süre örnek kodlarda hayatta kalır. Veritabanını sorgulayın, çünkü CMS makale gövdeleri bunların saklandığı yerdir (WHERE body LIKE '%source.unsplash.com%'). Ardından derlenmiş çıktınızı tarayın: her görsel URL'sini çıkarıp her birine istek atın, 200 olmayan her şeyi listeleyin. Bu son adımı CI'a ekleyin; böylece ölü bir üçüncü taraf varlığı bir sayfayı değil, bir derlemeyi başarısız kılar.

Anahtar kelime avından vazgeçin. Ne demek istediğinizi anlatın.

9M+ ücretsiz kullanılabilen görseli anlamına göre arayın — herhangi bir dilde, 100 ms'nin altında.