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.
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:
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/random | Herhangi bir boyutta rastgele bir fotoğraf | 503 |
source.unsplash.com/random/1600x900 | Boyuta kırpılmış rastgele bir fotoğraf | 503 |
source.unsplash.com/1600x900/?apple,desk | Arama terimleriyle eşleşen rastgele bir fotoğraf | 503 |
source.unsplash.com/featured/1600x900?nature | Rastgele bir öne çıkan fotoğraf | 503 |
source.unsplash.com/collection/190727/800x600 | Bir koleksiyondan rastgele bir fotoğraf | 503 |
source.unsplash.com/user/scottwebb/1600x900 | Tek bir fotoğrafçıdan rastgele bir fotoğraf | 503 |
source.unsplash.com/daily | Gü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:
- HTTPS uç noktası bozuk.
openssl s_client -connect changelog.unsplash.com:443tlsv1 alert internal errordöndürüyor — el sıkışma herhangi bir sertifika sunulmadan başarısız oluyor. Bu yüzdenhttps://olan her 2021 dönemi bağlantısı bir tarayıcıda ölü. - Düz HTTP üzerinden yönlendiriyor, ama işe yaramaz şekilde.
http://changelog.unsplash.com/deprecations/2021/11/25/source-deprecation.htmladresini takip etmek, iki atlamadan sonraunsplash.com/@documentation/changelog/deprecations/2021/11/25/source-deprecation/htmladresinde bir400ile sonuçlanıyor — yol, sitenin kullanıcı adı rotası tarafından yutulmuş. - 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çüm | 30 Ağu 2026'daki değer | Nası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:
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:
<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.
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.
// 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:
- 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ıttaX-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.
ixidparametresini 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:
| Hizmet | Anahtar? | Ne alırsınız | Nerede 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.
# 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:
- İ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.
- 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 bironerroryedeği ve açıkwidth/heightverin, böylece bir hata bir düzen kaymasına ya da takılmış bir betiğe değil, boş bir kutuya mal olsun. - 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.
- 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.
Birincil kaynaklar: Unsplash API changelog · Unsplash API dokümantasyonu · Unsplash atıf yönergesi · Unsplash durumu · MUI #42736 · Nextcloud #115 · sindresorhus/Actions #248 · Drupal Gin Login #3324054 · Lorem Picsum · Openverse · Pexafy API ve MCP dokümanları.
Sıkça sorulan sorular
source.unsplash.com çöktü mü, yoksa kalıcı olarak mı kapatıldı?
/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?
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?
API anahtarı olmadan hâlâ rastgele bir Unsplash fotoğrafı alabilir miyim?
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?
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ı?
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?
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.