Wala na ang source.unsplash.com: Ang Post-Mortem at Bawat Paraan para Palitan Ito
Na-deprecate noong 2021 na may sinabing “existing uses will continue to work”, pinatay noong Hunyo 2024, at patuloy pa ring isinusulat sa bagong code hanggang ngayon. Ang detalyadong post-mortem — at ang tatlong kapalit, kasama ang proxy na nagbabalik ng keyless na randomness.
Nagpatay ng subdomain ang isang stock photo service, at dalawang taon pa rin ang nakalipas, sinisira pa rin nito ang mga documentation site, login screen, exercise sa kurso, at bagong nabuong code. Ito ay isang post-mortem ng isang URL — kung ano ang ginawa nito, kung ano ang pumatay dito, at kung ano ang ipuputok sa lugar nito — kasama ang isang masusing pagtingin sa mas kakaibang bahagi ng kuwento: hindi napansin ng mga makinang sumusulat ng ating code na wala na ito.
Ang mga HTTP response, ang dalawang changelog entry na sinipi nang salita-sa-salita, ang mga limitasyon ng API, ang mga issue tracker ng mga proyektong nasira, at ang mga bilang mula sa GitHub, npm at Stack Overflow ay lahat galing sa mga primaryang pinagmulan, kasama ang paraan para sa bawat isa sa mga footnote. Kung gusto mo lang ang ayos, dumiretso ka sa talahanayan ng migrasyon.
Ano ang makukuha mo ngayon, kung hihilingin mo pa rin ito
Isang command, walang key, magagawang muli mula sa kahit anong makina:
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
# body: isang iframe na nakaturo sa herokucdn.com/error-pages/application-error.html
Wala rito ang isang DNS failure. Nareresolba pa rin ang source.unsplash.com — isa itong CNAME sa
isang host na herokudns.com — kaya nasasagot ang request, hindi lamang ng isang application. Mas mahalaga ang detalyeng ito kaysa sa tunog nito: ang isang browser na tumatanggap ng mabilis na 503 na may HTML body ay
nagre-render ng broken image placeholder, at anumang code na nagbabasa ng response.ok o isang
onerror handler na hindi mo isinulat ay tumatahak sa failure path na hindi mo tinesting.
| URL pattern | Ano ang dating ibinabalik nito | Ngayon |
|---|---|---|
source.unsplash.com/random | Isang random na larawan, kahit anong sukat | 503 |
source.unsplash.com/random/1600x900 | Isang random na larawan, na-crop sa sukat | 503 |
source.unsplash.com/1600x900/?apple,desk | Isang random na larawang tumutugma sa mga search term | 503 |
source.unsplash.com/featured/1600x900?nature | Isang random na featured na larawan | 503 |
source.unsplash.com/collection/190727/800x600 | Isang random na larawan mula sa isang koleksyon | 503 |
source.unsplash.com/user/scottwebb/1600x900 | Isang random na larawan mula sa isang photographer | 503 |
source.unsplash.com/daily | Ang larawan ng araw | 503 |
Sinuri isa-isa gamit ang curl -o /dev/null -w "%{http_code}". Ang feature na search ay
unang binawasan gaya ng inanunsyo; ngayon, patay na ang buong application, kaya wala nang
pagkakaiba.
Tatlong taon sa pagitan ng “deprecated” at “off”
Nababasa pa rin ang dalawang anunsyo, sa iisang lugar, sa unsplash.com/documentation/changelog. Sinipi nang buo, dahil ang mismong pananalita ang buong kuwento:
25 Nobyembre 2021 — “Unsplash Source being deprecated”
“Unsplash Source is being deprecated. Existing uses will continue to work, however for new projects use the full Unsplash API.”
11 Hunyo 2024 — “Unsplash Source sunset”
“Unsplash Source has been officially unsupported since its deprecation in 2021. As part of the final sunsetting, we will first wind down by disabling the search feature, and in the coming weeks turn off the application entirely. Existing uses of Source — particularly production-level ones — should migrate as soon as possible to the full Unsplash API.”
Basahin ang mga ito nang sunod-sunod at malinaw ang mode ng pagkabigo. Naglalaman ang paunawa noong 2021 ng isang pangako (existing uses will continue to work) at walang petsa. Ang isang developer na nagbasa nito noong 2021 ay may buong dahilan para hayaan ang gumaganang code nang hindi ginagalaw; ang isang developer na sumali noong 2022 ay hindi na ito nabasa. Ang paunawa noong 2024 ay nagbigay ng “the coming weeks”, tatlong taon ang lumipas, sa isang pahinang walang naka-bookmark.
Naglathala nga ang Unsplash ng isang deprecation policy, at makatwiran naman ito — sinasabi ng dokumentasyon
na para sa mga pampublikong dokumentadong field at endpoint, ang mga pagbabago ay inanunsyo sa changelog nang may kahit
3 linggong paunawa, at nagbabalik ang mga endpoint ng isang Warning header
sa panahon ng deprecation. Ang parehong parapo ay naglalaman ng pangungusap na nagpapaliwanag kung bakit walang anuman dito ang
nagprotekta sa Source: “For any non-publicly documented fields or endpoints, we may make changes
to these with no warning.” Ang Source ay hindi kailanman naging endpoint ng dokumentadong API. Nasa labas ito ng
polisiyang sana ay sasaklaw dito.
- Ang praktikal na aral ay hindi “pinabayaan ito ng Unsplash”. Ang leksyon ay isang URL na magagamit mo nang hindi binabasa ang anumang dokumentasyon ay isang URL na hindi mo rin nabasa ang deprecation policy.
- Nangyari ang pagkasira bago pa ang anunsyo. Isang Drupal issue na na-file noong 28 Nobyembre 2022 ay nag-uulat na ng “I get always a Heroku application error”, labing-walong buwan bago ang entry ng pagre-retire. Ganito namamatay ang mga serbisyong ito: dahan-dahan, tapos sa isang anunsyong hindi mo makikita.
Mas mahirap hanapin ang anunsyo kaysa sa outage
Ang deprecation noong 2021 ay inilathala sa changelog.unsplash.com, at iyon ang URL na
nakadugtong ang bawat kontemporaryong bug report — kasama ang Drupal na binanggit sa itaas. Tatlong
sukatan:
- Sira ang HTTPS endpoint. Ang
openssl s_client -connect changelog.unsplash.com:443ay nagbabalik ngtlsv1 alert internal error— nabibigo ang handshake bago pa man mabigay ang anumang certificate. Kaya patay sa isang browser ang bawat link mula panahon ng 2021, nahttps://. - Sa plain HTTP, nagre-redirect ito, ngunit hindi kapaki-pakinabang. Ang pagsunod sa
http://changelog.unsplash.com/deprecations/2021/11/25/source-deprecation.htmlay natatapos, dalawang hop mamaya, sa isang400saunsplash.com/@documentation/changelog/deprecations/2021/11/25/source-deprecation/html— nilamon ng username route ng site ang path. - May butas ang archive kung saan naroon ang pagre-retire. Ang huling matagumpay na capture ng Wayback Machine ng lumang changelog ay noong 24 Marso 2024; ang una nitong capture ng bago ay noong 23 Agosto 2024. Ang pagre-retire ay inanunsyo noong 11 Hunyo 2024 — sa loob ng puwang na iyon na limang buwan.
Wala sa mga ito ang isang konspirasyon; isa itong karaniwang paglipat ng CMS. Ngunit tunay ang bunga, at ito ang dahilan kung bakit sinipi ng artikulong ito ang parehong entry nang buo: ang primaryang talaan ng isang deprecation ay dapat mabuhay nang mas matagal kaysa sa bagay na ipinaparating nitong itinigil, at dito, halos hindi ito nangyari.
Ano talaga ang nasira
Hindi mga side project. Ang mga pagkabigong nasa ibaba ay mga entry sa pampublikong issue tracker; ang mga titulo, petsa at estado ay mula sa mga API ng GitHub at drupal.org.
| Proyekto | Issue | Binuksan | Ano ang sinasabi nito |
|---|---|---|---|
| MUI (Material UI) | #42736 | 24 Hun 2024 | “[docs] Random Unsplash photo URL is no longer functional” — ang opisyal na template na Sign-in side ay naghatid ng patay na larawan. Isinara pagkalipas ng tatlong araw. |
| Nextcloud | #115 | 17 Ene 2023 | “Migrate to Unsplash API” — ang background app ay binuo gamit ang mga URI ng Source. Bukas nang labing-walong buwan, isinara noong 16 Hulyo 2024. |
| sindresorhus/Actions | #248 | 28 Mayo 2024 | “Get Unsplash Image: 503 Error” — isang iOS/macOS Shortcuts action, nasira dalawang linggo bago inanunsyo ang pagre-retire. |
| Drupal — Gin Login | #3324054 | 28 Nob 2022 | “Unsplash has deprecated source.unsplash.com — this delays reCAPTCHA from loading, preventing users from logging in.” |
Basahin muli ang huling row, dahil ito ang karapat-dapat isapuso. Ang isang dekorasyong larawan katabi ng isang login form — ang pinakahalatang hindi kritikal na asset sa pahina — ay lumala patungo sa isang authentication outage, dahil ang isang mabagal na third-party request ay nasa harapan ng CAPTCHA na kailangan ng login form. Walang nagsulat nito nang ganoon. Lumitaw ito sa pagkakasunod-sunod kung paano nagloload ng mga bagay ang isang browser.
Hindi natanggap ng iyong coding assistant ang memo
Narito ang bahaging nagpapalit sa isang outage noong 2024 tungo sa problema noong 2026. Ang
source.unsplash.com ay dokumentado, na-blog, itinuro at kinopya sa loob ng humigit-kumulang walong taon. Ang lahat ng
text na iyon ay nasa training data ng mga modelong sumusulat ngayon ng ating starter code — at hindi nag-e-expire ang text. Tatlong
bilang:
| Sukatan | Halaga noong 30 Ago 2026 | Paano ito kinuha |
|---|---|---|
Mga file na naglalaman ng source.unsplash.com |
3,344 | GitHub code search API, q=source.unsplash.com (naka-index na pampublikong code lamang — isang sahig, hindi kabuuan) |
| Mga repositoryo sa isang sample na 100 file na nilikha matapos ang pagre-retire | 12 sa 77 | Parehong query, 100 resulta, na-deduplicate sa 77 repositoryo, ang created_at ihinambing sa 11 Hun 2024 |
| …at mga repositoryo sa sample na iyon na na-push sa loob ng nakaraang 12 buwan | 20 sa 77 | Mga buhay na repositoryo, hindi mga archive — kasama ang elastic/kibana, na ang demo file ay nagbabasa pa rin ng imageUrl: 'https://source.unsplash.com/64x64/?dingo' |
Buwanang mga download ng unsplash-source-es6 |
23 | API ng npm registry — isang wrapper para sa isang patay na serbisyo, huling inilathala noong 2022, ini-install pa rin |
| Mga post sa Stack Overflow na bumabanggit dito | 1,459 | Stack Exchange API, kabuuan ng /search/excerpts |
Ang pinaka-diretsong ebidensya ay wala sa application code man lang — nasa mga prompt ito. Ang top result para sa search na iyon ay isang aklatan ng mga GPT system prompt na naglalaman ng linyang “please use unsplash API( https://source.unsplash.com/1280x720/?<PUT YOUR QUERY HERE>”. Kinokopya pa rin ang tagubiling iyon sa mga bagong assistant ngayon. Hindi bineberipika ng modelo ang URL; sinabihan itong gamitin ito, at bawat halimbawang nakita nito ay sumasang-ayon.
Kaya may dalawang independiyenteng sanhi ang pagkabigo ng generated code, at hindi nagpapaayos ang isa sa isa pa: luma nang training data, at mga lumang tagubiling isinulat ng mga tao sa ibabaw nito. Sa alinmang paraan, ang sintomas ay ang parehong pamilya ng mga larawang hindi kailanman nagloload:
source.unsplash.com/random/1200x800 # 503 mula noong kalagitnaan ng 2024 — hindi na babalik
images.unsplash.com/photo-… # tunay na CDN, ngunit ang mga na-memorize na ID ay maaaring hindi umiiral
via.placeholder.com/400 # abuhing parihaba, naihatid sa production
placehold.co/800x600 # abuhing parihaba, sinasadya
picsum.photos/800/600 # tunay na larawan, walang kaugnayan sa iyong pahina
/placeholder.png # file na hindi kailanman naidagdag sa repo
Isang footnote sa ikalawang linya ng listahang iyon: habang isinusulat ito, ang via.placeholder.com
ay hindi rin nakakumpleto ng TLS handshake mula sa aming test network, at sumagot ng 403
sa plain HTTP. Suriin ito mula sa iyong sariling network bago ito pagkatiwalaan — ang fallback na tinatawag ng mga tool na ito
ay maaari ring may sariling kuwento ng outage.
Ang una lamang sa mga ito ang sira. Mas masahol ang iba sa mas banayad na paraan: nagloload ang mga ito, mukhang tapos na ang layout, at walang napapansin na ang pahina ay iginuhit ng walang partikular na bagay. At wala sa mga ito ang tiyak sa mga larawan — ito ang pangkalahatang anyo ng problema. Ang larawan ng isang modelo sa web ay isang snapshot, at ang mga endpoint, CLI flag, pangalan ng package, at libreng tier ay patuloy pa ring gumagalaw matapos magsara ang shutter.
Ang talahanayan ng migrasyon
May eksaktong tatlong destinasyon, at ang tapat na paraan para iharap ang mga ito ay sa pamamagitan ng kung ano ang isusuko mo. Piliin muna ang column, saka basahin ang iyong row.
| Lumang URL ng Source | A. Fixed na CDN URLwalang key · walang randomness | B. Unsplash APIkey · server-side na tawag | C. Sarili mong proxykey nakatago · randomness bumalik |
|---|---|---|---|
/random |
images.unsplash.com/photo-… — isang larawang pinili mo |
GET /photos/random |
/?w=1600 |
/random/1600x900 |
…?w=1600&h=900&fit=crop |
/photos/random + mga Imgix param sa ibinalik na URL |
/?w=1600&h=900&fit=crop |
/1600x900/?apple,desk |
Walang katumbas — pumili ng larawan nang manwal | /photos/random?query=apple,desk |
/?query=apple,desk&w=1600 |
/featured/1600x900?nature |
Walang katumbas | /photos/random?query=nature walang kahalili ang “featured” |
/?query=nature&w=1600 |
/collection/67920491/1600x900 |
Walang katumbas | /photos/random?collections=67920491 |
/?collections=67920491&w=1600 |
/user/scottwebb/1600x900 |
Walang katumbas | /photos/random?username=scottwebb |
/?username=scottwebb&w=1600 |
/daily |
I-pin ang isang larawan, i-rotate ito sa iyong build | Walang katumbas — i-cache ang isang random na larawan nang 24 oras nang mag-isa | Pareho, na may cache sa proxy |
Ang Option A ang aktwal na gusto ng karamihan. Kung dekorasyon lamang ang larawan — isang hero, isang side panel ng login, isang background ng card — hindi mo kailangan ng ibang larawan sa bawat request. Pumili ng isa, panatilihin ang CDN URL, at hihinto ang pahina sa pag-asa sa anumang random:
<img src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1600&h=900&fit=crop&auto=format"
width="1600" height="900" alt="…">
# Opisyal na suportadong param: w, h, crop, fit, fm, auto=format, q, dpr.
# Panatilihin ang anumang ixid parameter na ibinigay sa iyo ng API — ito ang nag-uulat ng view.
Ang Option B ang opisyal na landas, at inililipat nito ang tawag sa server-side, dahil ang isang
Client-ID sa harap-na JavaScript ay isang inilathalang kredensyal. Pansinin ang dalawang panuntunang
nakakatalisod sa mga tao: ang collections/topics ay hindi maaaring pagsamahin sa
query sa parehong request, at ang count (max 30) ay nagbabago ng anyo ng response
patungong isang array kahit na 1 lamang ito.
curl "https://api.unsplash.com/photos/random?query=nature&orientation=landscape" \
-H "Authorization: Client-ID YOUR_ACCESS_KEY" \
-H "Accept-Version: v1"
# → JSON. Nakalagay ang larawan sa .urls.regular / .urls.raw (idagdag mismo ang w/h/fit).
# → X-Ratelimit-Limit: 1000 X-Ratelimit-Remaining: 999
Option C: itayo muli ang Source, sa mga apatnapung linya
Kung ang nawala sa iyo ay talagang ang ugali — isang keyless URL na nagbabalik ng ibang larawan bawat pagkakataon,
nagagamit direkta mula sa isang <img> tag, sa isang field ng CMS, o sa isang static site
kung saan walang server — kailangan mong patakbuhin ang endpoint na iyon mismo. Isa itong maliit na worker sa
harap ng API, at ang tatlong bagay na nagpapanatili nito sa produksyon ay ang cache,
ang pagsuri sa referrer, at ang pagpasa ng natitirang bahagi ng query string patungo sa CDN.
// Cloudflare Workers. Sa ibang lugar (Deno Deploy, Val Town…) pareho ang anyo,
// ngunit magbukas ng named cache gamit ang caches.open() sa halip na caches.default.
// Nananatili sa server-side ang UNSPLASH_KEY. Hindi ito nakikita ng mga tumatawag.
const ALLOWED = ["example.com", "www.example.com"]; // mga domain mo lamang
const API_PARAMS = ["query", "collections", "topics", "username", "orientation"];
const TTL = 60; // segundo — pinoprotektahan ang kwota bawat oras
const host = (value) => { try { return new URL(value).hostname; } catch { return null; } };
export default {
async fetch(req, env, ctx) {
// 0. GET lamang: tumatanggi ang Cache API na mag-imbak ng kahit ano pa,
// at ang isang endpoint ng larawan ay walang ibang verb na sasagutin.
if (req.method !== "GET")
return new Response("Method not allowed", { status: 405 });
const url = new URL(req.url);
// 1. Ang iyong sariling mga pahina lamang ang maaaring mag-embed nito — isang pampublikong
// random-photo endpoint sa bukas na internet ay rate limit ng iba ang susunugin.
const ref = req.headers.get("referer"); // wala sa maraming lehitimong client
if (ref && !ALLOWED.includes(host(ref)))
return new Response("Forbidden", { status: 403 });
// 2. I-cache bawat kombinasyon ng parameter, kaya ang isang pahinang may 12 larawan
// ay nagkakahalaga ng isang API call bawat minuto sa halip na labindalawa bawat render.
const cache = caches.default;
const hit = await cache.match(req);
if (hit) return hit;
// 3. Hilingin sa opisyal na API ang isang random na larawan.
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",
}});
// Karaniwang ibig sabihin ng 403 dito ay ang kwota bawat oras, hindi isang masamang key — itaas ang TTL, huwag mag-panic.
if (!r.ok) return new Response("Upstream " + r.status, { status: 502 });
const photo = await r.json();
// 4. Itayo muli ang URL ng larawan: panatilihin ang ixid, idagdag ang mga param ng sukat ng tumatawag.
const img = new URL(photo.urls.raw); // dala na ng .raw ang ixid
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,
// Sumasama ang kredito sa redirect; kailangang ASCII ang halaga ng header, kaya ang pag-encode.
"X-Photo-Credit": encodeURIComponent(photo.user.name + " on Unsplash"),
"X-Photo-Link": photo.links.html,
}});
ctx.waitUntil(cache.put(req, res.clone()));
return res;
},
};
Ang paglipat ng isang URL ay isang search-and-replace na lamang, na siya mismong dahilan kung bakit karapat-dapat sa dalawampung minuto ang opsyong ito:
- https://source.unsplash.com/collection/67920491/1600x900
+ https://img.example.com/?collections=67920491&w=1600&h=900&fit=crop
Dalawang tala sa disenyo, na parehong nagkahalaga sa isang tao ng masamang hapon bago naisulat. Ang
redirect (302) sa halip na i-proxy ang mga byte ay nagpapanatili sa iyong hindi mananagot sa bandwidth
at nagpapanatili sa view na naibilang sa CDN ng Unsplash, na siyang hinihiling ng mga gabay. At
ang pagsuri sa Referer ay sadyang mapagpaubaya kapag wala ang header — marami sa mga lehitimong client
ang nag-aalis nito — habang hinahadlangan pa rin ang halatang kaso kung saan ang endpoint mo ay maaaring maging
libreng image API ng ibang tao.
Ang mga panuntunang minamana mo sa sandaling gamitin mo ang API
Ang Source ay walang mga panuntunan dahil wala itong account. May lima ang API na nagbabago kung paano mo idinidisenyo ang bagay, lahat mula sa kasalukuyang dokumentasyon:
- Ang mga rate limit ay bawat oras, at maliit sa umpisa. 50 na request/oras
sa demo mode; 1,000/oras matapos ma-approve ang iyong application para sa produksyon. Mga tawag
lamang sa
api.unsplash.comang binibilang — hindi binibilang ang mga request ng larawan saimages.unsplash.com. Basahin angX-Ratelimit-Remainingsa bawat response. - Mandatory ang hotlinking, hindi lamang pinapayagan. Kinakailangan ng Unsplash na ang mga URL ng larawan na ibinabalik ng API ay direktang naka-embed, para maiugnay ang mga view ng larawan sa photographer. Ang pag-mirror ng file sa sarili mong CDN ang isang optimisasyon na hindi mo malayang gawin.
- Panatilihin ang parameter na
ixid. Inaasahan ang pag-resize at pag-crop ng ibinalik na URL; hindi inaasahan ang pag-tanggal ng parameter na kumikilala sa iyong application. - Bahagi ng kasunduan ang attribution at download tracking — ang photographer at Unsplash ay binibigyan ng kredito, at ang isang “download” ay iniuulat sa pamamagitan ng download endpoint ng larawan kapag kinuha ng isang user ang file, na isang eventong kailangan mong triggerin mismo.
- Kailangan ng dynamic client registration ang mga distributed na produkto. Kung magpapadala ka ng plugin, isang theme o isang self-hosted na CMS, ang isang ibinabahaging key ay parehong paglabag sa polisiya at isang single point of failure; may registration flow ang API para sa eksaktong kasong iyon.
Ito ang sandali para maging tapat tungkol sa saklaw: kung magkakabit ka na rin ng API at key, ang pagpili kung aling image API ang biglang bukas, at karapat-dapat gumugol ng limang minuto rito bago mo isulat ang client. Inihambing namin ang mga libre — kwota, panuntunan, ugali ng search at anyo ng response — sa paghahambing ng mga libreng stock photo API.
Kung placeholder lamang ang gusto mo, sabihin mo
Malaking bahagi ng paggamit ng Source ay hindi kailanman tungkol sa Unsplash. Ito ay “maglagay ka ng anumang hugis-larawan habang binubuo ko ang layout”. Para diyan, may mga keyless na serbisyo pa rin at ito ang tamang sagot:
| Serbisyo | May key? | Ano ang makukuha mo | Kung saan ito humihinto |
|---|---|---|---|
| Lorem Picsum | Hindi | Tunay na mga larawan: picsum.photos/800/600, isang stable na may /id/237/… o /seed/xxx/…, kasama ang ?grayscale at ?blur=1..10. Ang endpoint nitong /v2/list ay nagbibigay-kredito sa pahina at may-akda ng bawat larawan sa Unsplash. |
Walang subject targeting man lang. Ang larawan ay hindi magkakaugnay sa iyong pahina. |
| placehold.co | Hindi | Mga naka-label na parihaba sa kahit anong sukat — matapat na filler ng wireframe. | Ito ay isang abuhing kahon, at mukhang ganoon ito sa isang screenshot na ibinahagi sa isang kliyente. |
| Openverse | Hindi | Isang bukas na lisensyadong katalogo na may pampublikong API, pinatatakbo ng WordPress.org. | Pagtutugma sa keyword, at nagkakaiba ang lisensya bawat item — kailangan mo itong basahin. |
Ang pagkakaibang mahalaga: pansamantala ang isang placeholder sa pagpapakahulugan. Kung nakaligtas ang larawan hanggang sa produksyon, hindi na ito placeholder — ito ay isang ilustrasyong walang pumili, at napapansin ito ng mambabasa.
Isang key sa halip na tatlo
Narito ang bahagi ng migrasyon na walang nagpaplano: bihirang tumigil ang mga taong umaalis sa Source sa
isang API. Ang isang pahina ay nangangailangan ng hero, dalawang section image at isang bagay para sa card grid, at
ang tapat na sagot ay karaniwang Unsplash kasama ang Pexels kasama ang Pixabay — tatlong
pagpaparehistro, tatlong scheme ng auth, tatlong anyo ng JSON, tatlong modelo ng pagination, at tatlong hanay ng
panuntunan ng attribution, lahat para punan ang parehong mga tag na <img>. Ang gawaing integrasyon na iyon
ang tunay na bayarin ng pagkawala ng isang keyless na URL, at dumarating ito ilang linggo matapos ang outage na naging sanhi nito.
Ang pagbubuo nito sa iisang integrasyon ang dahilan kung bakit ginawa namin ang Pexafy: isang solong key sa ibabaw ng 9 na libreng-lisensyang aklatan sa isang schema, na may semantic search sa antas ng pangungusap — kaya ang isang buong deskripsyon gaya ng “isang basag na screen ng telepono sa isang kahoy na desk, kinunan mula sa itaas” ay nagbabalik ng inayos na mga resulta sa halip na wala. Dalawang limitasyon, sinabi nang tuwiran, dahil ang buong artikulong ito ay tungkol sa pag-iwas sa dobleng pagkagulat: kailangan nito ng key, kaya hindi nito ibinabalik ang dating Source — nabibilang ito sa parehong kategorya ng opisyal na Unsplash API sa itaas; at nagdadala ito ng larawang libre-lisensya, hindi editorial o brand imagery.
Ang bahaging tunay na bago ay nakatuon sa mga assistant sa itaas: ang isang MCP
server sa mcp.pexafy.com/mcp ay nangangahulugang ang isang modelong dating sasabihin lamang ang isang URL ng larawan
mula sa memorya ay maaaring maghanap sa isang tunay na katalogo at magbalik ng larawang umiiral, kasama ang linya ng kredito
nakadugtong. Iyan ay mas mahusay na sagot sa mga patay na URL na sinulat ng makina kaysa sa anumang lint rule, at ang
pangangatwiran ay isinulat sa
imprastraktura ng image search para sa mga AI agent.
I-audit ang iyong ari-arian sa loob ng sampung minuto
Kahit anong ilipat mo, gawin muna ang bahaging ito — hindi mo maaayos ang mga URL na hindi mo pa nahanap. Ang Source ay isa lamang halimbawa ngayon; ang parehong tatlong hakbang ay naaangkop sa bawat external na asset na iyong ini-embed.
# 1. Lahat sa repo, kasama ang docs, tests, fixtures at README.
grep -rn --binary-files=without-match \
-e "source.unsplash.com" -e "via.placeholder.com" -e "/placeholder.png" .
# 2. Lahat ng nasa database — dito pinakamatagal nagtatago ang mga ito sa mga CMS body.
psql -c "SELECT id FROM posts WHERE body LIKE '%source.unsplash.com%'"
# 3. Lahat ng aktwal na hinihiling ng nabuong site: i-crawl ito at ilista ang mga pagkabigo.
# Itugma ang attribute, hindi ang file extension — bihirang magtapos sa .jpg ang mga URL ng larawan.
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 ← ito ang hinahanap mo
Pagkatapos, magpasya, nang isang beses lamang, kung magkano ang pinapayagan mong ipagastos ng mga external na larawan sa iyo. Apat na panuntunan na mananaig sa susunod na pagsara, kahit sino man ang sanhi nito:
- Kunin sa panahon ng build, hindi sa panahon ng request. Ang isang larawang nireresolba sa panahon ng build ay nabibigo sa CI, sa harap ng isang developer, sa halip na alas-3 ng umaga sa harap ng isang user.
- Huwag hayaang harangin ng isang dekorasyong asset ang isang kritikal na daan. Huwag mag-preload ng
anumang external sa itaas ng isang login form; bigyan ang bawat third-party na
<img>ng isangonerrorfallback at malinaw nawidth/heightpara ang isang pagkabigo ay magkahalaga ng isang blangkong kahon, hindi isang layout shift o isang natigil na script. - Idagdag ang pagsuri sa CI. Ang Hakbang 3 sa itaas, na pinatatakbo sa nabuong output mo, ay nagpapalit ng “may nakapansin sa wakas” tungo sa isang pulang build. Ito lamang ang hakbang na pumipigil sa pag-uulit.
- Baguhin sa budget ang iyong mga external na dependency gaya ng iba. Isulat kung aling mga host ang pinapayagan mong asahan ng iyong mga pahina at ano ang mangyayari kapag ang bawat isa ay bumagsak. Ang isang URL na hindi mo kailangang irehistro ay isa pa ring dependency — pinatunayan ng Source na simple lamang itong isa na walang nagmamay-ari.
Mga Sanggunian & footnote
1 Bawat status code, bilang at sinipi na linya sa artikulong ito ay
kinuha mula sa primaryang pinagmulan nito noong 30 Agosto 2026. Ang mga HTTP status code
ay kinuha gamit ang curl laban sa bawat pattern ng URL; lahat ay nagbalik ng 503 kasama ang
server: Heroku at isang body na naglalaman ng
herokucdn.com/error-pages/application-error.html. Nakumpirma ang paglutas ng DNS noon ding
araw (isang CNAME sa isang host na herokudns.com).
2 Ang parehong changelog entry ay sinipi nang buo mula sa
unsplash.com/documentation/changelog. Ang pananalita ng deprecation policy (3 linggong paunawa, header na Warning, at ang exemption para sa
mga hindi-pampublikong dokumentadong endpoint) ay mula sa unsplash.com/documentation, noon ding araw.
3 Ang pagkabigo sa TLS ay muling ginawa gamit ang
openssl s_client -connect changelog.unsplash.com:443 (tlsv1 alert internal
error). Sinundan ang redirect chain gamit ang curl -L. Kinuha ang puwang sa archive mula sa
Wayback CDX API: huling 200 na capture ng changelog.unsplash.com noong
20240324, una ng unsplash.com/documentation/changelog noong 20240823.
4 Ang mga titulo ng issue, petsa ng paglikha at pagsara ay binasa mula sa GitHub REST
API (mui/material-ui#42736, nextcloud/unsplash#115,
sindresorhus/Actions#248) at mula sa drupal.org JSON API para sa
gin_login issue 3324054, na ang body ay nag-uulat ng “I get always a Heroku application
error” noong Nobyembre 2022.
5 Mga bilang: GitHub code search API
(3,344 na file; isang sample na 100 resulta na na-deduplicate sa 77 repositoryo, kung saan 12 ang
nilikha matapos ang 11 Hunyo 2024 at 20 ang na-push sa loob ng nakaraang 12 buwan);
API ng download ng npm registry (unsplash-source-es6, 23 download sa nakaraang
30 araw); Stack Exchange /search/excerpts (1,459 post). Sinasaklaw ng code search
ang naka-index na pampublikong repositoryo lamang, kaya ang bawat bilang ay isang sahig.
Mga primaryang pinagmulan: Unsplash API changelog · Dokumentasyon ng Unsplash API · Gabay sa attribution ng Unsplash · Status ng Unsplash · MUI #42736 · Nextcloud #115 · sindresorhus/Actions #248 · Drupal Gin Login #3324054 · Lorem Picsum · Openverse · Mga dokumento ng Pexafy API & MCP.
Mga madalas na tanong
Down lang ba ang source.unsplash.com, o pinatay na ito nang permanente?
/random, /1600x900/?query, /collection/…, /daily) ay nagbabalik ng HTTP 503 kasama ang generic na Application Error page ng Heroku. Nare-resolve pa rin ang hostname, kaya lumalabas ang kabiguan bilang sirang imahe sa halip na network error.Ano ang direktang kapalit ng source.unsplash.com/random?
images.unsplash.com/photo-…?w=1600&h=900&fit=crop — ay hindi nangangailangan ng key ngunit palaging ibinabalik ang parehong larawan, na siyang aktwal na kailangan para sa karamihan ng dekoratibong gamit. Ang opisyal na API, GET https://api.unsplash.com/photos/random na may Authorization: Client-ID header, ay ibinabalik ang randomness ngunit kailangang tawagin sa server-side. Ang maliit na proxy na sariling pag-aari sa harap ng endpoint na iyon ang tanging opsyon na nagbibigay-balik ng keyless URL na maaari mong direktang ilagay sa isang <img> tag.Bakit patuloy pa ring gumagawa ang mga AI coding tools ng source.unsplash.com URLs noong 2026?
Makakakuha pa ba ako ng random na Unsplash photo nang walang API key?
/photos/random, na nangangailangan ng Client-ID. Ang dalawa mong keyless na ruta ay ang isang proxy na sarili mong ho-host, kung saan nananatili ang key sa server-side habang mukhang kagaya ng dati ang public URL, o isang third-party placeholder service tulad ng Lorem Picsum (picsum.photos/800/600), na naghahatid ng tunay na mga larawan nang walang key ngunit walang subject targeting.Pinapayagan ba ng Unsplash API na i-download at i-self-host ang mga larawan?
ixid parameter kapag nire-resize o kino-crop ang URL, kilalanin ang photographer at ang Unsplash, at i-trigger ang download endpoint ng litrato kapag kinuha ng user ang file. Ang pag-mirror ng mga file sa sarili mong CDN ang isang optimization na hindi mo malayang gawin.Bakit hindi napangalagaan ng 2021 deprecation notice ang mga umiiral nang user?
Warning header — ay aplikable lamang sa mga field at endpoint na publicly documented, at ang parehong talata ay nagsasaad na anumang hindi na-dokumento ay maaaring magbago nang walang babala. Hindi kailanman naging isang na-dokumentong endpoint ng API ang Source, kaya wala ito sa saklaw ng patakarang sana ay nagprotekta rito.Paano ko mahahanap ang bawat patay na source.unsplash.com URL sa aking proyekto?
grep -rn "source.unsplash.com" . — dahil dito pinakamatagal na nabubuhay ang mga URL na ito sa sample code. I-query ang database, dahil doon nagtatago ang mga ito sa mga article body ng CMS (WHERE body LIKE '%source.unsplash.com%'). Pagkatapos, i-crawl ang na-build mong output: kunin ang bawat image URL at hilingin ang bawat isa, ilista ang anumang hindi 200. Idagdag ang huling hakbang na ito sa CI para ang isang patay na third-party asset ay magpabigo sa build sa halip na sa isang page.