{"openapi":"3.1.0","info":{"title":"Diazoma marketplace API","version":"1.0.0","description":"Signed recipe lists, recipe lookup, site validation, telemetry and recipe requests."},"servers":[{"url":"https:\/\/diazoma.app\/v1"}],"paths":{"\/lists\/{id}":{"get":{"summary":"Signed recipe list (core, adult). Header X-Diazoma-Signature: ed25519 kid=<kid> sig=<base64> over the exact body.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","enum":["core","adult"]}}],"responses":{"200":{"description":"The list","content":{"application\/json":{"schema":{"type":"object"}}}},"304":{"description":"Not modified"},"404":{"description":"Unknown list"}}}},"\/lists\/{id}.sig":{"get":{"summary":"The signature line for a list as plain text","responses":{"200":{"description":"ed25519 kid=... sig=..."}}}},"\/keys":{"get":{"summary":"Public signing keys","responses":{"200":{"description":"Keys","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/recipes":{"get":{"summary":"Search recipes","parameters":[{"name":"q","in":"query","description":"Search text","schema":{"type":"string"}},{"name":"match","in":"query","description":"Origin or URL a recipe must apply to","schema":{"type":"string"}},{"name":"tag","in":"query","description":"Tag","schema":{"type":"string"}},{"name":"status","in":"query","description":"verified or degraded","schema":{"type":"string"}},{"name":"cursor","in":"query","description":"next_cursor from the last page","schema":{"type":"string"}},{"name":"limit","in":"query","description":"1-100","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of recipes","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/recipes\/{slug}":{"get":{"summary":"One recipe with its JSON","parameters":[{"name":"version","in":"query","description":"A specific version number","schema":{"type":"string"}}],"responses":{"200":{"description":"The recipe","content":{"application\/json":{"schema":{"type":"object"}}}},"404":{"description":"Unknown"},"410":{"description":"Revoked"}}}},"\/sites\/{origin}\/level":{"get":{"summary":"Last known site-compatibility level (no network request)","responses":{"200":{"description":"Level or null","content":{"application\/json":{"schema":{"type":"object"}}}}}}},"\/validate":{"get":{"summary":"Fetch \/.well-known\/wall.json server-side and validate it","parameters":[{"name":"url","in":"query","description":"Site URL","schema":{"type":"string"}}],"responses":{"200":{"description":"Level and errors","content":{"application\/json":{"schema":{"type":"object"}}}},"422":{"description":"URL refused"}}}},"\/telemetry":{"post":{"summary":"Batched counters per recipe@version","requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","required":["recipe","pages"],"properties":{"recipe":{"type":"string","example":"commons.wikimedia.org@3"},"pages":{"type":"integer"},"zero_item_pages":{"type":"integer"},"texture_fail_pages":{"type":"integer"},"items_p50":{"type":"number"}}}}}}}}},"responses":{"202":{"description":"Accepted"}}}},"\/requests":{"post":{"summary":"Ask for a recipe","requestBody":{"content":{"application\/json":{"schema":{"type":"object","required":["origin"],"properties":{"origin":{"type":"string","format":"uri"},"note":{"type":"string","maxLength":1000}}}}}},"responses":{"201":{"description":"Received"},"429":{"description":"Too many requests"}}}}}}