{"openapi":"3.1.0","info":{"title":"Vectali API","version":"1.0.0","description":"Convert supplied PNG/JPEG artwork into SVG. API Starter costs USD 19/month for 500 successful conversions shared with MCP. No automatic overages. Failed conversions do not consume allowance. Version 1 uses /api/v1 paths. Breaking changes require a new major version; supported versions receive at least 90 days notice before removal using Deprecation and Sunset response headers. See https://vectali.com/docs/api-lifecycle/.","termsOfService":"https://vectali.com/terms/","contact":{"url":"https://vectali.com/contact/"}},"servers":[{"url":"https://api.vectali.com"}],"externalDocs":{"url":"https://vectali.com/docs/"},"security":[{"ApiKey":[]}],"paths":{"/health":{"get":{"operationId":"health","summary":"Check service availability","description":"Public service availability probe. Does not expose account information or run a conversion.","security":[],"responses":{"200":{"description":"Service responding","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}},"required":["ok"]}}}}}}},"/api/v1/vectorize":{"post":{"operationId":"convertImage","summary":"Convert a PNG or JPEG into SVG","description":"Use for user-requested vectorization. Maximum 10 MiB and 262144 pixels (4096 per side). Requires API Starter allowance. One successful request consumes one conversion. Reuse the same Idempotency-Key and image when retrying. Processing can take up to 240 seconds. v1 permits 6 conversion attempts/minute and 60 requests/minute per account, shared with MCP. RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset report the request window; Retry-After accompanies 429. Photos and tiny details may need manual cleanup.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Recommended: unique request ID; reuse with identical bytes for retries. Omission generates a new key on every request, so clients cannot recover that attempt by retrying without a key. Different bytes with a completed key return 409 idempotency_conflict.","schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"PNG or JPEG image, up to 10 MiB."}},"required":["image"],"additionalProperties":false}}}},"responses":{"200":{"description":"Saved SVG; a committed replay returns the original result without consuming another allowance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversion"}}}},"400":{"description":"Request could not be converted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Invalid or revoked key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"API plan or allowance required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conversion in progress or idempotency conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request could not be converted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request could not be converted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request could not be converted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; wait before retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Request could not be converted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request could not be converted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing":{"get":{"operationId":"getAllowance","summary":"Read current account allowance","description":"Read remaining API conversions and subscription state. No purchases or changes. Authenticated v1 API requests share a 60/minute account limit with MCP.","responses":{"200":{"description":"Plan and remaining conversions","content":{"application/json":{"schema":{"type":"object","properties":{"apiStarter":{"type":"object","properties":{"active":{"type":"boolean"},"limit":{"type":"integer","const":500},"used":{"type":"integer"},"remaining":{"type":"integer"}}}}}}}},"401":{"description":"Authentication required"}}}},"/api/v1/files/{conversion_id}/svg":{"get":{"operationId":"getSvg","summary":"Download an owned SVG without another conversion","description":"Retrieve the saved SVG only after validating account ownership. Does not consume another conversion. Authenticated v1 API requests share a 60/minute account limit with MCP.","parameters":[{"name":"conversion_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"SVG artwork","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"401":{"description":"Authentication required"},"404":{"description":"No owned conversion found"}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"Vectali API key","description":"Create a key in https://app.vectali.com/api. Keep it in an environment variable; never include it in prompts or source control."}},"schemas":{"Conversion":{"type":"object","required":["conversion_id","svg","format","paths","processing_ms","optimized_bytes"],"properties":{"conversion_id":{"type":"string","format":"uuid"},"svg":{"type":"string"},"format":{"type":"string","const":"svg"},"paths":{"type":"integer"},"processing_ms":{"type":"integer"},"optimized_bytes":{"type":"integer"},"allowance_used_this_call":{"type":"integer","enum":[0,1],"description":"New allowance consumed by this call; zero for a completed replay."},"reused_result":{"type":"boolean","description":"Whether this call reused an existing saved conversion."}}},"Error":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}