Reference
The REST API
No key, no sign-up, no rate limit worth mentioning. CORS is open to every origin, because a free library you can only call from a server is a free library for half the people who want it.
Base URLhttps://quarry.siteko.tech
/api/v1/imagesSearch the library. With no parameters it returns the most downloaded images.
| Parameter | Type | Notes |
|---|---|---|
q | string | Keywords. Split on spaces and matched against tags and titles. Any word matching is enough to appear; images matching more words rank higher. |
category | enum | One of SPACE, ART, FOREST, WATER, MOUNTAINS, ARCHITECTURE, TRANSPORT, PEOPLE, SKY, STREET, WORKSPACE, FOOD, ANIMALS, ABSTRACT, TECHNOLOGY, TEXTURE, INTERIOR, NATURE, URBAN. Case-insensitive. |
orientation | enum | LANDSCAPE, PORTRAIT or SQUARE. |
page | integer | Defaults to 1. |
per_page | integer | 1–80. Defaults to 24. |
sort | enum | relevant, newest or popular. |
curl "https://quarry.siteko.tech/api/v1/images?q=forest+fog&per_page=2"
{
"total": 62,
"page": 1,
"perPage": 2,
"pages": 31,
"images": [
{
"id": "jw2adbb",
"title": "Fog in the forest",
"author": "Orlova Maria",
"width": 2300,
"height": 1533,
"orientation": "LANDSCAPE",
"category": "FOREST",
"tags": ["forest", "fog", "trees", "mist"],
"color": "#dfe6dc",
"downloads": 207,
"urls": {
"400": "https://quarry.siteko.tech/i/jw2adbb/400",
"800": "https://quarry.siteko.tech/i/jw2adbb/800",
"1200": "https://quarry.siteko.tech/i/jw2adbb/1200",
"1600": "https://quarry.siteko.tech/i/jw2adbb/1600",
"2400": "https://quarry.siteko.tech/i/jw2adbb/2400"
},
"sourceUrl": "https://unsplash.com/photos/7FLh300YONc"
}
]
}/api/v1/images/:idOne image, plus eight visually related ones. The related list is ranked by how many tags overlap, falling back to the same category.
curl "https://quarry.siteko.tech/api/v1/images/jw2adbb"
{ "image": { … }, "related": [ … ] }/api/v1/categoriesEvery category with a live count.
/api/v1/tagsThe most-used tags. This is the actual vocabulary of the library — the tags were written by hand while looking at each photograph, so searching with them works rather than nearly works.
| Parameter | Type | Notes |
|---|---|---|
limit | integer | 1–200. Defaults to 40. |
/i/:id/:widthThe file. Responds 302 to the CDN rather than proxying the bytes — one link on Reddit should not turn this server into a byte pump. Widths: 400, 800, 1200, 1600, 2400. Anything else is a 400 with the list.
This is also the URL that counts a download. The thumbnails on this site point straight at the CDN instead, because scrolling past an image is not downloading it.
Errors
Every error carries a stable code to branch on and a sentence a person can act on. An unknown value is rejected rather than ignored — a filter that gets silently dropped returns the whole library and looks like it worked.
curl "https://quarry.siteko.tech/api/v1/images?category=sunsets"
{
"error": {
"code": "bad_category",
"message": "Unknown category \"SUNSETS\".",
"hint": "One of: SPACE, ART, FOREST, WATER, …"
}
}Or skip the API
If the caller is a language model, the MCP server is a better fit than this. It wraps these same endpoints and returns text a model can read instead of JSON it has to parse.