{"openapi":"3.1.0","info":{"title":"IsThisImage Developer API","version":"1.0.0","description":"One-time Developer purchase unlocks lifetime API access. Each successful detection uses one paid credit. Credits never expire. Any confirmed refund removes access from that purchase."},"servers":[{"url":"https://isthisimageai.org"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}}},"paths":{"/api/v1/detect":{"post":{"operationId":"detectImage","summary":"Check one image for AI-generation signals","description":"10 POST/minute, 2 concurrent checks per account. Replay successful requests using the same UUID and image; no extra charge. Processing returns 409; failed requests need a new UUID. No remote URLs, batch, video or callbacks.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["image"],"properties":{"image":{"type":"string","format":"binary","description":"JPEG, PNG or WebP; maximum 10 MiB and 40 megapixels."}}}}}},"responses":{"200":{"description":"Durably stored result; replays do not charge again.","content":{"application/json":{"schema":{"type":"object","required":["ok","request_id","result","credits_charged","remaining_credits"],"properties":{"ok":{"const":true},"request_id":{"type":"string","format":"uuid"},"credits_charged":{"const":1,"description":"Total charge for this logical request, including replay."},"remaining_credits":{"type":"integer","minimum":0},"result":{"type":"object","required":["score","verdict"],"properties":{"score":{"type":"number","minimum":0,"maximum":1},"verdict":{"type":"string","enum":["likely_ai","uncertain","low_ai_signal"]}}}}}}}},"400":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"401":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"402":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"403":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"409":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"413":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"415":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"429":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"500":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"503":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"504":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}}}}},"/api/v1/usage":{"get":{"operationId":"getUsage","summary":"Read paid credits and successful API checks","description":"60 GET/minute per account. Returns 200 even with zero credits while API access remains valid.","responses":{"200":{"description":"Current usage","content":{"application/json":{"schema":{"type":"object","required":["api_access","credits_remaining","credits_never_expire","checks_per_credit","api_uses_total"],"properties":{"api_access":{"const":true},"credits_remaining":{"type":"integer","minimum":0},"credits_never_expire":{"const":true},"checks_per_credit":{"const":1},"api_uses_total":{"type":"integer","minimum":0}}}}}},"401":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"403":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"429":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"500":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"503":{"description":"API error. For 429, respect Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds before retry (429)."}},"content":{"application/json":{"schema":{"type":"object","required":["ok","code","request_id"],"properties":{"ok":{"const":false},"code":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}}}}}}}