Skip to main content

What is the base URL of the API?

Every request goes to one host, and every path starts with /v1.
Answers are JSON, except the images, which are PNG. The whole contract is one OpenAPI 3.1 file at makeseamless.com/docs/openapi.json.

How do I authenticate a request?

A call that spends credits or reads your account carries an API key in the x-api-key header. Keys begin with smls_. The check, a job and its images, the plans and the service status need no key.
Authentication covers where to create a key and how to keep it.

What does each status code mean?

Every error carries error.code, error.message and error.retryable. Errors holds every code and a retry loop you can copy.

How do I get the result of a fix?

POST /v1/fix answers 202 with a job at once. Poll GET /v1/jobs/{job_id}, waiting the seconds in Retry-After between two calls, until status is succeeded or failed. A succeeded job has the fixed image at result.image_url. There is no callback: polling is the way to learn a job is done.

What size and format are the images?

Every image the API returns has the exact width and height of the uploaded image, after its orientation is applied, as a fresh lossless PNG that carries none of the upload’s metadata. Images are kept for 30 days.

Which limits apply to requests?

Checks are limited per client, fixes per account, and the service has a daily capacity for fixes. Each limit answers 429 with Retry-After. Rate and spend limits has the numbers.

Will the API change under my code?

The version is in the path, and v1 is current. A breaking change comes only under a new prefix, such as /v2. Fields may be added to answers within v1, so ignore the fields you do not know.

Frequently asked questions

No, when it fails with no_seamless_candidate, service_unavailable or interrupted: the credits held at the start come back.
Yes, and the second time is free. The same file with the same repeat type returns the stored result, marked cached.
Anyone with its id, without a key. Keep job ids to yourself.