Open Source Projects — entry 002 of 8
Creative Commons Catalog
Creative Commons's search catalog was handed off to WordPress.org and relaunched as Openverse; the old `api.creativecommons.engineering` host now 301-redirects to the current `api.openverse.org`. A live unauthenticated GET against `api.openverse.org/v1/images/` returned a 200 JSON result set with `Access-Control-Allow-Origin: *`, confirming keyless anonymous search still works today (rate-limited to 200 requests/day per IP), with an optional `/v1/auth_tokens/register/` OAuth2 client-registration endpoint (confirmed live, returning a 400 validation error rather than 404) for higher limits. The catalog itself and every indexed work are free to use under their respective open licenses.
Openverse (the relaunched Creative Commons Catalog) exposes openly-licensed media search over a plain REST/JSON API. A live GET to `/images/?q=bicycle&page_size=1` returned a 200 JSON body with `result_count`, `page_count`, `page_size`, `page`, and a `results` array of full media records (license, creator, attribution text, thumbnail/detail/related URLs), and `access-control-allow-origin: *` confirmed anonymous cross-origin access — both reconfirmed by this run's own probe.
GreatAPIs Score
Auth quickstart
- No API key or signup required for anonymous search — every probe in this file returned real results with no auth header sent at all, subject to the anonymous rate limits below.
- Anonymous requests are rate-limited (see the `rateLimit` gotcha below); registering an OAuth2 application at `/v1/auth_tokens/register/` gets a higher, per-application limit instead of the shared anonymous one — that endpoint live-returns a 400 validation error (not 404) when called without the required fields, confirming it's a real, reachable route rather than documentation-only.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Search images for "bicycle"
GEThttps://api.openverse.org/v1/images/?q=bicycle&page_size=1
{"result_count":240,"page_count":240,"page_size":1,"page":1,"results":[{"id":"e58c9c13-572f-4288-baf8-4aa3331a3130","title":"Bicycle","indexed_on":"2020-05-07T17:37:27.614432Z","foreign_landing_url":"https://www.flickr.com/photos/31153174@N00/44791182","url":"https://live.staticflickr.com/27/44791182_825d309178_b.jpg","creator":"orangebrompton","creator_url":"https://www.flickr.com/photos/31153174@N00","license":"by-nc-sa","license_version":"2.0","license_url":"https://creativecommons.org/licenses/by-nc-sa/2.0/","provider":"flickr","source":"flickr","category":null,"filesize":null,"filetype":null,"tags":[{"name":"bicycle","accuracy":null,"unstable__provider":"flickr"}],"attribution":"\"Bicycle\" by orangebrompton is licensed under CC BY-NC-SA 2.0. To view a copy of this license, visit https://creativecommons.org/licenses/by-nc-sa/2.0/.","fields_matched":["description","title","tags.name"],"mature":false,"height":768,"width":1024,"thumbnail":"https://api.openverse.org/v1/images/e58c9c13-572f-4288-baf8-4aa3331a3130/thumb/","detail_url":"https://api.openverse.org/v1/images/e58c9c13-572f-4288-baf8-4aa3331a3130/","related_url":"https://api.openverse.org/v1/images/e58c9c13-572f-4288-baf8-4aa3331a3130/related/","unstable__sensitivity":[]}]}Captured byte-for-byte from this run's live probe. `result_count`/`page_count` and which specific work sorts first for a given query can both change over time as Openverse's underlying index grows — the envelope shape and field names are what's stable.
Developer reference
https://api.openverse.org/v120 requests/min burst + 200 requests/day sustained for anonymous requests, confirmed live via the x-ratelimit-limit-anon_burst / x-ratelimit-limit-anon_sustained response headers
Gotchas & limits
- Omitting the trailing slash on the collection path triggers a redirect, not a direct 200: a live GET to `/v1/images?q=bicycle&page_size=1` (no trailing slash) returned HTTP 301 with `location: /v1/images/?page_size=1&q=bicycle` — note the query params are also reordered in the Location header — so a client that doesn't follow redirects gets nothing back.
- An out-of-range `page_size` fails with HTTP 401, not 400: a live GET to `/v1/images/?q=bicycle&page_size=999` returned `HTTP 401 Unauthorized` with body `{"detail":"page_size may not exceed 20 for anonymous requests"}` and a `www-authenticate: Bearer realm="api"` header — a genuinely surprising status code for what is really a parameter-validation error, not an auth failure.
- An unknown image id 404s with a JSON error envelope: a live GET to `/v1/images/00000000-0000-0000-0000-000000000000/` returned `HTTP 404` with body `{"detail":"No Image matches the given query."}`.
- The rate limit is live-measurable from response headers on every call: this run's probes consistently returned `x-ratelimit-limit-anon_burst: 20/min` and `x-ratelimit-limit-anon_sustained: 200/day`, plus decrementing `x-ratelimit-available-anon_burst`/`x-ratelimit-available-anon_sustained` counters — read those before assuming a request budget.