{"openapi":"3.1.1","info":{"title":"Symelo AI watermark checker API","version":"1.0","description":"Checks images for Content Credentials (C2PA), IPTC AI labels, generator settings and Stable Diffusion's invisible watermark, and text for hidden characters and look-alike letters. Up to 5 files or texts per request, 10 MB each. At most 300 images an hour across all callers. No API key. Files are checked in an isolated process, never stored or logged, and deleted from memory as soon as their check ends. A result without a watermark does not mean a person made the file."},"servers":[{"url":"https://symelo.com"}],"externalDocs":{"url":"https://symelo.com/docs/ai-watermark-checker-api.md"},"paths":{"/api/v1/ai-watermarks/check":{"post":{"operationId":"checkAiWatermarks","summary":"Check images and text for AI watermarks","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"array","maxItems":5,"items":{"type":"string","format":"binary"},"description":"Repeat the field for each file (JPEG, PNG, WebP, GIF, AVIF, HEIC, TIFF or UTF-8 text), at most 10 MB each. Any field name works for files."},"text":{"type":"string","description":"Text to check. Repeat the field for several texts."},"include_cleaned_text":{"type":"string","enum":["true","false"]}}}},"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","maxItems":5,"items":{"type":"object","required":["data"],"properties":{"name":{"type":"string"},"data":{"type":"string","contentEncoding":"base64","description":"The file in base64 (a data: URL prefix is accepted)."}}}},"text":{"oneOf":[{"type":"string"},{"type":"array","maxItems":5,"items":{"type":"string"}}]},"include_cleaned_text":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"One result per file, then per text, in order. Inspect each result's kind and verdict.","content":{"application/json":{"schema":{"type":"object","required":["schema_version","results"],"properties":{"schema_version":{"const":"1.0"},"results":{"type":"array","items":{"allOf":[{"type":"object","properties":{"index":{"type":"integer"},"name":{"type":["string","null"]},"bytes":{"type":"integer"}}},{"oneOf":[{"$ref":"#/components/schemas/ImageResult"},{"$ref":"#/components/schemas/TextResult"},{"$ref":"#/components/schemas/UnsupportedResult"}]}]}},"notes":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"No input, too many items, or an unreadable body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}},"405":{"description":"Use POST","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}},"408":{"description":"The upload took too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}},"413":{"description":"A file is larger than 10 MB, or the body is too large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}},"415":{"description":"Send multipart/form-data or application/json","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}},"422":{"description":"Invalid JSON fields or base64, or files that could not be checked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}},"429":{"description":"Too many requests (rate_limited) or the 300 images an hour are used up (image_limit); wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}},"headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}}},"503":{"description":"Busy or disabled; wait for Retry-After seconds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}},"headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}}},"504":{"description":"The check took too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkError"}}}}}}}},"components":{"schemas":{"WatermarkSignal":{"type":"object","required":["check","strength","verdict","summary"],"properties":{"check":{"enum":["c2pa","iptc","generator","invisible_watermark","software"]},"strength":{"enum":["strong","medium","weak"],"description":"strong: signed Content Credentials, generator settings or a decoded pixel watermark; medium: unsigned labels; weak: names and hints."},"verdict":{"enum":["ai_generated","ai_edited","ai_hints","credentials"]},"summary":{"type":"string"}}},"C2paManifest":{"type":"object","properties":{"label":{"type":"string"},"active":{"type":"boolean","description":"The newest manifest, which describes the file as it is."},"claim_generator":{"type":["string","null"]},"title":{"type":["string","null"]},"format":{"type":["string","null"]},"actions":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"digital_source_type":{"type":["string","null"]},"software_agent":{"type":["string","null"]},"when":{"type":["string","null"]},"description":{"type":["string","null"]}}}},"ai_source_types":{"type":"array","items":{"type":"string"},"description":"IPTC digital source types in this manifest that indicate AI or algorithmic media."},"ingredients":{"type":"array","items":{"type":"object","properties":{"title":{"type":["string","null"]},"relationship":{"type":["string","null"]}}}},"assertions":{"type":"array","items":{"type":"string"}},"signer":{"type":["object","null"],"properties":{"common_name":{"type":["string","null"]},"organization":{"type":["string","null"]},"issuer_common_name":{"type":["string","null"]},"issuer_organization":{"type":["string","null"]},"valid_from":{"type":["string","null"]},"valid_to":{"type":["string","null"]}}},"signature_algorithm":{"type":["string","null"]},"signature":{"enum":["valid","invalid","unverified"],"description":"valid: the claim matches its COSE signature made with the certificate in the file. The certificate is not checked against the C2PA trust list."},"signature_note":{"type":["string","null"]}}},"ImageResult":{"type":"object","required":["kind","verdict","headline","signals"],"properties":{"kind":{"const":"image"},"format":{"enum":["jpeg","png","webp","gif","avif","heic","tiff"]},"mime":{"type":"string"},"width":{"type":["integer","null"]},"height":{"type":["integer","null"]},"verdict":{"enum":["ai_generated","ai_edited","ai_hints","credentials","none"],"description":"The strongest signal. none means no watermark was found, not that a person made the image."},"headline":{"type":"string"},"signals":{"type":"array","items":{"$ref":"#/components/schemas/WatermarkSignal"}},"c2pa":{"type":"object","properties":{"found":{"type":"boolean"},"manifests":{"type":"array","items":{"$ref":"#/components/schemas/C2paManifest"}},"content_hash":{"enum":["match","mismatch","not_checked"],"description":"Whether the image bytes still match the active manifest's data hash (JPEG, PNG, WebP, GIF, TIFF)."},"remote_manifest_url":{"type":["string","null"]},"error":{"type":["string","null"]}}},"iptc":{"type":"object","properties":{"found":{"type":"boolean"},"digital_source_types":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"},"ai":{"type":"boolean"},"source":{"type":"string"}}}},"ai_system":{"type":["string","null"]},"ai_prompt":{"type":["string","null"]}}},"generator":{"type":"object","properties":{"found":{"type":"boolean"},"tool":{"type":["string","null"]},"source":{"type":["string","null"]},"prompt":{"type":["string","null"]},"negative_prompt":{"type":["string","null"]},"model":{"type":["string","null"]},"seed":{"type":["string","null"]},"settings":{"type":"object","additionalProperties":{"type":"string"}}}},"invisible_watermark":{"type":"object","properties":{"status":{"enum":["detected","not_detected","not_checked"]},"note":{"type":["string","null"]},"candidates":{"type":"array","items":{"type":"object","properties":{"id":{"enum":["sdxl","sd1","sd2"]},"name":{"type":"string"},"matched_bits":{"type":"integer"},"total_bits":{"type":"integer"},"detected":{"type":"boolean"}}}}}},"software":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":"string"},"tool":{"type":"string"}}}},"camera":{"type":["string","null"]},"metadata":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}}},"errors":{"type":"array","items":{"type":"string"}}}},"TextResult":{"type":"object","required":["kind","verdict","headline","categories"],"properties":{"kind":{"const":"text"},"characters":{"type":"integer"},"lines":{"type":"integer"},"verdict":{"enum":["hidden_characters","unusual_characters","clean"]},"headline":{"type":"string"},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"enum":["invisible","tags","variation_selectors","bidi","control","private_use","homoglyphs","spaces","separators","soft_hyphen","bom","styled"]},"label":{"type":"string"},"severity":{"enum":["high","medium","low"]},"count":{"type":"integer"},"characters":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","examples":["U+200B"]},"name":{"type":"string"},"count":{"type":"integer"}}}}}}},"hidden_messages":{"type":"array","items":{"type":"object","properties":{"method":{"enum":["unicode_tags","variation_selectors","zero_width_binary"]},"text":{"type":"string"},"offset":{"type":"integer","description":"UTF-16 offset in the text."}}}},"homoglyph_words":{"type":"array","items":{"type":"object","properties":{"word":{"type":"string"},"offset":{"type":"integer"}}}},"removable":{"type":"integer","description":"Characters (and mixed-alphabet words) the cleaned text changes."},"notes":{"type":"array","items":{"type":"string"}},"cleaned_text":{"type":"string","description":"Only with include_cleaned_text: the text without hidden characters, with normal spaces and look-alike letters replaced."}}},"UnsupportedResult":{"type":"object","required":["kind","message"],"properties":{"kind":{"const":"unsupported"},"format":{"type":"string"},"message":{"type":"string"}}},"WatermarkError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}