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

GET/api/v1/images

Search the library. With no parameters it returns the most downloaded images.

ParameterTypeNotes
qstringKeywords. Split on spaces and matched against tags and titles. Any word matching is enough to appear; images matching more words rank higher.
categoryenumOne of SPACE, ART, FOREST, WATER, MOUNTAINS, ARCHITECTURE, TRANSPORT, PEOPLE, SKY, STREET, WORKSPACE, FOOD, ANIMALS, ABSTRACT, TECHNOLOGY, TEXTURE, INTERIOR, NATURE, URBAN. Case-insensitive.
orientationenumLANDSCAPE, PORTRAIT or SQUARE.
pageintegerDefaults to 1.
per_pageinteger1–80. Defaults to 24.
sortenumrelevant, 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"
    }
  ]
}
GET/api/v1/images/:id

One 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": [ … ] }
GET/api/v1/categories

Every category with a live count.

GET/api/v1/tags

The 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.

ParameterTypeNotes
limitinteger1–200. Defaults to 40.
GET/i/:id/:width

The 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.