{"openapi":"3.1.0","info":{"title":"weirdla","version":"1.0.0","description":"Original and rights-cleared images from weirdla.com. Every image carries the exact line you must show to republish it.","contact":{"url":"https://weirdla.com/api"}},"servers":[{"url":"https://weirdla.com/api/v1"}],"security":[{},{"apiKey":[]}],"components":{"schemas":{"Image":{"type":"object","required":["id","urls","style","source","created_at","attribution","title","tags"],"properties":{"id":{"type":"string"},"urls":{"type":"object","required":["thumb","medium","original"],"properties":{"thumb":{"type":"string","format":"uri","description":"480px wide JPEG."},"medium":{"type":"string","format":"uri","description":"1200px wide JPEG."},"original":{"type":"string","format":"uri","description":"As published, PNG or JPEG."}}},"width":{"type":"integer","nullable":true},"height":{"type":"integer","nullable":true},"ratio":{"type":"string","nullable":true},"style":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"source":{"type":"string","enum":["weirdla","upload","nasa","dpla","commons","loc","openverse","flickr","archive-org"],"description":"weirdla and upload are weirdla's own work; the rest are archives. Originals were called \"gemini\" before 2026-09-19 — that named the tool, not the origin."},"generated_at":{"type":"string","format":"date-time","nullable":true,"description":"When the image was made. Never moves."},"created_at":{"type":"string","format":"date-time","description":"Feed position. Sort key for every listing."},"attribution":{"type":"object","description":"REQUIRED FOR ANY USE. Display credit_line and link to link_back wherever the image appears. Computed per request, so it is correct for every published row and never needs caching.","required":["artist","credit_line","link_back","license","license_url"],"properties":{"artist":{"type":"string","description":"Who to name."},"artist_url":{"type":"string","format":"uri","nullable":true,"description":"Where to link the name. The style page for weirdla's own work; the archive's page otherwise."},"credit_line":{"type":"string","description":"The exact text you must display. Not a template."},"link_back":{"type":"string","format":"uri","description":"The image's page on weirdla. Every use has to link here."},"license":{"type":"string"},"license_url":{"type":"string","format":"uri"},"source_url":{"type":"string","nullable":true,"description":"Where the original lives when it is somebody else's. Null for weirdla's own work, whose page is link_back."},"required_line":{"type":"string","deprecated":true,"description":"DEPRECATED — use credit_line. Identical value, kept for clients built before 2026-09-19."},"credit":{"type":"string","nullable":true,"deprecated":true,"description":"DEPRECATED — use artist. The raw stored credit, unprocessed."}}},"title":{"type":"string","nullable":true,"description":"The source's own title, or null. Never invented."},"tags":{"type":"array","items":{"type":"string"},"description":"Tags the SOURCE supplied, and only those. Currently always empty: nothing in the pipeline stores tags yet, and weirdla will not invent them."},"subject":{"type":"string"},"score":{"type":"integer","nullable":true}}},"Style":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer","description":"Published images in this style."},"cover":{"type":"object","nullable":true,"description":"The newest image in the style.","properties":{"id":{"type":"string"},"urls":{"$ref":"#/components/schemas/Image/properties/urls"}}}}}},"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-Weirdla-Key","description":"Optional. Without one you get 60 requests a minute; with one, 600."}}},"paths":{"/images":{"get":{"summary":"List images, newest first.","parameters":[{"name":"cursor","in":"query","schema":{"type":"string"},"description":"From the previous response. Opaque."},{"name":"limit","in":"query","schema":{"type":"integer","default":30,"maximum":100}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"ISO 8601. Only images published at or after this."},{"name":"source","in":"query","schema":{"type":"string"},"description":"One source. Turns off the editorial mix and answers in pure date order."},{"name":"style","in":"query","schema":{"type":"string"},"description":"One style slug."},{"name":"tier","in":"query","schema":{"type":"string","enum":["all","top"],"default":"all"},"description":"all (default) is the whole library. top is images scoring 7 or more out of 10 on the weirdness pass. Images with no score are not top. Ignored when q is used."}],"responses":{"200":{"description":"A page of images.","headers":{"ETag":{"schema":{"type":"string"},"description":"Send back as If-None-Match for a 304."},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=60"}},"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Image"}},"cursor":{"type":"string","nullable":true,"description":"Null when there is no next page."}}}}}},"304":{"description":"Your ETag still matches."},"429":{"description":"Over the rate limit. Retry-After says when."}}}},"/images/{id}":{"get":{"summary":"One image.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The image.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Image"}}}},"404":{"description":"No published image with that id."}}}},"/styles":{"get":{"summary":"Every style, with how much is in it and a cover.","responses":{"200":{"description":"All styles.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Style"}}}}}}}}}},"/styles/{slug}/images":{"get":{"summary":"Images in one style.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"From the previous response. Opaque."},{"name":"limit","in":"query","schema":{"type":"integer","default":30,"maximum":100}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"ISO 8601. Only images published at or after this."},{"name":"source","in":"query","schema":{"type":"string"},"description":"One source. Turns off the editorial mix and answers in pure date order."},{"name":"tier","in":"query","schema":{"type":"string","enum":["all","top"],"default":"all"},"description":"all (default) is the whole library. top is images scoring 7 or more out of 10 on the weirdness pass. Images with no score are not top. Ignored when q is used."}],"responses":{"200":{"description":"A page of images.","headers":{"ETag":{"schema":{"type":"string"},"description":"Send back as If-None-Match for a 304."},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=60"}},"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Image"}},"cursor":{"type":"string","nullable":true,"description":"Null when there is no next page."}}}}}},"304":{"description":"Your ETag still matches."},"429":{"description":"Over the rate limit. Retry-After says when."}}}}}}