{"openapi":"3.1.0","info":{"title":"VecSnap API","version":"1.0.0","description":"Raster images redrawn as editable SVG. A conversion is ASYNCHRONOUS: the engine takes seconds for most images and minutes for a few, so create one, then watch it over its event stream or read it again (its URL is a permalink). Converting is free; 1 credit unlocks an image, every format of it and every re-run included. Every answer carries `X-Request-Id`, and every error `{ error: { code, message, requestId } }`: branch on `code`, show or log `message`, quote `requestId` to support. Any authenticated call answers 503 `auth_unavailable` when the auth server could not be asked: retry it, it is never a sign-out. A GUEST (someone trying without an account) may call only the operations marked `x-guest-allowed`; every other answers it 403 `account_required`. With an API key, every answer carries `RateLimit-Policy` and `RateLimit` (requests a minute for the key's mode, all your keys of that mode together, and what is left); past it, 429 `rate_limited` with `Retry-After`. When a conversion ends, every webhook endpoint of its mode that wants the event receives it, signed (`webhooks`)."},"servers":[{"url":"https://api.vecsnap.com/v1","description":"The VecSnap API"},{"url":"/api/v1","description":"This deployment's own path (the web app's)"}],"tags":[{"name":"Vectorize"},{"name":"Uploads"},{"name":"Conversions"},{"name":"Results"},{"name":"Colors"},{"name":"Images"},{"name":"API keys"},{"name":"Webhooks"},{"name":"Account"},{"name":"Billing"},{"name":"Session"},{"name":"Operator"}],"security":[{"bearer":[]},{"cookie":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"A signed-in session's access token (an integration's OAuth token takes the same road)."},"cookie":{"type":"apiKey","in":"cookie","name":"sb-access-token","description":"Browser sessions."},"cronSecret":{"type":"http","scheme":"bearer","description":"Our schedules' secret (`CRON_SECRET`): Vercel Cron, or the operator by hand."},"operatorSecret":{"type":"http","scheme":"bearer","description":"The operator's secret (`VECSNAP_OPERATOR_SECRET`), a power of its own."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"What happened, as a stable code: branch on it. Every code is listed in the reference's Errors page."},"message":{"type":"string","description":"One sentence for a person. It may change: never parse it."},"requestId":{"description":"This request's id, also in the `X-Request-Id` header: quote it to support.","type":"string"}},"required":["code","message"]}},"required":["error"],"description":"Every refusal and failure. Branch on `error.code`; show or log `error.message`."},"Format":{"type":"object","properties":{"id":{"type":"string","description":"Its name in `GET …/download?format=<id>`: `web`, `design`, `web-transparent`…"},"profile":{"type":"string","enum":["web","design"],"description":"Who it is for: `web` (code, small) or `design` (named layers for an editor)."},"background":{"anyOf":[{"type":"string","enum":["kept","dropped"]},{"type":"null"}],"description":"Whether the image's ground is `kept` or `dropped`; null when none was found."},"currentColor":{"type":"boolean","description":"A one-ink web file painted `currentColor`, so it follows the text color around it."},"editableText":{"type":"boolean","description":"A design file whose recognized words are editable `<text>` (id `<file>-text`). An editor shows them as type only when their font is installed; the file without it keeps them as outlines."},"bytes":{"type":"integer","minimum":0,"description":"The file's size in bytes."},"default":{"type":"boolean","description":"The profile's file, as the engine decided it. Exactly one per profile."}},"required":["id","profile","background","currentColor","editableText","bytes","default"],"description":"A file a completed conversion offers."},"Failure":{"type":"object","properties":{"code":{"type":"string","description":"Why it ended, an OPEN set (today image_unreadable, image_too_large, out_of_memory, timed_out, engine_updating, input_missing, storage_error, engine_error, not_started, no_result, account_deleted): show `message` for a code you do not know."},"message":{"type":"string","description":"One plain sentence, which says the credit came back when one was held."},"reference":{"type":"string","pattern":"^VS-[0-9A-F]{12}$","description":"What to quote to support."}},"required":["code","message","reference"],"description":"Why a failed or expired conversion ended."},"ConversionOptions":{"type":"object","properties":{"maxColors":{"description":"Redraw with at most this many colors, the ground included (2 to 24).","type":"integer","minimum":2,"maximum":24,"x-error-code":"invalid_options"}},"x-error-code":"invalid_options","description":"Optional choices about this image beside its preset. `{}` for none. Two conversions share a cached result only with the same options. Not offered yet: `merge` (a redraw that merges two colors is not offered yet; merge them in the Colors tab, or ask for fewer colors)."},"ConversionResult":{"type":"object","properties":{"anchorPoints":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"The anchor points of the web file, counted as Illustrator and Figma count them (a circle is 4; curve handles are not anchor points). Null for a result made before it was recorded."},"fileSize":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"The default web file's size in bytes. Null when the result has no files."},"formats":{"type":"array","items":{"$ref":"#/components/schemas/Format"},"description":"Every file it offers. Empty for a result made before files were kept: convert it again."}},"required":["anchorPoints","fileSize","formats"],"description":"What a completed conversion made, with the figures your code can check."},"Conversion":{"type":"object","properties":{"object":{"type":"string","const":"conversion"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"livemode":{"type":"boolean","description":"False for a test key's conversion, which ran on a sample and spent nothing."},"status":{"type":"string","enum":["waiting","queued","processing","completed","failed","expired","canceled"],"description":"`waiting` (in line behind your running ones), `queued`, `processing`, then `completed`, `failed`, `expired` (it outlived its time and was ended), or `canceled` (stopped while waiting)."},"phase":{"description":"What a running conversion is doing now: the latest phase it reported, in order prepare, segment, paint, trace, fit, text, shapes, finish, compare (`compare`: a second version is drawn to compare). An OPEN set: show your own words for the ones you know. Never a percentage: nobody can say how long is left.","type":["string","null"]},"preset":{"type":"string","description":"The preset it was made with."},"options":{"$ref":"#/components/schemas/ConversionOptions"},"imageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}],"description":"Its image in the library: every conversion of the same bytes is a version of one image."},"filename":{"description":"The uploaded file's name, cleaned: the files download as `<filename>.svg` (`<filename>-<format>.svg` for every other format). Null if none was sent.","type":["string","null"]},"inputFormat":{"description":"The format the uploaded bytes proved to be (png, jpeg, webp, avif, gif, bmp, tiff, an OPEN set). Every conversion of one image is the same bytes, so one format. Null only for an upload the API did not mint.","type":["string","null"]},"unlocked":{"type":"boolean","description":"Whether its image is unlocked (1 credit, once per image): every format downloads, and every re-run of it is free. Derived from the ledger on every read."},"allowance":{"type":"string","enum":["credit","own","shared"],"description":"What it drew on: `credit` (it holds a credit to unlock its image), `own` or `shared` (a free conversion, counted by the daily caps)."},"engineVersion":{"type":"string","description":"The engine that made it. A newer one may redraw the image better: convert it again to see."},"result":{"anyOf":[{"$ref":"#/components/schemas/ConversionResult"},{"type":"null"}],"description":"Set once it is `completed`; null before, and on every other ending."},"failure":{"anyOf":[{"$ref":"#/components/schemas/Failure"},{"type":"null"}],"description":"Set on `failed` and `expired`; null otherwise."},"inputDeletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the uploaded file was deleted, or null while it is kept: at least 7 full UTC days, then swept. Results never are."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["object","id","livemode","status","phase","preset","options","imageId","filename","inputFormat","unlocked","allowance","engineVersion","result","failure","inputDeletedAt","createdAt","updatedAt"],"description":"A conversion: one image redrawn as SVG, and where it stands."},"CreatedConversion":{"type":"object","properties":{"object":{"type":"string","const":"conversion"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"livemode":{"type":"boolean","description":"False for a test key's conversion, which ran on a sample and spent nothing."},"status":{"type":"string","enum":["waiting","queued","processing","completed","failed","expired","canceled"],"description":"`waiting` (in line behind your running ones), `queued`, `processing`, then `completed`, `failed`, `expired` (it outlived its time and was ended), or `canceled` (stopped while waiting)."},"phase":{"description":"What a running conversion is doing now: the latest phase it reported, in order prepare, segment, paint, trace, fit, text, shapes, finish, compare (`compare`: a second version is drawn to compare). An OPEN set: show your own words for the ones you know. Never a percentage: nobody can say how long is left.","type":["string","null"]},"preset":{"type":"string","description":"The preset it was made with."},"options":{"$ref":"#/components/schemas/ConversionOptions"},"imageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}],"description":"Its image in the library: every conversion of the same bytes is a version of one image."},"filename":{"description":"The uploaded file's name, cleaned: the files download as `<filename>.svg` (`<filename>-<format>.svg` for every other format). Null if none was sent.","type":["string","null"]},"inputFormat":{"description":"The format the uploaded bytes proved to be (png, jpeg, webp, avif, gif, bmp, tiff, an OPEN set). Every conversion of one image is the same bytes, so one format. Null only for an upload the API did not mint.","type":["string","null"]},"unlocked":{"type":"boolean","description":"Whether its image is unlocked (1 credit, once per image): every format downloads, and every re-run of it is free. Derived from the ledger on every read."},"allowance":{"type":"string","enum":["credit","own","shared"],"description":"What it drew on: `credit` (it holds a credit to unlock its image), `own` or `shared` (a free conversion, counted by the daily caps)."},"engineVersion":{"type":"string","description":"The engine that made it. A newer one may redraw the image better: convert it again to see."},"result":{"anyOf":[{"$ref":"#/components/schemas/ConversionResult"},{"type":"null"}],"description":"Set once it is `completed`; null before, and on every other ending."},"failure":{"anyOf":[{"$ref":"#/components/schemas/Failure"},{"type":"null"}],"description":"Set on `failed` and `expired`; null otherwise."},"inputDeletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the uploaded file was deleted, or null while it is kept: at least 7 full UTC days, then swept. Results never are."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"cacheHit":{"type":"boolean","description":"True when the result came from the content cache: the same bytes, preset, options and engine were converted before, so it is `completed` already and spent no compute. Say so (\"redrawn before\"), so an instant result never looks like the same action billed twice."}},"required":["object","id","livemode","status","phase","preset","options","imageId","filename","inputFormat","unlocked","allowance","engineVersion","result","failure","inputDeletedAt","createdAt","updatedAt","cacheHit"],"description":"A conversion just created (201), or the one its `idempotencyKey` already made (200)."},"Vectorized":{"type":"object","properties":{"object":{"type":"string","const":"conversion"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"livemode":{"type":"boolean","description":"False for a test key's conversion, which ran on a sample and spent nothing."},"status":{"type":"string","enum":["waiting","queued","processing","completed","failed","expired","canceled"],"description":"`waiting` (in line behind your running ones), `queued`, `processing`, then `completed`, `failed`, `expired` (it outlived its time and was ended), or `canceled` (stopped while waiting)."},"phase":{"description":"What a running conversion is doing now: the latest phase it reported, in order prepare, segment, paint, trace, fit, text, shapes, finish, compare (`compare`: a second version is drawn to compare). An OPEN set: show your own words for the ones you know. Never a percentage: nobody can say how long is left.","type":["string","null"]},"preset":{"type":"string","description":"The preset it was made with."},"options":{"$ref":"#/components/schemas/ConversionOptions"},"imageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}],"description":"Its image in the library: every conversion of the same bytes is a version of one image."},"filename":{"description":"The uploaded file's name, cleaned: the files download as `<filename>.svg` (`<filename>-<format>.svg` for every other format). Null if none was sent.","type":["string","null"]},"inputFormat":{"description":"The format the uploaded bytes proved to be (png, jpeg, webp, avif, gif, bmp, tiff, an OPEN set). Every conversion of one image is the same bytes, so one format. Null only for an upload the API did not mint.","type":["string","null"]},"unlocked":{"type":"boolean","description":"Whether its image is unlocked (1 credit, once per image): every format downloads, and every re-run of it is free. Derived from the ledger on every read."},"allowance":{"type":"string","enum":["credit","own","shared"],"description":"What it drew on: `credit` (it holds a credit to unlock its image), `own` or `shared` (a free conversion, counted by the daily caps)."},"engineVersion":{"type":"string","description":"The engine that made it. A newer one may redraw the image better: convert it again to see."},"result":{"anyOf":[{"$ref":"#/components/schemas/ConversionResult"},{"type":"null"}],"description":"Set once it is `completed`; null before, and on every other ending."},"failure":{"anyOf":[{"$ref":"#/components/schemas/Failure"},{"type":"null"}],"description":"Set on `failed` and `expired`; null otherwise."},"inputDeletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the uploaded file was deleted, or null while it is kept: at least 7 full UTC days, then swept. Results never are."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"files":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","format":"uri"},"description":"Each SVG file of the result, by format id (`web` is the default web file): a link to download it, valid until `filesExpireAt`. Empty when the conversion ended without a result. Ask for a fresh link any time with GET /conversions/{id}/download."},"filesExpireAt":{"type":"string","format":"date-time","description":"When the links in `files` stop working (minutes from now)."}},"required":["object","id","livemode","status","phase","preset","options","imageId","filename","inputFormat","unlocked","allowance","engineVersion","result","failure","inputDeletedAt","createdAt","updatedAt","files","filesExpireAt"],"description":"A conversion that ended within its `wait`: what it made, its figures, and its files as links."},"ConversionEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"status":{"type":"string","enum":["waiting","queued","processing","completed","failed","expired","canceled"],"description":"`waiting` (in line behind your running ones), `queued`, `processing`, then `completed`, `failed`, `expired` (it outlived its time and was ended), or `canceled` (stopped while waiting)."},"phase":{"description":"What a running conversion is doing now: the latest phase it reported, in order prepare, segment, paint, trace, fit, text, shapes, finish, compare (`compare`: a second version is drawn to compare). An OPEN set: show your own words for the ones you know. Never a percentage: nobody can say how long is left.","type":["string","null"]},"unlocked":{"description":"Only with an ending status, the one moment it can change on this stream.","type":"boolean"},"result":{"anyOf":[{"$ref":"#/components/schemas/ConversionResult"},{"type":"null"}],"description":"Set once it is `completed`; null before, and on every other ending."},"failure":{"anyOf":[{"$ref":"#/components/schemas/Failure"},{"type":"null"}],"description":"Set on `failed` and `expired`; null otherwise."}},"required":["id","status","phase","result","failure"],"description":"The data of one `status` event of GET /conversions/{id}/events."},"Link":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Served from the storage domain; valid for `expiresIn` seconds."},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid. Ask again for a fresh one."}},"required":["url","expiresIn"],"description":"A short-lived URL."},"Picture":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"The same URL for an hour: a browser's cache holds it."},"expiresIn":{"type":"integer","minimum":0,"description":"Seconds left of the URL's life."},"of":{"type":"string","enum":["result","upload"],"description":"What it shows: the drawing (`result`), or the upload a version is made from (`upload`)."}},"required":["url","expiresIn","of"],"description":"A picture of an image, signed for the hour."},"Image":{"type":"object","properties":{"object":{"type":"string","const":"image"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"name":{"description":"The person's name for it (PATCH), else its latest version's file name; null when it has neither.","type":["string","null"]},"renamed":{"type":"boolean","description":"Whether `name` is the person's own."},"createdAt":{"type":"string","format":"date-time","description":"Its first conversion."},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When it went to Recently deleted; null in the library. Restorable for 30 days."},"erasedAfter":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When an image in Recently deleted is erased for good; null in the library."},"lastConvertedAt":{"type":"string","format":"date-time","description":"Its latest conversion: what the library sorts by."},"state":{"type":"string","enum":["converting","ready","failed"],"description":"Its LATEST version's: `converting` (waiting, queued, processing), `ready` (completed), `failed` (failed, expired)."},"versions":{"type":"integer","minimum":1,"description":"How many versions (conversions) it has."},"unlocked":{"type":"boolean","description":"Every format of every version downloads; every re-run is free."},"latest":{"description":"Its latest version. Every version is the same bytes: `latest.inputFormat` is the image's format.","$ref":"#/components/schemas/Conversion"},"picture":{"anyOf":[{"$ref":"#/components/schemas/Picture"},{"type":"null"}],"description":"Its tile's picture: the latest result's preview (`result`), else the upload a version is made from while it is kept (`upload`), else null."},"original":{"anyOf":[{"$ref":"#/components/schemas/Picture"},{"type":"null"}],"description":"Beside a drawn picture, the original it was drawn from (kept with that result); null when `picture` is the upload itself, or there is none. Not checked in the store: a result older than kept originals has none, and its URL fails."},"newerEngine":{"type":"boolean","description":"Its latest version was made by an older engine than today's: converting it again shows the improvement."}},"required":["object","id","name","renamed","createdAt","deletedAt","erasedAfter","lastConvertedAt","state","versions","unlocked","latest","picture","original","newerEngine"],"description":"An image: its exact bytes in this account, the unit a credit unlocks. Its conversions are its versions; the library lists one entry per image."},"ImageVersion":{"type":"object","properties":{"object":{"type":"string","const":"conversion"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"livemode":{"type":"boolean","description":"False for a test key's conversion, which ran on a sample and spent nothing."},"status":{"type":"string","enum":["waiting","queued","processing","completed","failed","expired","canceled"],"description":"`waiting` (in line behind your running ones), `queued`, `processing`, then `completed`, `failed`, `expired` (it outlived its time and was ended), or `canceled` (stopped while waiting)."},"phase":{"description":"What a running conversion is doing now: the latest phase it reported, in order prepare, segment, paint, trace, fit, text, shapes, finish, compare (`compare`: a second version is drawn to compare). An OPEN set: show your own words for the ones you know. Never a percentage: nobody can say how long is left.","type":["string","null"]},"preset":{"type":"string","description":"The preset it was made with."},"options":{"$ref":"#/components/schemas/ConversionOptions"},"imageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}],"description":"Its image in the library: every conversion of the same bytes is a version of one image."},"filename":{"description":"The uploaded file's name, cleaned: the files download as `<filename>.svg` (`<filename>-<format>.svg` for every other format). Null if none was sent.","type":["string","null"]},"inputFormat":{"description":"The format the uploaded bytes proved to be (png, jpeg, webp, avif, gif, bmp, tiff, an OPEN set). Every conversion of one image is the same bytes, so one format. Null only for an upload the API did not mint.","type":["string","null"]},"unlocked":{"type":"boolean","description":"Whether its image is unlocked (1 credit, once per image): every format downloads, and every re-run of it is free. Derived from the ledger on every read."},"allowance":{"type":"string","enum":["credit","own","shared"],"description":"What it drew on: `credit` (it holds a credit to unlock its image), `own` or `shared` (a free conversion, counted by the daily caps)."},"engineVersion":{"type":"string","description":"The engine that made it. A newer one may redraw the image better: convert it again to see."},"result":{"anyOf":[{"$ref":"#/components/schemas/ConversionResult"},{"type":"null"}],"description":"Set once it is `completed`; null before, and on every other ending."},"failure":{"anyOf":[{"$ref":"#/components/schemas/Failure"},{"type":"null"}],"description":"Set on `failed` and `expired`; null otherwise."},"inputDeletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the uploaded file was deleted, or null while it is kept: at least 7 full UTC days, then swept. Results never are."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"picture":{"anyOf":[{"$ref":"#/components/schemas/Picture"},{"type":"null"}],"description":"This version's own picture: its result's preview, else its upload while kept, else null."}},"required":["object","id","livemode","status","phase","preset","options","imageId","filename","inputFormat","unlocked","allowance","engineVersion","result","failure","inputDeletedAt","createdAt","updatedAt","picture"],"description":"One version of an opened image: the conversion, and its own picture."},"ImageDetail":{"type":"object","properties":{"object":{"type":"string","const":"image"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"name":{"description":"The person's name for it (PATCH), else its latest version's file name; null when it has neither.","type":["string","null"]},"renamed":{"type":"boolean","description":"Whether `name` is the person's own."},"createdAt":{"type":"string","format":"date-time","description":"Its first conversion."},"deletedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When it went to Recently deleted; null in the library. Restorable for 30 days."},"erasedAfter":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When an image in Recently deleted is erased for good; null in the library."},"lastConvertedAt":{"type":"string","format":"date-time","description":"Its latest conversion: what the library sorts by."},"state":{"type":"string","enum":["converting","ready","failed"],"description":"Its LATEST version's: `converting` (waiting, queued, processing), `ready` (completed), `failed` (failed, expired)."},"versions":{"type":"integer","minimum":1,"description":"How many versions (conversions) it has."},"unlocked":{"type":"boolean","description":"Every format of every version downloads; every re-run is free."},"latest":{"description":"Its latest version. Every version is the same bytes: `latest.inputFormat` is the image's format.","$ref":"#/components/schemas/Conversion"},"picture":{"anyOf":[{"$ref":"#/components/schemas/Picture"},{"type":"null"}],"description":"Its tile's picture: the latest result's preview (`result`), else the upload a version is made from while it is kept (`upload`), else null."},"original":{"anyOf":[{"$ref":"#/components/schemas/Picture"},{"type":"null"}],"description":"Beside a drawn picture, the original it was drawn from (kept with that result); null when `picture` is the upload itself, or there is none. Not checked in the store: a result older than kept originals has none, and its URL fails."},"newerEngine":{"type":"boolean","description":"Its latest version was made by an older engine than today's: converting it again shows the improvement."},"conversions":{"type":"array","items":{"$ref":"#/components/schemas/ImageVersion"},"description":"Every live version, newest first."}},"required":["object","id","name","renamed","createdAt","deletedAt","erasedAfter","lastConvertedAt","state","versions","unlocked","latest","picture","original","newerEngine","conversions"],"description":"One image, opened: every live version, newest first."},"LibraryCounts":{"type":"object","properties":{"all":{"type":"integer","minimum":0},"unlocked":{"type":"integer","minimum":0},"notDownloaded":{"type":"integer","minimum":0},"failed":{"type":"integer","minimum":0},"deleted":{"type":"integer","minimum":0,"description":"How many wait in Recently deleted."}},"required":["all","unlocked","notDownloaded","failed","deleted"],"description":"How many images each filter shows."},"ImageList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Image"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]},"counts":{"anyOf":[{"$ref":"#/components/schemas/LibraryCounts"},{"type":"null"}],"description":"On page one (no `cursor`); null on a later page: page one's still hold."}},"required":["object","data","hasMore","nextCursor","counts"],"description":"A page of the library."},"WebhookEndpoint":{"type":"object","properties":{"object":{"type":"string","const":"webhook_endpoint"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"mode":{"type":"string","enum":["live","test"],"description":"`test`: hears test conversions, free; `live`: hears live conversions, with Pro."},"url":{"type":"string","description":"Where events are POSTed."},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."},"description":"The events it hears."},"secretShown":{"type":"string","description":"What its signing secret looks like, to tell secrets apart: `whsec_…` and its last four characters."},"rollingUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"After a roll, the old secret signs too until then; null when none does."},"status":{"type":"string","enum":["enabled","failing","disabled"],"description":"`enabled`; `failing`: every attempt has failed since `failingSince` (3 days of it turn it off); `disabled`: no events go."},"failingSince":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"disabledAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"disabledReason":{"anyOf":[{"type":"string","enum":["owner","failing","gone"]},{"type":"null"}],"description":"`owner`: you turned it off; `failing`: 3 days of failed attempts; `gone`: it answered 410. Turn it back on with `enabled: true`."},"createdAt":{"type":"string","format":"date-time"}},"required":["object","id","mode","url","description","events","secretShown","rollingUntil","status","failingSince","disabledAt","disabledReason","createdAt"],"description":"A webhook endpoint: where one mode's events go. Never its secret."},"CreatedWebhookEndpoint":{"type":"object","properties":{"object":{"type":"string","const":"webhook_endpoint"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"mode":{"type":"string","enum":["live","test"],"description":"`test`: hears test conversions, free; `live`: hears live conversions, with Pro."},"url":{"type":"string","description":"Where events are POSTed."},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."},"description":"The events it hears."},"secretShown":{"type":"string","description":"What its signing secret looks like, to tell secrets apart: `whsec_…` and its last four characters."},"rollingUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"After a roll, the old secret signs too until then; null when none does."},"status":{"type":"string","enum":["enabled","failing","disabled"],"description":"`enabled`; `failing`: every attempt has failed since `failingSince` (3 days of it turn it off); `disabled`: no events go."},"failingSince":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"disabledAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"disabledReason":{"anyOf":[{"type":"string","enum":["owner","failing","gone"]},{"type":"null"}],"description":"`owner`: you turned it off; `failing`: 3 days of failed attempts; `gone`: it answered 410. Turn it back on with `enabled: true`."},"createdAt":{"type":"string","format":"date-time"},"secret":{"type":"string","description":"The signing secret (`whsec_…`): verify every event with it. Shown in this answer only."}},"required":["object","id","mode","url","description","events","secretShown","rollingUntil","status","failingSince","disabledAt","disabledReason","createdAt","secret"],"description":"A webhook endpoint with its signing secret, the one time it is shown."},"WebhookDelivery":{"type":"object","properties":{"object":{"type":"string","const":"webhook_delivery"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"event":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","description":"The event's id: its `webhook-id` header, the same on every attempt. Dedupe on it."},"type":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."},"example":{"type":"boolean","description":"Sent from the page as an example: it carries an example conversion and is never retried."},"conversionId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","type","example","conversionId","createdAt"]},"endpoint":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"url":{"type":"string"}},"required":["id","url"]},"state":{"type":"string","enum":["delivered","waiting","failed","withheld"],"description":"`delivered` (a 2xx); `waiting` (on its way, or between attempts); `failed` (no attempt left); `withheld` (its endpoint was off, or live mode needs Pro)."},"attempts":{"type":"integer","minimum":0},"nextAttemptAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When it is tried next, while `waiting`."},"lastAttempt":{"anyOf":[{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"What your server answered; null when it did not answer."},"failure":{"anyOf":[{"type":"string","enum":["status","timeout","unreachable","address","redirect","error"]},{"type":"null"}],"description":"Why it failed: an answer that was not 2xx, no answer in 15 s, no connection, an address that is not public, a redirect (never followed), or ours."},"response":{"description":"The first characters of your server's answer.","type":["string","null"]},"durationMs":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]}},"required":["at","status","failure","response","durationMs"]},{"type":"null"}]},"withheldReason":{"anyOf":[{"type":"string","enum":["disabled","plan_required"]},{"type":"null"}]},"retried":{"type":"boolean","description":"Retried by hand (`POST …/retry`): one more attempt, outside the schedule."},"createdAt":{"type":"string","format":"date-time"}},"required":["object","id","event","endpoint","state","attempts","nextAttemptAt","lastAttempt","withheldReason","retried","createdAt"],"description":"One event's delivery to one endpoint: where it is, and what the endpoint answered last."},"WebhookDeliveryList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]},"today":{"type":"object","properties":{"sent":{"type":"integer","minimum":0},"delivered":{"type":"integer","minimum":0},"failed":{"type":"integer","minimum":0,"description":"Failed or withheld."},"waiting":{"type":"integer","minimum":0}},"required":["sent","delivered","failed","waiting"],"description":"The mode's deliveries since UTC midnight, examples apart."}},"required":["object","data","hasMore","nextCursor","today"],"description":"A page of webhook deliveries, newest first, and today's figures."},"WebhookEvent":{"type":"object","properties":{"object":{"type":"string","const":"event"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","description":"The same as the `webhook-id` header: dedupe on it, events may come more than once."},"type":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."},"timestamp":{"type":"string","format":"date-time","description":"When the conversion ended."},"livemode":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Conversion"}},"required":["object","id","type","timestamp","livemode","data"],"description":"An event VecSnap POSTs to a webhook endpoint, signed by the Standard Webhooks scheme. Answer 2xx within 15 seconds."},"Palette":{"type":"object","properties":{"object":{"type":"string","const":"palette"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"name":{"type":"string"},"colors":{"type":"array","items":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"description":"`#rrggbb`, lowercase, each once, in the order given."},"updatedAt":{"type":"string","format":"date-time"}},"required":["object","id","name","colors","updatedAt"],"description":"A named set of the person's colors."},"ApiKey":{"type":"object","properties":{"object":{"type":"string","const":"api_key"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"mode":{"type":"string","enum":["live","test"],"description":"`test`: the account's sandbox, free; `live`: the account itself, with a paid plan."},"name":{"type":"string"},"note":{"description":"Where its owner keeps it: their note for later.","type":["string","null"]},"shown":{"type":"string","description":"What the key looks like, for telling keys apart: its prefix and last four characters (`vs_test_…a1B2`)."},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"The last request made with it, to the minute."},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When a rolled key stops working; null: no end."},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["object","id","mode","name","note","shown","createdAt","lastUsedAt","expiresAt","revokedAt"],"description":"An API key, as the account sees it. Never its secret."},"CreatedApiKey":{"type":"object","properties":{"object":{"type":"string","const":"api_key"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"mode":{"type":"string","enum":["live","test"],"description":"`test`: the account's sandbox, free; `live`: the account itself, with a paid plan."},"name":{"type":"string"},"note":{"description":"Where its owner keeps it: their note for later.","type":["string","null"]},"shown":{"type":"string","description":"What the key looks like, for telling keys apart: its prefix and last four characters (`vs_test_…a1B2`)."},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"The last request made with it, to the minute."},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When a rolled key stops working; null: no end."},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"secret":{"type":"string","description":"The key itself, `Authorization: Bearer <secret>`. Shown in this answer only: copy it now."}},"required":["object","id","mode","name","note","shown","createdAt","lastUsedAt","expiresAt","revokedAt","secret"],"description":"A new API key with its secret, the one time it is shown."},"ApiRequest":{"type":"object","properties":{"object":{"type":"string","const":"api_request"},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"at":{"type":"string","format":"date-time","description":"When it arrived."},"method":{"type":"string"},"path":{"type":"string","description":"As the API names it (`/v1/conversions/…`), without the query."},"operation":{"type":"string","description":"The operation it called: its `operationId` in the API's document."},"status":{"type":"integer","description":"The answer's HTTP status."},"error":{"anyOf":[{"type":"object","properties":{"code":{"type":"string"},"means":{"description":"What the refusal means.","type":["string","null"]},"todo":{"description":"What to do about it.","type":["string","null"]}},"required":["code","means","todo"]},{"type":"null"}],"description":"The refusal, for an answer of 400 and up; null otherwise."},"requestId":{"type":"string","description":"The answer's `X-Request-Id`: quote it if you write to us."},"durationMs":{"type":"integer","minimum":0,"description":"How long the answer took, in milliseconds."},"client":{"description":"The caller's `User-Agent`, cut to 120 characters.","type":["string","null"]},"key":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"name":{"type":"string"},"shown":{"type":"string"}},"required":["id","name","shown"],"description":"The key it came with."}},"required":["object","id","at","method","path","operation","status","error","requestId","durationMs","client","key"],"description":"One request an API key made. No body and no address are kept; 30 days."},"ApiRequestList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiRequest"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]},"today":{"type":"object","properties":{"requests":{"type":"integer","minimum":0},"errors":{"type":"integer","minimum":0,"description":"Answered 400 and up."}},"required":["requests","errors"],"description":"The mode's requests since UTC midnight, all its keys together."}},"required":["object","data","hasMore","nextCursor","today"],"description":"A page of the request log, newest first, and today's count."},"Usage":{"type":"object","properties":{"object":{"type":"string","const":"usage"},"mode":{"type":"string","enum":["live","test"]},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"The first UTC day counted."},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"The last UTC day counted: today."},"totals":{"type":"object","properties":{"conversions":{"type":"integer","minimum":0,"description":"Conversions made (a canceled one apart), those still running included."},"completed":{"type":"integer","minimum":0,"description":"Of those, how many completed: a result."},"failed":{"type":"integer","minimum":0,"description":"Of those, how many ended without a result (failed or expired): each credit came back."},"credits":{"type":"integer","minimum":0,"description":"Credits spent, read from the ledger: what the completed conversions' unlocks cost. Test mode spends none."}},"required":["conversions","completed","failed","credits"]},"today":{"type":"object","properties":{"conversions":{"type":"integer","minimum":0,"description":"Conversions made (a canceled one apart), those still running included."},"completed":{"type":"integer","minimum":0,"description":"Of those, how many completed: a result."},"failed":{"type":"integer","minimum":0,"description":"Of those, how many ended without a result (failed or expired): each credit came back."},"credits":{"type":"integer","minimum":0,"description":"Credits spent, read from the ledger: what the completed conversions' unlocks cost. Test mode spends none."}},"required":["conversions","completed","failed","credits"],"description":"Since UTC midnight."},"days":{"type":"array","items":{"type":"object","properties":{"conversions":{"type":"integer","minimum":0,"description":"Conversions made (a canceled one apart), those still running included."},"completed":{"type":"integer","minimum":0,"description":"Of those, how many completed: a result."},"failed":{"type":"integer","minimum":0,"description":"Of those, how many ended without a result (failed or expired): each credit came back."},"credits":{"type":"integer","minimum":0,"description":"Credits spent, read from the ledger: what the completed conversions' unlocks cost. Test mode spends none."},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["conversions","completed","failed","credits","date"]},"description":"Every UTC day from `from` to `to`, oldest first, a day with none included."},"keys":{"type":"array","items":{"type":"object","properties":{"conversions":{"type":"integer","minimum":0,"description":"Conversions made (a canceled one apart), those still running included."},"completed":{"type":"integer","minimum":0,"description":"Of those, how many completed: a result."},"failed":{"type":"integer","minimum":0,"description":"Of those, how many ended without a result (failed or expired): each credit came back."},"credits":{"type":"integer","minimum":0,"description":"Credits spent, read from the ledger: what the completed conversions' unlocks cost. Test mode spends none."},"key":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"name":{"type":"string"},"shown":{"type":"string"},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","name","shown","revokedAt"]},{"type":"null"}],"description":"The key; null for the conversions made in the app (vecsnap.com)."}},"required":["conversions","completed","failed","credits","key"]},"description":"By key, the most conversions first; only keys (and the app) that made one in the range."}},"required":["object","mode","from","to","totals","today","days","keys"],"description":"An account's conversions in one mode over a range of UTC days: totals, each day, each key."},"AccountSettings":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","description":"Whose settings they are (the account's id): a page applies an answer only to the person it is for."},"allowAnalytics":{"type":"boolean","description":"Whether analytics may follow this account as a person (on by default)."},"productNews":{"type":"boolean","description":"Whether product news is emailed: the sign-up box's answer, then this switch."}},"required":["id","allowAnalytics","productNews"],"description":"The calling account's settings."},"PlanLevel":{"type":"object","properties":{"item":{"type":"string","description":"Its key in GET /prices: `<plan>-<credits a month>:<month|year>`."},"plan":{"type":"string","enum":["starter","pro"]},"credits":{"type":"integer","minimum":1,"description":"Credits a month."},"interval":{"type":"string","enum":["month","year"]}},"required":["item","plan","credits","interval"],"description":"A plan level, never a price (the provider states those: GET /prices)."}}},"paths":{"/vectorize":{"post":{"operationId":"vectorize","tags":["Vectorize"],"summary":"Vectorize an image","description":"Converts one image and hands you its SVG in the same request. Send exactly one of `file` (multipart), `url` or `inputKey`. If it finishes within `wait` seconds the answer is 200 with the result and its files; otherwise 202 with the conversion, which finishes on its own (`Location` names it: read it, stream its events, or await your webhook). Every client MUST handle the 202: most images take seconds, a few take minutes. It always UNLOCKS: 1 credit per image, held now and refunded if the conversion fails; an image already unlocked costs nothing again. Past your limit of conversions at once it waits its turn instead of refusing. Test keys: free (the sample result). With `Accept: image/svg+xml` a finished conversion answers 303 to the web file itself.","x-plane":"data","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry safely: the same key answers the conversion it already made, never a second one and never a second charge (8–200 letters, digits and `._:~-`). The same key with another image is 409 `idempotency_key_reused`.","schema":{"type":"string"}},{"name":"Accept","in":"header","required":false,"description":"`image/svg+xml`: a finished conversion answers 303 to its web file. Follow it to take the file.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"description":"An https link to the image: we fetch it, up to 10 MB in 10 seconds, public addresses only, at most 3 redirects.","type":"string"},"inputKey":{"description":"An upload you already made (POST /uploads), for files up to 10 MB.","type":"string","minLength":1},"wait":{"default":30,"description":"Seconds to hold the request open for the result. 0 answers at once (202): use it with a webhook.","type":"integer","minimum":0,"maximum":60},"preset":{"type":"string","enum":["default"],"default":"default","x-error-code":"unknown_preset"},"options":{"type":"object","properties":{"maxColors":{"description":"Redraw with at most this many colors, the ground included (2 to 24).","type":"integer","minimum":2,"maximum":24,"x-error-code":"invalid_options"}},"additionalProperties":false,"x-error-code":"invalid_options","description":"Optional choices about this image beside its preset. `{}` for none. Two conversions share a cached result only with the same options. Not offered yet: `merge` (a redraw that merges two colors is not offered yet; merge them in the Colors tab, or ask for fewer colors)."},"filename":{"maxLength":1024,"description":"OPTIONAL: the image's name, kept as its label and the download's name. Default: the file's or the URL's own.","type":"string"}},"additionalProperties":false}},"multipart/form-data":{"schema":{"type":"object","properties":{"url":{"description":"An https link to the image: we fetch it, up to 10 MB in 10 seconds, public addresses only, at most 3 redirects.","type":"string"},"inputKey":{"description":"An upload you already made (POST /uploads), for files up to 10 MB.","type":"string","minLength":1},"wait":{"default":30,"description":"Seconds to hold the request open for the result. 0 answers at once (202): use it with a webhook.","type":"integer","minimum":0,"maximum":60},"preset":{"type":"string","enum":["default"],"default":"default","x-error-code":"unknown_preset"},"options":{"type":"object","properties":{"maxColors":{"description":"Redraw with at most this many colors, the ground included (2 to 24).","type":"integer","minimum":2,"maximum":24,"x-error-code":"invalid_options"}},"additionalProperties":false,"x-error-code":"invalid_options","description":"Optional choices about this image beside its preset. `{}` for none. Two conversions share a cached result only with the same options. Not offered yet: `merge` (a redraw that merges two colors is not offered yet; merge them in the Colors tab, or ask for fewer colors)."},"filename":{"maxLength":1024,"description":"OPTIONAL: the image's name, kept as its label and the download's name. Default: the file's or the URL's own.","type":"string"},"file":{"type":"string","format":"binary","description":"The image itself: PNG, JPG, WebP, AVIF, GIF, BMP or TIFF. Larger files go through an upload (POST /uploads, then `inputKey`). At most 4 MB."}},"additionalProperties":false},"encoding":{"wait":{"contentType":"application/json"},"options":{"contentType":"application/json"}}}}},"responses":{"200":{"description":"It ended within `wait`: the conversion, its figures and its files.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vectorized"}}}},"202":{"description":"Still converting after `wait`: the conversion (its `Location`). It finishes on its own and keeps its unlock.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversion"}}}},"303":{"description":"With `Accept: image/svg+xml`, a completed conversion: `Location` is its web file."},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `unknown_preset`: There is no preset by that name. Use one of the presets the message lists.\n- `invalid_options`: An option is out of bounds or not offered yet. Read the message for the bounds, or leave the option out.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `file_too_large`: The file is over the size limit. Send a smaller file.\n- `invalid_url`: We do not fetch that URL: only https on the standard port, with no user name or password, on the public internet. Send a public https link to the image, or the image itself.\n- `url_unreachable`: We could not fetch the image at that URL: no answer, a missing page, too slow, too many redirects, or too large. Read the message for which. Check the link opens in a private window, or send the image itself.\n- `invalid_idempotency_key`: The idempotency key is too short, too long or has characters we do not take. Send a UUID, or 8 to 200 letters, digits and . _ : ~ -\n- `invalid_input_key`: That upload does not belong to this account. Upload the file with this account, then convert it.\n- `unsupported_type`: We do not convert that kind of file. Send one of the formats the message lists.\n- `file_empty`: The file has no bytes. Upload the file again.\n- `invalid_size`: The declared size is not a positive whole number of bytes. Send the file's exact size in bytes.\n- `dimensions_too_large`: The image is wider or taller than we convert. Send an image of at most the limit on each side.\n- `malformed_image`: The file is not a readable image of the type it claims. Export the image again and send that file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","unknown_preset","invalid_options","malformed_body","file_too_large","invalid_url","url_unreachable","invalid_idempotency_key","invalid_input_key","unsupported_type","file_empty","invalid_size","dimensions_too_large","malformed_image"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"402":{"description":"- `insufficient_credits`: There are not enough credits for this unlock. None was spent. Buy credits, then send the same request again.\n- `unlock_required`: This image is not unlocked yet, so its files do not download. Unlock it (1 credit, once per image), then download.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["insufficient_credits","unlock_required"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `idempotency_key_reused`: That idempotency key was used for a different request. Make a new key for a new request.\n- `unlock_pending`: A conversion of this image is already unlocking it. Wait for that conversion to finish.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","idempotency_key_reused","unlock_pending","conversion_failed"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.\n- `free_limit_reached`: Today's free conversions are used. Come back after Retry-After (UTC midnight), or unlock with a credit.\n- `free_capacity_reached`: Everyone's free conversions for today are used. Come back after Retry-After (UTC midnight), or unlock with a credit.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited","free_limit_reached","free_capacity_reached"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/uploads":{"post":{"operationId":"createUpload","tags":["Uploads"],"summary":"Create an upload","description":"Mints a URL to PUT one image to, and the key a conversion names it by. Uploads never pass through the API (a request body is capped well under our 10485760-byte limit). The URL is signed for exactly `contentLength` bytes: the PUT must send that many. Its type and size are checked again, from the stored bytes, when the conversion is created.","x-plane":"data","x-guest-allowed":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contentType":{"type":"string","enum":["image/png","image/apng","image/jpeg","image/jpg","image/pjpeg","image/webp","image/avif","image/gif","image/bmp","image/x-bmp","image/x-ms-bmp","image/tiff","image/tif","image/x-tiff"],"description":"The file's media type.","x-error-code":"unsupported_type"},"sizeBytes":{"type":"number","minimum":1,"maximum":10485760,"description":"The file's exact size in bytes.","x-error-code":"invalid_size"}},"required":["contentType","sizeBytes"],"additionalProperties":false}}}},"responses":{"200":{"description":"Where to PUT the bytes, and the key the conversion will name.","content":{"application/json":{"schema":{"type":"object","properties":{"uploadUrl":{"type":"string","format":"uri","description":"PUT the file's bytes here, with this `contentType` and `contentLength`."},"inputKey":{"type":"string","description":"Name it in POST /conversions as `inputKey`."},"contentType":{"type":"string"},"contentLength":{"type":"integer","minimum":1,"description":"The exact body length the URL is signed for."},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid."}},"required":["uploadUrl","inputKey","contentType","contentLength","expiresIn"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `unsupported_type`: We do not convert that kind of file. Send one of the formats the message lists.\n- `invalid_size`: The declared size is not a positive whole number of bytes. Send the file's exact size in bytes.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `file_empty`: The file has no bytes. Upload the file again.\n- `file_too_large`: The file is over the size limit. Send a smaller file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","unsupported_type","invalid_size","malformed_body","file_empty","file_too_large"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions":{"post":{"operationId":"createConversion","tags":["Conversions"],"summary":"Create a conversion","description":"Converting is FREE: 1 credit = 1 image, spent when the image is UNLOCKED (here with `unlock: true`, or later with POST /conversions/{id}/unlock). A free conversion counts against the daily caps (guests 3 a UTC day, free accounts 10, customers 100). A guest never unlocks: `unlock: true` answers it 403 `account_required`. Accepted formats: PNG, JPG, WebP, AVIF, GIF, BMP and TIFF (read by their bytes; an animation or a multi-page TIFF at its first frame), at most 4096×4096. HEIC: send a PNG (the website converts it in the browser). Repeating an `idempotencyKey` answers 200 with the conversion it already made, never a second one and never a second charge.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"Retry-After","in":"header","required":false,"description":"On a 429 (`free_limit_reached`, or every free conversion together reaching today's shared capacity of 2000): seconds until the caps renew, the next UTC midnight. On a 409 `too_many_active_jobs` (guest 1, free 1, paid 5 at once): wait for one to end, or send `queue: true`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"inputKey":{"type":"string","minLength":1,"description":"From POST /uploads. Must be the caller's."},"inputHash":{"description":"OPTIONAL assertion about what was uploaded. The API computes the real hash itself and answers `input_hash_mismatch` on disagreement: a client-chosen cache key would be a cache-poisoning path.","type":"string"},"preset":{"type":"string","enum":["default"],"default":"default","x-error-code":"unknown_preset"},"options":{"type":"object","properties":{"maxColors":{"description":"Redraw with at most this many colors, the ground included (2 to 24).","type":"integer","minimum":2,"maximum":24,"x-error-code":"invalid_options"}},"additionalProperties":false,"x-error-code":"invalid_options","description":"Optional choices about this image beside its preset. `{}` for none. Two conversions share a cached result only with the same options. Not offered yet: `merge` (a redraw that merges two colors is not offered yet; merge them in the Colors tab, or ask for fewer colors)."},"idempotencyKey":{"type":"string","minLength":8,"maxLength":200,"description":"Unique per conversion you mean: a retry with the same key is answered with the conversion it made.","x-error-code":"invalid_idempotency_key"},"filename":{"maxLength":1024,"description":"OPTIONAL: the uploaded file's own name. Kept as a cleaned label (the base name, no extension, at most 80 characters); the download is `<name>.svg`.","type":"string"},"unlock":{"default":false,"description":"OPTIONAL: unlock the image with this conversion: 1 credit held now, committed when it completes, refunded if it fails. On an image already unlocked it holds nothing (a free re-run); on one a conversion still running is unlocking, 409 `unlock_pending`. No request spends a credit unless it says so.","type":"boolean"},"queue":{"default":false,"description":"OPTIONAL: past the active limit, WAIT in line (status `waiting`) instead of a 409 `too_many_active_jobs`. It starts by itself when one of the caller's conversions ends, oldest first, and may be stopped while it waits (POST /conversions/{id}/cancel). Every cap applies at creation: a waiting conversion counts against the day, and a held credit is held while it waits.","type":"boolean"}},"required":["inputKey","idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"An idempotency replay: the conversion this key already made, unchanged and uncharged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedConversion"}}}},"201":{"description":"A new conversion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedConversion"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `unknown_preset`: There is no preset by that name. Use one of the presets the message lists.\n- `invalid_options`: An option is out of bounds or not offered yet. Read the message for the bounds, or leave the option out.\n- `invalid_idempotency_key`: The idempotency key is too short, too long or has characters we do not take. Send a UUID, or 8 to 200 letters, digits and . _ : ~ -\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `invalid_input_key`: That upload does not belong to this account. Upload the file with this account, then convert it.\n- `input_hash_mismatch`: The inputHash you sent is not the hash of the stored file. Upload the file again; the stored bytes are not the ones you meant.\n- `unsupported_type`: We do not convert that kind of file. Send one of the formats the message lists.\n- `file_empty`: The file has no bytes. Upload the file again.\n- `file_too_large`: The file is over the size limit. Send a smaller file.\n- `invalid_size`: The declared size is not a positive whole number of bytes. Send the file's exact size in bytes.\n- `dimensions_too_large`: The image is wider or taller than we convert. Send an image of at most the limit on each side.\n- `malformed_image`: The file is not a readable image of the type it claims. Export the image again and send that file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","unknown_preset","invalid_options","invalid_idempotency_key","malformed_body","invalid_input_key","input_hash_mismatch","unsupported_type","file_empty","file_too_large","invalid_size","dimensions_too_large","malformed_image"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"402":{"description":"- `insufficient_credits`: There are not enough credits for this unlock. None was spent. Buy credits, then send the same request again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["insufficient_credits"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `too_many_active_jobs`: Your conversions running at once are at their limit. Wait for one to finish, or send queue: true to wait in line.\n- `idempotency_key_reused`: That idempotency key was used for a different request. Make a new key for a new request.\n- `unlock_pending`: A conversion of this image is already unlocking it. Wait for that conversion to finish.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","too_many_active_jobs","idempotency_key_reused","unlock_pending"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.\n- `free_limit_reached`: Today's free conversions are used. Come back after Retry-After (UTC midnight), or unlock with a credit.\n- `free_capacity_reached`: Everyone's free conversions for today are used. Come back after Retry-After (UTC midnight), or unlock with a credit.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited","free_limit_reached","free_capacity_reached"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"get":{"operationId":"listConversions","tags":["Conversions"],"summary":"List conversions","description":"The caller's conversions, newest first, a page at a time: pass a page's `nextCursor` back as `cursor`. With `live=true`, only the LIVE ones (waiting, queued, processing), oldest first: the queue as the server holds it, in one page (`limit` and `cursor` are then refused).","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"live","in":"query","required":false,"description":"`true`: only the live ones, oldest first.","schema":{"enum":["true","false"],"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"A page's `nextCursor`.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of conversions.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Conversion"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]}},"required":["object","data","hasMore","nextCursor"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_cursor`: The page cursor is not one this list returned. Start again from the first page, or pass the nextCursor you were given.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_cursor"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}":{"get":{"operationId":"getConversion","tags":["Conversions"],"summary":"Retrieve a conversion","description":"A permalink: for the slow tail this is the normal way a conversion is seen, and it answers the same an hour later as while it runs. Another's conversion is 404, the same as none.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The conversion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversion"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"deleteConversion","tags":["Conversions"],"summary":"Delete a conversion","description":"Deletes this VERSION of its image: erased at once, it leaves every list and permalink, and its files are deleted within the hour. The image's LAST version is not erased: deleting it deletes the image (Recently deleted, restorable), and `deleted` says which. Its unlock, if paid, stays the image's.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"What was deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"string","enum":["conversion","image"],"description":"`conversion`: this version, erased; `image`: its image, to Recently deleted."}},"required":["deleted"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `conversion_running`: The image is still converting. Wait for it to finish, then try again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","conversion_running"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/cancel":{"post":{"operationId":"cancelConversion","tags":["Conversions"],"summary":"Cancel a waiting conversion","description":"Only a WAITING conversion (created with `queue: true`, past the active limit) can be stopped: once it has started, a worker holds it. Stopped, it is `canceled`: a held credit comes back, it leaves the library (an image whose only version it was goes with it), and it is not counted against the day.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The conversion, canceled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversion"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_waiting`: Only a conversion waiting in line can be canceled. Let a running conversion finish.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_waiting"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/unlock":{"post":{"operationId":"unlockConversion","tags":["Conversions"],"summary":"Unlock a conversion's image","description":"1 credit, at most once per image (the same uploaded bytes in this account). After it every result of the image downloads in every format and every re-run of it is free. A repeat, or a conversion of an image already unlocked, spends nothing (`spent: 0`), so a retry is safe. A POST, never folded into the download: a GET that spends a credit is a GET a link previewer spends.","x-plane":"data","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The image is unlocked.","content":{"application/json":{"schema":{"type":"object","properties":{"unlocked":{"type":"boolean","const":true},"spent":{"type":"integer","minimum":0,"description":"What THIS call spent: 1 or 0."}},"required":["unlocked","spent"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"402":{"description":"- `insufficient_credits`: There are not enough credits for this unlock. None was spent. Buy credits, then send the same request again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["insufficient_credits"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `unlock_pending`: A conversion of this image is already unlocking it. Wait for that conversion to finish.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","unlock_pending"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/events":{"get":{"operationId":"watchConversion","tags":["Conversions"],"summary":"Watch a conversion","description":"Server-Sent Events: a `status` event at once with the current state, then one on each change of `status` or `phase`; its data is a `ConversionEvent`. The stream closes when the conversion ends. A serverless function has a bounded lifetime and a conversion can outlive it, so a client MUST reconnect and re-read the conversion rather than treat this stream as the only way to learn an outcome.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"A `text/event-stream` of `status` events, each a `ConversionEvent`.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/download":{"get":{"operationId":"downloadConversion","tags":["Results"],"summary":"Download a file of the result","description":"A short-lived URL for one of the result's files: `format` names one of `result.formats` by id (absent, the web default). Served from the storage domain as an attachment, never inline from this origin: SVG is an active document format. Allowed once the conversion's IMAGE is unlocked, on every plan; then every format and re-download is free. A locked image answers 402 `unlock_required` (this GET never spends). `as` takes the format as a print-ready PDF (`pdf`, a design file's of outlines, never its `editableText` twin) or a picture (`png`, a web file's with a preview, `size` px on its long side): made from the stored result on first ask, after the unlock check.","x-plane":"data","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},{"name":"format","in":"query","required":false,"description":"A format's id from `result.formats`; the web default when left out.","schema":{"type":"string"}},{"name":"as","in":"query","required":false,"schema":{"default":"svg","type":"string","enum":["svg","pdf","png"],"x-error-code":"format_unavailable"}},{"name":"size","in":"query","required":false,"description":"With `as=png`: the picture's long side in px.","schema":{"type":"string","enum":["2048","4096","8192"],"default":"2048","x-error-code":"format_unavailable"}},{"name":"variant","in":"query","required":false,"description":"A recolor of the result (POST /conversions/{id}/variants): the file with those colors, every format but `currentColor`.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","x-error-code":"invalid_id"}}],"responses":{"200":{"description":"A short-lived URL.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Served from the storage domain; valid for `expiresIn` seconds."},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid. Ask again for a fresh one."},"filename":{"type":"string","description":"What the file saves as."},"format":{"type":"string","description":"The format's id."}},"required":["url","expiresIn","filename","format"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `format_unavailable`: This result has no file in that format. Ask for one of the formats the conversion lists.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","format_unavailable"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"402":{"description":"- `unlock_required`: This image is not unlocked yet, so its files do not download. Unlock it (1 credit, once per image), then download.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unlock_required"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.\n- `variant_not_found`: There is no such recolor of this result. Use a variant id this result listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found","variant_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/preview":{"get":{"operationId":"previewConversion","tags":["Results"],"summary":"Preview the result","description":"A short-lived URL for a web file's rendered PNG, on EVERY tier: the free tier is the product demo, a full-quality conversion, this preview and its figures, with the SVG withheld. Served inline (a PNG is inert). `format` names a web file of `result.formats` that is not `currentColor` (its background kept or dropped); absent, the web default's. 2048 px on its long side, at the drawing's own aspect. `layer=outline`: the anchor-point view at the same size, lying exactly on it (black hairlines and squares on transparency).","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},{"name":"format","in":"query","required":false,"description":"A web file's id; the web default when left out.","schema":{"type":"string"}},{"name":"layer","in":"query","required":false,"schema":{"type":"string","enum":["outline"],"x-error-code":"layer_unavailable"}}],"responses":{"200":{"description":"A short-lived URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `layer_unavailable`: This result has no such layer. Ask for a layer the reference names.\n- `format_unavailable`: This result has no file in that format. Ask for one of the formats the conversion lists.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","layer_unavailable","format_unavailable"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/tiles":{"post":{"operationId":"getConversionTiles","tags":["Results"],"summary":"Tiles of a deeper zoom","description":"Every tier, like the preview: pictures of the file, never the SVG. Level L draws the drawing 2048·2^L px long, cut into 512-px squares (1 ≤ L ≤ 3); a tile is [x, y] within the square grid of its level. Missing tiles are made first, then served from storage.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"layer":{"type":"string","description":"`outline` or `outline-2x` (the anchor-point view drawn for a 1× or 2× screen), a web file's id, or `ids-{format}` (that web file's Shapes ID picture, GET /conversions/{id}/shapes)."},"level":{"type":"integer","minimum":1,"maximum":3},"tiles":{"minItems":1,"maxItems":24,"type":"array","items":{"type":"array","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":0}],"items":false,"minItems":2,"maxItems":2}},"variant":{"description":"A recolor of the result: a web file's tiles with its colors (never the outline's).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}]},"palette":{"description":"A redraw's preview count (GET /conversions/{id}/palette): a web file's tiles with the drawing merged into its colors. Never with `variant`.","anyOf":[{"type":"integer","minimum":2,"maximum":24},{"type":"null"}]}},"required":["layer","level","tiles"],"additionalProperties":false,"x-error-code":"invalid_tiles"}}}},"responses":{"200":{"description":"A short-lived URL per tile.","content":{"application/json":{"schema":{"type":"object","properties":{"layer":{"type":"string"},"level":{"type":"integer"},"variant":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},{"type":"null"}]},"palette":{"anyOf":[{"type":"integer"},{"type":"null"}]},"tiles":{"type":"array","items":{"type":"object","properties":{"x":{"type":"integer"},"y":{"type":"integer"},"url":{"type":"string","format":"uri"}},"required":["x","y","url"]}},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid. Ask again for a fresh one."}},"required":["layer","level","variant","palette","tiles","expiresIn"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_tiles`: A tile asked for a layer, level or position this result does not have. Ask only for tiles inside the result's levels.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `invalid_options`: An option is out of bounds or not offered yet. Read the message for the bounds, or leave the option out.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","invalid_tiles","malformed_body","invalid_options"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.\n- `variant_not_found`: There is no such recolor of this result. Use a variant id this result listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found","variant_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.\n- `original_not_kept`: The image's file is no longer kept, so it cannot be converted again. Upload the file again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode","original_not_kept"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/original":{"get":{"operationId":"getConversionOriginal","tags":["Results"],"summary":"The original image","description":"A short-lived URL for the image the conversion was made from: the upload, kept with its result for the comparison (deleted with the result or the account, never in the shared cache). While it waits or runs, the upload itself, so a client can show the image being converted. Served inline, as the type its bytes proved at upload. A result made before originals were kept, a running conversion whose upload is gone, or a TIFF (which no browser but Safari draws) has none: 404 `original_unavailable`.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"A short-lived URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.\n- `original_unavailable`: This conversion's original is not shown here. Show its redraw instead.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found","original_unavailable"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","conversion_failed"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/facts":{"get":{"operationId":"getConversionFacts","tags":["Results"],"summary":"The result's facts","description":"Every tier: the engine's facts of the default file, in the ENGINE's names (the same object the site's examples show): the counts a layers panel would sum (anchor points, paths, circles, rectangles, rings, strokes, repeats, elements, the words kept as text) and every color the file draws with what it paints and its share of the frame.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The facts.","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"anchor_points":{"type":"integer","minimum":0},"circles":{"type":"integer","minimum":0},"rects":{"type":"integer","minimum":0},"rings":{"type":"integer","minimum":0},"paths":{"type":"integer","minimum":0},"strokes":{"type":"integer","minimum":0},"uses":{"type":"integer","minimum":0},"definitions":{"type":"integer","minimum":0},"elements":{"type":"integer","minimum":0},"words":{"type":"array","items":{"type":"string"},"description":"The words kept as text."},"colors":{"type":"integer","minimum":0},"gradients":{"type":"integer","minimum":0}},"required":["anchor_points","circles","rects","rings","paths","strokes","uses","definitions","elements","words","colors","gradients"]},"colors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"roles":{"type":"array","items":{"type":"string","enum":["fill","stroke","stop","background"]}},"area":{"type":"number","minimum":0,"description":"Its share of the frame, 0 to 1: for order and words."}},"required":["key","roles","area"]}},"ground":{"anyOf":[{"type":"string","pattern":"^#[0-9a-f]{6}$"},{"type":"null"}],"description":"The ground the engine detected, kept or not, or null."}},"required":["summary","colors","ground"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/shapes":{"get":{"operationId":"getConversionShapes","tags":["Results"],"summary":"The result's shapes","description":"Every tier, like the preview: a web file's shapes in the engine's order, and a link to its ID PICTURE at the preview's size: every pixel's color − 1 is the shape on top there, transparent where none is, never a blended pixel. Decode it with color conversion and premultiplying off. Its deeper zoom: POST /conversions/{id}/tiles with the layer `ids-{format}`. Made on the first ask, then served.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},{"name":"format","in":"query","required":false,"description":"A web file's id; the default web file when left out.","schema":{"type":"string"}}],"responses":{"200":{"description":"The table, and a short-lived link to the ID picture.","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string"},"width":{"type":"number","exclusiveMinimum":0,"description":"The file's own units (its viewBox): what a row's `box` is in."},"height":{"type":"number","exclusiveMinimum":0},"rows":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":0,"description":"From 0 in the engine's order, the kept ground first when the file draws it. Not a stacking rank."},"kind":{"type":"string","description":"What the shape is, as the engine reads it (an OPEN set)."},"ground":{"type":"boolean"},"points":{"type":"integer","minimum":0,"description":"Its anchor points: the rows sum to the facts' `anchor_points`."},"paint":{"anyOf":[{"type":"string","pattern":"^#[0-9a-f]{6}$"},{"type":"null"}],"description":"Its flat paint; null for a gradient."},"box":{"readOnly":true,"description":"`[x0, y0, x1, y1]` in the file's units.","type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"},{"type":"number"}],"items":false,"minItems":4,"maxItems":4},"neighbors":{"readOnly":true,"description":"The shapes it touches in the ID picture, ascending; each lists it back.","type":"array","items":{"type":"integer","minimum":0}}},"required":["index","kind","ground","points","paint","box","neighbors"]}},"picture":{"type":"string","format":"uri","description":"The ID picture: every pixel's color − 1 is the shape on top there (`#000001` is shape 0)."},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid. Ask again for a fresh one."}},"required":["format","width","height","rows","picture","expiresIn"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `format_unavailable`: This result has no file in that format. Ask for one of the formats the conversion lists.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","format_unavailable"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/paints":{"get":{"operationId":"getConversionPaints","tags":["Colors"],"summary":"The result's paint map","description":"Every tier, like the preview: the paints the file draws with its ground left out, in index order, each with its share of the frame, the ground, and a link to `paints.bin`: zlib of an index plane then a weight plane (width × height × 4 bytes each: every pixel's four largest paints, 255 = none, and their weights × 255). A pixel of any recolor is Σ w·c′ (premultiplied), with the ground under it as (1 − Σ w)·ground. Made on the first ask; a drawing of more than 24 paints has none.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The table, and a short-lived link to the map.","content":{"application/json":{"schema":{"type":"object","properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1},"ground":{"anyOf":[{"type":"string","pattern":"^#[0-9a-f]{6}$"},{"type":"null"}]},"groundArea":{"type":"number","minimum":0,"description":"The share of the frame the ground shows through."},"paints":{"maxItems":24,"type":"array","items":{"type":"object","properties":{"key":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"area":{"type":"number","minimum":0}},"required":["key","area"]},"description":"In INDEX order."},"map":{"type":"string","format":"uri","description":"`paints.bin`, zlib-compressed."},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid. Ask again for a fresh one."}},"required":["width","height","ground","groundArea","paints","map","expiresIn"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.\n- `too_many_colors`: This result has too many colors to edit one by one. Redraw it with fewer colors first.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode","too_many_colors"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/palette":{"get":{"operationId":"getConversionPalette","tags":["Colors"],"summary":"Preview fewer colors","description":"Previews of a redraw with fewer colors. Without `count`: the WHOLE rail in one answer (`counts`), every count in the engine's bounds, colors only: what a client asks once, then reads. With `count`: the colors the engine REACHES for at most that many (from the result's kept original; it can be fewer), and the result's own colors MERGED into them (`mapping`), a recolor of the very drawing a client draws exactly. With `format` (a web file with a picture), also `picture`: the merged drawing at the preview's size; its deeper tiles are POST /conversions/{id}/tiles with `palette`. The redraw itself (POST /images/{id}/conversions with `options.maxColors`) traces new shapes.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},{"name":"count","in":"query","required":false,"description":"One count; left out, the whole rail.","schema":{"type":"integer","minimum":2,"maximum":24,"x-error-code":"invalid_options"}},{"name":"format","in":"query","required":false,"description":"With `count`, a web file's id: its merged picture too.","schema":{"type":"string"}}],"responses":{"200":{"description":"Without `count`: the rail. With it: that count's preview.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"counts":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"asked":{"type":"integer"},"count":{"type":"integer","minimum":1,"description":"The colors the preview reached: at most `asked`."},"colors":{"type":"array","items":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"description":"Largest first."},"mapping":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"`{\"#key\": \"#color\"}`: each key of the result's table merged (identity pairs left out)."}},"required":["asked","count","colors","mapping"]},{"type":"object","properties":{"asked":{"type":"integer"},"refused":{"type":"boolean","const":true,"description":"A count the conversion's merges cannot keep."}},"required":["asked","refused"]}]}}},"required":["counts"]},{"type":"object","properties":{"asked":{"type":"integer"},"count":{"type":"integer","minimum":1,"description":"The colors the preview reached: at most `asked`."},"colors":{"type":"array","items":{"type":"string","pattern":"^#[0-9a-f]{6}$"},"description":"Largest first."},"mapping":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"`{\"#key\": \"#color\"}`: each key of the result's table merged (identity pairs left out)."},"picture":{"description":"With `format`: the merged drawing at the preview's size.","type":"string","format":"uri"},"expiresIn":{"type":"integer","minimum":1,"description":"Seconds the URL stays valid. Ask again for a fresh one."}},"required":["asked","count","colors","mapping","expiresIn"]}]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_options`: An option is out of bounds or not offered yet. Read the message for the bounds, or leave the option out.\n- `format_unavailable`: This result has no file in that format. Ask for one of the formats the conversion lists.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","invalid_options","format_unavailable"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.\n- `original_not_kept`: The image's file is no longer kept, so it cannot be converted again. Upload the file again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode","original_not_kept"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/variants":{"get":{"operationId":"listConversionVariants","tags":["Colors"],"summary":"List a result's recolors","description":"The result's recolors, the last used first: the 10 used last, in one page (`hasMore` says older ones exist; they are not listed, and saving one again brings it first).","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"Its recolors.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","description":"Its files' folder: GET /conversions/{id}/download?variant=<id>."},"colors":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Its canonical mapping: lowercase, identity pairs dropped."},"usedAt":{"type":"string","format":"date-time"}},"required":["id","colors","usedAt"]}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]}},"required":["object","data","hasMore","nextCursor"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"post":{"operationId":"createConversionVariant","tags":["Colors"],"summary":"Recolor a result","description":"`colors` maps the file's own colors to new ones, every use of each (fills, strokes, gradient stops, the ground); two to one value merge them. Keys are the result's paints and its ground (`/facts`); the mapping is stored canonical, and the same one saved again is the same variant, used now. Free; its files download under the image's unlock (`/download?variant=`).","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"colors":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"maxProperties":1000,"description":"`{\"#old\": \"#new\"}`, each `#rrggbb`."}},"required":["colors"],"additionalProperties":false,"x-error-code":"invalid_colors"}}}},"responses":{"200":{"description":"The recolor, as saved.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","description":"Its files' folder: GET /conversions/{id}/download?variant=<id>."},"colors":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"},"description":"Its canonical mapping: lowercase, identity pairs dropped."},"usedAt":{"type":"string","format":"date-time"}},"required":["id","colors","usedAt"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_colors`: A color mapping names a color the result does not have, or is not a hex color. Map only the result's own colors, as #rrggbb.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","invalid_colors","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.\n- `not_in_test_mode`: Test mode makes the conversion and its SVG files only. Use a live key for it, or test the conversion and its SVG files.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated","not_in_test_mode"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `derive_failed`: A preview file could not be made just now. Try again. The coarser picture still shows.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["derive_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/conversions/{id}/feedback":{"get":{"operationId":"getConversionFeedback","tags":["Conversions"],"summary":"Retrieve the verdict","description":"The caller's verdict on a result, or null.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The verdict, or null.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"anyOf":[{"type":"object","properties":{"vote":{"type":"string","enum":["up","down"]},"reasons":{"type":"array","items":{"type":"string","enum":["lost_detail","wrong_colors","rough_edges","too_many_shapes","text","failed"]}},"note":{"type":["string","null"]},"shareImage":{"type":"boolean","description":"The person's consent for the team to look at THIS image to fix it, never a consent to anything else."},"updatedAt":{"type":"string","format":"date-time"}},"required":["vote","reasons","note","shareImage","updatedAt"]},{"type":"null"}]}},"required":["verdict"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"put":{"operationId":"putConversionFeedback","tags":["Conversions"],"summary":"Give a verdict","description":"One per result, given or changed: thumbs up or down; a down's reasons; a note; and `shareImage`. Moves no money: a failed result's credit comes back after a look, by an operator.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"vote":{"type":"string","enum":["up","down"]},"reasons":{"description":"Only with a thumb down.","type":"array","items":{"type":"string","enum":["lost_detail","wrong_colors","rough_edges","too_many_shapes","text","failed"]}},"note":{"maxLength":1000,"type":["string","null"]},"shareImage":{"default":false,"type":"boolean"}},"required":["vote"],"additionalProperties":false,"x-error-code":"invalid_verdict"}}}},"responses":{"200":{"description":"The verdict, as stored.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":"object","properties":{"vote":{"type":"string","enum":["up","down"]},"reasons":{"type":"array","items":{"type":"string","enum":["lost_detail","wrong_colors","rough_edges","too_many_shapes","text","failed"]}},"note":{"type":["string","null"]},"shareImage":{"type":"boolean","description":"The person's consent for the team to look at THIS image to fix it, never a consent to anything else."},"updatedAt":{"type":"string","format":"date-time"}},"required":["vote","reasons","note","shareImage","updatedAt"]}},"required":["verdict"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_verdict`: The verdict's vote, reasons or note cannot be taken. Read the message: it names the field.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","invalid_verdict","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `conversion_failed`: The conversion ended without a result. Convert the image again. Converting is free.\n- `result_outdated`: This result was made before files were kept per format. Convert the image again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","conversion_failed","result_outdated"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images":{"get":{"operationId":"listImages","tags":["Images"],"summary":"List images","description":"The caller's library, one entry per image, a page at a time: an image's versions are never cut at a page's edge. Pass a page's `nextCursor` back as `cursor`. `deleted=true` lists Recently deleted (newest deletion first).","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"filter","in":"query","required":false,"schema":{"default":"all","type":"string","enum":["all","unlocked","not_downloaded","failed"],"x-error-code":"invalid_filter"}},{"name":"sort","in":"query","required":false,"schema":{"default":"newest","type":"string","enum":["newest","oldest","name"],"x-error-code":"invalid_sort"}},{"name":"q","in":"query","required":false,"description":"A substring of the name, any case.","schema":{"type":"string","maxLength":200}},{"name":"deleted","in":"query","required":false,"schema":{"enum":["true","false"],"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":60,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"A page's `nextCursor`.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of images, and on page one the counts per filter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageList"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_filter`: The list filter is not one this list offers. Use one of the filters the reference names.\n- `invalid_sort`: The list order is not one this list offers. Use one of the orders the reference names.\n- `invalid_cursor`: The page cursor is not one this list returned. Start again from the first page, or pass the nextCursor you were given.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_filter","invalid_sort","invalid_cursor"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/{id}":{"get":{"operationId":"getImage","tags":["Images"],"summary":"Retrieve an image","description":"One image, with every live version newest first.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The image.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDetail"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"patch":{"operationId":"renameImage","tags":["Images"],"summary":"Name an image","description":"The person's name for it, cleaned to a printable label; `null` or a blank gives back its file's name. Its files download under it.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"description":"The name, or null to give back the file's."}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"The image, renamed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDetail"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"deleteImage","tags":["Images"],"summary":"Delete an image","description":"Into Recently deleted, restorable for 30 days (POST /images/{id}/restore); then every version and its files are erased. Converting the same bytes again brings it back. Its unlock, if paid, is never lost.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The image, in Recently deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDetail"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `conversion_running`: The image is still converting. Wait for it to finish, then try again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","conversion_running"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/{id}/restore":{"post":{"operationId":"restoreImage","tags":["Images"],"summary":"Restore an image","description":"Back from Recently deleted, every version with it.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The image, back in the library.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDetail"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/{id}/erase":{"post":{"operationId":"eraseImage","tags":["Images"],"summary":"Erase an image now","description":"Before its 30 days: its versions are erased and their files deleted; it cannot be restored after. Only from Recently deleted: an image in the library is 409 `not_deleted` (delete it first).","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"Erased.","content":{"application/json":{"schema":{"type":"object","properties":{"erased":{"type":"integer","minimum":0,"description":"How many versions were erased for good (their files deleted)."}},"required":["erased"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_deleted`: The image is not in Recently deleted. Delete it first, or leave it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_deleted"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/{id}/conversions":{"post":{"operationId":"createImageConversion","tags":["Images"],"summary":"Convert an image again","description":"A new version of the image with today's engine, from the bytes it was made from: the API copies them (its result's kept original, else a version's upload while kept), so nothing is uploaded again. Every rule of POST /conversions applies: free (an unlocked image's re-runs always are), counted by the daily caps. `options` absent keeps the newest version's; `{\"maxColors\": N}` redraws it with at most N colors (GET /conversions/{id}/palette previews it first). 409 `original_not_kept` when the image's file is no longer kept: upload it again.","x-plane":"data","x-guest-allowed":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},{"name":"Retry-After","in":"header","required":false,"description":"On a 429 (`free_limit_reached`, or every free conversion together reaching today's shared capacity of 2000): seconds until the caps renew, the next UTC midnight. On a 409 `too_many_active_jobs` (guest 1, free 1, paid 5 at once): wait for one to end, or send `queue: true`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"idempotencyKey":{"type":"string","minLength":8,"maxLength":200,"x-error-code":"invalid_idempotency_key"},"options":{"type":"object","properties":{"maxColors":{"description":"Redraw with at most this many colors, the ground included (2 to 24).","type":"integer","minimum":2,"maximum":24,"x-error-code":"invalid_options"}},"additionalProperties":false,"x-error-code":"invalid_options","description":"Optional choices about this image beside its preset. `{}` for none. Two conversions share a cached result only with the same options. Not offered yet: `merge` (a redraw that merges two colors is not offered yet; merge them in the Colors tab, or ask for fewer colors)."}},"required":["idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"A replay: the conversion this key already made.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedConversion"}}}},"201":{"description":"The new version.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedConversion"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_idempotency_key`: The idempotency key is too short, too long or has characters we do not take. Send a UUID, or 8 to 200 letters, digits and . _ : ~ -\n- `invalid_options`: An option is out of bounds or not offered yet. Read the message for the bounds, or leave the option out.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `unsupported_type`: We do not convert that kind of file. Send one of the formats the message lists.\n- `file_empty`: The file has no bytes. Upload the file again.\n- `file_too_large`: The file is over the size limit. Send a smaller file.\n- `invalid_size`: The declared size is not a positive whole number of bytes. Send the file's exact size in bytes.\n- `dimensions_too_large`: The image is wider or taller than we convert. Send an image of at most the limit on each side.\n- `malformed_image`: The file is not a readable image of the type it claims. Export the image again and send that file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","invalid_idempotency_key","invalid_options","malformed_body","unsupported_type","file_empty","file_too_large","invalid_size","dimensions_too_large","malformed_image"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"402":{"description":"- `insufficient_credits`: There are not enough credits for this unlock. None was spent. Buy credits, then send the same request again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["insufficient_credits"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `too_many_active_jobs`: Your conversions running at once are at their limit. Wait for one to finish, or send queue: true to wait in line.\n- `idempotency_key_reused`: That idempotency key was used for a different request. Make a new key for a new request.\n- `unlock_pending`: A conversion of this image is already unlocking it. Wait for that conversion to finish.\n- `original_not_kept`: The image's file is no longer kept, so it cannot be converted again. Upload the file again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","too_many_active_jobs","idempotency_key_reused","unlock_pending","original_not_kept"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.\n- `free_limit_reached`: Today's free conversions are used. Come back after Retry-After (UTC midnight), or unlock with a credit.\n- `free_capacity_reached`: Everyone's free conversions for today are used. Come back after Retry-After (UTC midnight), or unlock with a credit.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited","free_limit_reached","free_capacity_reached"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/unlock":{"post":{"operationId":"unlockImages","tags":["Images"],"summary":"Unlock several images","description":"1 credit per image not yet unlocked, in ONE transaction: all or nothing. A short balance unlocks none (402); so does an image with no finished result (409 `not_ready`) or whose hold is still running (409 `unlock_pending`). An image already unlocked spends nothing, so a retry is safe.","x-plane":"data","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"description":"The images, by their ids in GET /images. A repeat is read once.","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}},"required":["ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Every image asked is unlocked.","content":{"application/json":{"schema":{"type":"object","properties":{"unlocked":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"description":"Every image asked: each unlocked now, by this call or before it."},"spent":{"type":"integer","minimum":0,"description":"What THIS call spent: the cost of the images it unlocked."}},"required":["unlocked","spent"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"402":{"description":"- `insufficient_credits`: There are not enough credits for this unlock. None was spent. Buy credits, then send the same request again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["insufficient_credits"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `not_ready`: The conversion is still running. Wait for it to finish (a webhook, the events stream, or a read), then ask again.\n- `unlock_pending`: A conversion of this image is already unlocking it. Wait for that conversion to finish.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","not_ready","unlock_pending"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/delete":{"post":{"operationId":"deleteImages","tags":["Images"],"summary":"Delete several images","description":"ONE transaction, each image's outcome said back. Partial by design: one still converting is refused (`converting`) and the others are still deleted. Restorable for 30 days (POST /images/restore). A repeat keeps the first date (`already_deleted`); another's is `not_found`.","x-plane":"data","x-guest-allowed":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"description":"The images, by their ids in GET /images. A repeat is read once.","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}},"required":["ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"What became of each image asked.","content":{"application/json":{"schema":{"type":"object","properties":{"outcomes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"outcome":{"type":"string","enum":["deleted","already_deleted","converting","not_found"]}},"required":["id","outcome"]},"description":"Each image's outcome, in the order asked."}},"required":["outcomes"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/restore":{"post":{"operationId":"restoreImages","tags":["Images"],"summary":"Restore several images","description":"ONE transaction, each image's outcome said back: `restored`, `in_library` (nothing to do), `not_found` (another's, or past its window). A delete's Undo.","x-plane":"data","x-guest-allowed":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"description":"The images, by their ids in GET /images. A repeat is read once.","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}},"required":["ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"What became of each image asked.","content":{"application/json":{"schema":{"type":"object","properties":{"outcomes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"outcome":{"type":"string","enum":["restored","in_library","not_found"]}},"required":["id","outcome"]},"description":"Each image's outcome, in the order asked."}},"required":["outcomes"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/images/erase":{"post":{"operationId":"eraseImages","tags":["Images"],"summary":"Erase images now","description":"With `{ ids }`: those images, in ONE transaction, each one's outcome said back: `erased`, `not_deleted` (it is in the library: only Recently deleted is erased now), `not_found`. With `{ all: true }`: every image in Recently deleted (\"Erase all now\"); \"all\" is said, never inferred. Exactly one of the two. Versions erased are gone for good, their files deleted.","x-plane":"data","x-guest-allowed":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"description":"The images, by their ids in GET /images. A repeat is read once.","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},"all":{"description":"Every image in Recently deleted.","type":"boolean","const":true}},"additionalProperties":false}}}},"responses":{"200":{"description":"What became of each image asked.","content":{"application/json":{"schema":{"type":"object","properties":{"outcomes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"outcome":{"type":"string","enum":["erased","not_deleted","not_found"]}},"required":["id","outcome"]},"description":"Each image's outcome, in the order asked (none with `all`)."},"versions":{"type":"integer","minimum":0,"description":"How many versions were erased for good."}},"required":["outcomes","versions"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/palettes":{"get":{"operationId":"listPalettes","tags":["Colors"],"summary":"List palettes","description":"The account's palettes, the last changed first: at most 20, in one page.","x-plane":"data","parameters":[],"responses":{"200":{"description":"Its palettes.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Palette"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]}},"required":["object","data","hasMore","nextCursor"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"post":{"operationId":"createPalette","tags":["Colors"],"summary":"Save a palette","description":"A new palette; an account keeps at most 20 (409 `palette_limit`).","x-plane":"data","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"Trimmed."},"colors":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":24,"description":"`#rrggbb`, either case; a repeated one is kept once."}},"required":["name","colors"],"additionalProperties":false,"x-error-code":"invalid_palette"}}}},"responses":{"200":{"description":"The palette, as saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Palette"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_palette`: The palette's name or colors cannot be taken. Give it a name and 1 to 24 distinct #rrggbb colors.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_palette","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `palette_limit`: The account has the most palettes it can keep. Delete a palette, then save the new one.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","palette_limit"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/palettes/{id}":{"patch":{"operationId":"updatePalette","tags":["Colors"],"summary":"Change a palette","description":"Its name and colors, whole. Another's is 404 `palette_not_found`, the same as none.","x-plane":"data","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"Trimmed."},"colors":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":24,"description":"`#rrggbb`, either case; a repeated one is kept once."}},"required":["name","colors"],"additionalProperties":false,"x-error-code":"invalid_palette"}}}},"responses":{"200":{"description":"The palette, as saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Palette"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_palette`: The palette's name or colors cannot be taken. Give it a name and 1 to 24 distinct #rrggbb colors.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","invalid_palette","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `palette_not_found`: There is no such palette in this account. Use a palette id GET /palettes listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["palette_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"deletePalette","tags":["Colors"],"summary":"Delete a palette","description":"Removed for good. Another's is 404 `palette_not_found`, the same as none.","x-plane":"data","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"deleted":{"type":"boolean","const":true}},"required":["id","deleted"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"404":{"description":"- `palette_not_found`: There is no such palette in this account. Use a palette id GET /palettes listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["palette_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/api-keys":{"post":{"operationId":"createApiKey","tags":["API keys"],"summary":"Make an API key","description":"A new key and its secret, shown once. At most 10 live keys per mode (409 `api_key_limit`). A live key needs a paid plan (403 `plan_required`); a test key is free.","x-plane":"management","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"What it is for, to tell it from the others (\"Zapier\", \"staging\")."},"mode":{"type":"string","enum":["live","test"]}},"required":["name","mode"],"additionalProperties":false}}}},"responses":{"201":{"description":"The key, with its secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `api_key_limit`: The account has the most keys of this mode it can keep. Revoke a key you no longer use, then make the new one.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","api_key_limit"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"get":{"operationId":"listApiKeys","tags":["API keys"],"summary":"List API keys","description":"The account's keys, newest first: those working, and those that stopped in the last week. Never a secret.","x-plane":"management","parameters":[],"responses":{"200":{"description":"Its keys.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]}},"required":["object","data","hasMore","nextCursor"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/api-keys/{id}":{"patch":{"operationId":"updateApiKey","tags":["API keys"],"summary":"Rename an API key, or note where it is kept","description":"Its `name`, its `note` (null clears it), or both. Another account's is 404, the same as none.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60,"description":"What it is for, to tell it from the others (\"Zapier\", \"staging\")."},"note":{"description":"\"1Password\", \"the Vercel env\"; null clears it.","anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]}},"additionalProperties":false}}}},"responses":{"200":{"description":"The key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `api_key_not_found`: There is no such key in this account. Use a key id GET /api-keys listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["api_key_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"revokeApiKey","tags":["API keys"],"summary":"Revoke an API key","description":"It stops working now. Revoking it again changes nothing. Another account's is 404, the same as none.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The key, revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `api_key_not_found`: There is no such key in this account. Use a key id GET /api-keys listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["api_key_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/api-keys/{id}/roll":{"post":{"operationId":"rollApiKey","tags":["API keys"],"summary":"Roll an API key","description":"A new key in its place (the same name and mode), its secret shown once; the old key keeps working for `graceSeconds` (0: it stops now), time to deploy the new one.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"graceSeconds":{"anyOf":[{"type":"number","const":0},{"type":"number","const":3600},{"type":"number","const":86400},{"type":"number","const":604800}],"description":"0, an hour, a day or a week."}},"required":["graceSeconds"],"additionalProperties":false}}}},"responses":{"201":{"description":"The new key, with its secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiKey"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required","plan_required"]}}}}}]}}}},"404":{"description":"- `api_key_not_found`: There is no such key in this account. Use a key id GET /api-keys listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["api_key_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/api-requests":{"get":{"operationId":"listApiRequests","tags":["API keys"],"summary":"List the requests your keys made","description":"The request log of one MODE (all its keys), newest first, a page at a time (pass `nextCursor` back as `cursor`): each request's operation, answer, refusal and request id, for 30 days. With `errors=true`, only answers of 400 and up.","x-plane":"management","parameters":[{"name":"mode","in":"query","required":true,"description":"`test` or `live`.","schema":{"type":"string","enum":["live","test"]}},{"name":"errors","in":"query","required":false,"description":"`true`: only refusals.","schema":{"enum":["true","false"],"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"A page's `nextCursor`.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of the log.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiRequestList"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_cursor`: The page cursor is not one this list returned. Start again from the first page, or pass the nextCursor you were given.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_cursor"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/webhook-endpoints":{"post":{"operationId":"createWebhookEndpoint","tags":["Webhooks"],"summary":"Add a webhook endpoint","description":"A new endpoint and its signing secret, shown once. At most 10 per mode (409 `webhook_endpoint_limit`). A live one needs Pro (403 `plan_required`); a test one is free. The URL must be public `https` (400 `invalid_url`) and resolve now (400 `url_unreachable`).","x-plane":"management","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2048,"description":"A public `https` URL on the standard port."},"mode":{"type":"string","enum":["live","test"]},"events":{"description":"Default: every event.","minItems":1,"maxItems":3,"type":"array","items":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."}},"description":{"type":"string","minLength":1,"maxLength":120,"description":"What it is for (\"production\", \"Zapier\")."}},"required":["url","mode"],"additionalProperties":false}}}},"responses":{"201":{"description":"The endpoint, with its secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedWebhookEndpoint"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `invalid_url`: We do not fetch that URL: only https on the standard port, with no user name or password, on the public internet. Send a public https link to the image, or the image itself.\n- `url_unreachable`: We could not fetch the image at that URL: no answer, a missing page, too slow, too many redirects, or too large. Read the message for which. Check the link opens in a private window, or send the image itself.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body","invalid_url","url_unreachable"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `webhook_endpoint_limit`: The account has the most webhook endpoints of this mode it can keep. Delete an endpoint you no longer use, then add the new one.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","webhook_endpoint_limit"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"get":{"operationId":"listWebhookEndpoints","tags":["Webhooks"],"summary":"List webhook endpoints","description":"One mode's endpoints, newest first. Never a secret.","x-plane":"management","parameters":[{"name":"mode","in":"query","required":true,"description":"`test` or `live`.","schema":{"type":"string","enum":["live","test"]}}],"responses":{"200":{"description":"Its endpoints.","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}},"hasMore":{"type":"boolean","description":"Whether a next page exists."},"nextCursor":{"description":"Pass it as `cursor` for the next page; null on the last.","type":["string","null"]}},"required":["object","data","hasMore","nextCursor"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/webhook-endpoints/{id}":{"patch":{"operationId":"updateWebhookEndpoint","tags":["Webhooks"],"summary":"Change a webhook endpoint, or turn it off and on","description":"Its `url`, `description` (null clears it), `events`, or `enabled`: `false` stops its events; `true` turns it back on and forgets its failures (a live one needs Pro). Another account's is 404, the same as none.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2048,"description":"A public `https` URL on the standard port."},"description":{"anyOf":[{"type":"string","minLength":1,"maxLength":120,"description":"What it is for (\"production\", \"Zapier\")."},{"type":"null"}]},"events":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."}},"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"The endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `invalid_url`: We do not fetch that URL: only https on the standard port, with no user name or password, on the public internet. Send a public https link to the image, or the image itself.\n- `url_unreachable`: We could not fetch the image at that URL: no answer, a missing page, too slow, too many redirects, or too large. Read the message for which. Check the link opens in a private window, or send the image itself.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body","invalid_url","url_unreachable"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required","plan_required"]}}}}}]}}}},"404":{"description":"- `webhook_endpoint_not_found`: There is no such webhook endpoint in this account. Use an endpoint id GET /webhook-endpoints listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["webhook_endpoint_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"deleteWebhookEndpoint","tags":["Webhooks"],"summary":"Delete a webhook endpoint","description":"No more events go to it, and its deliveries are forgotten. Another account's is 404, the same as none.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The endpoint, deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `webhook_endpoint_not_found`: There is no such webhook endpoint in this account. Use an endpoint id GET /webhook-endpoints listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["webhook_endpoint_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/webhook-endpoints/{id}/roll":{"post":{"operationId":"rollWebhookSecret","tags":["Webhooks"],"summary":"Roll a webhook endpoint's signing secret","description":"A new secret, shown once. The old one keeps signing too for `graceSeconds` (0: it stops now): every event carries both signatures meanwhile, so your server verifies with either while you deploy the new one.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"graceSeconds":{"anyOf":[{"type":"number","const":0},{"type":"number","const":3600},{"type":"number","const":86400}],"description":"0, an hour or a day."}},"required":["graceSeconds"],"additionalProperties":false}}}},"responses":{"201":{"description":"The endpoint, with its new secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedWebhookEndpoint"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `webhook_endpoint_not_found`: There is no such webhook endpoint in this account. Use an endpoint id GET /webhook-endpoints listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["webhook_endpoint_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/webhook-endpoints/{id}/test":{"post":{"operationId":"testWebhookEndpoint","tags":["Webhooks"],"summary":"Send an example event","description":"An event of `type` carrying an EXAMPLE conversion, signed and sent now: once, never retried, even to an endpoint that is off. The answer is its delivery, what your server said.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["conversion.completed","conversion.failed","conversion.expired"],"description":"`conversion.completed` (its result is ready), `conversion.failed` or `conversion.expired` (it ended without one)."}},"required":["type"],"additionalProperties":false}}}},"responses":{"200":{"description":"The example's delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDelivery"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `webhook_endpoint_not_found`: There is no such webhook endpoint in this account. Use an endpoint id GET /webhook-endpoints listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["webhook_endpoint_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/webhook-deliveries":{"get":{"operationId":"listWebhookDeliveries","tags":["Webhooks"],"summary":"List webhook deliveries","description":"One mode's deliveries (one endpoint's, with `endpoint`), newest first, a page at a time (pass `nextCursor` back as `cursor`): where each is and what the endpoint answered, for 30 days; and today's figures.","x-plane":"management","parameters":[{"name":"mode","in":"query","required":true,"description":"`test` or `live`.","schema":{"type":"string","enum":["live","test"]}},{"name":"endpoint","in":"query","required":false,"description":"One endpoint's only.","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":100}},{"name":"cursor","in":"query","required":false,"description":"A page's `nextCursor`.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of deliveries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryList"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_cursor`: The page cursor is not one this list returned. Start again from the first page, or pass the nextCursor you were given.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_cursor"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/webhook-deliveries/{id}/retry":{"post":{"operationId":"retryWebhookDelivery","tags":["Webhooks"],"summary":"Retry a failed webhook delivery","description":"A delivery that failed (or was withheld) is sent once more, now. One that was delivered, or is still on its way, is 409 `webhook_delivery_pending`.","x-plane":"management","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"responses":{"200":{"description":"The delivery, after the attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDelivery"}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `webhook_delivery_not_found`: There is no such webhook delivery in this account. Use a delivery id GET /webhook-deliveries listed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["webhook_delivery_not_found"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `webhook_delivery_pending`: That delivery did not end in a failure: it was delivered, or it is still on its way. Retry only a delivery that failed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","webhook_delivery_pending"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/usage":{"get":{"operationId":"getUsage","tags":["API keys"],"summary":"Read your usage","description":"One mode's conversions over the last `days` UTC days (today included): the totals, today's, each day's (every day, zero ones too) and each key's: conversions made, those that ended without a result, and the credits spent.","x-plane":"management","parameters":[{"name":"mode","in":"query","required":true,"description":"`test` or `live`.","schema":{"type":"string","enum":["live","test"]}},{"name":"days","in":"query","required":false,"description":"How many UTC days, today included (1: today alone).","schema":{"enum":[1,7,30],"default":30,"type":"integer"}}],"responses":{"200":{"description":"The usage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/account":{"get":{"operationId":"getAccount","tags":["Account"],"summary":"Retrieve the account's settings","description":"Its analytics switch and its product news, and whose they are.","x-plane":"management","parameters":[],"responses":{"200":{"description":"The settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountSettings"}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"patch":{"operationId":"updateAccount","tags":["Account"],"summary":"Change the account's settings","description":"One setting or both. `allowAnalytics: false`: analytics stops following this account as a person; the page sends nothing, and the API's events are counted without the person. `productNews`: product news emailed or not (each answer is kept, with when it was given).","x-plane":"management","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"allowAnalytics":{"type":"boolean"},"productNews":{"type":"boolean"}},"additionalProperties":false,"minProperties":1}}}},"responses":{"200":{"description":"The settings, as now stored.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountSettings"}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"deleteAccount","tags":["Account"],"summary":"Erase the account","description":"Anonymizes the profile, deletes the sign-in, and removes every stored input, output and preview the account owns. **Irreversible**, so the body must carry `{\"confirm\": \"DELETE MY ACCOUNT\"}`. A plan that still RENEWS refuses it (409 `plan_active`: cancel it first); one whose cancel is scheduled ends now, so an erased account is never billed again. Anonymized credit-ledger rows are kept: the seller of record needs the financial record to outlive the customer.","x-plane":"management","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"string","const":"DELETE MY ACCOUNT","x-error-code":"confirmation_required"}},"required":["confirm"],"additionalProperties":false}}}},"responses":{"200":{"description":"Erased.","content":{"application/json":{"schema":{"type":"object","properties":{"erased":{"type":"boolean","const":true},"objectsDeleted":{"type":"integer","minimum":0,"description":"The storage objects removed."},"objectsFailed":{"type":"integer","minimum":0,"description":"Objects that could not be removed (an operator's alert; the account is erased regardless)."},"note":{"type":"string","description":"What is kept, and why, in a sentence."}},"required":["erased","objectsDeleted","objectsFailed","note"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `confirmation_required`: Erasing an account needs the typed confirmation in the body. Send the exact phrase the reference shows.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","confirmation_required","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `plan_active`: The account's plan still renews. Cancel the plan first.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","plan_active"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.\n- `purchases_unavailable`: Purchases are not open on this deployment. Try again later.\n- `billing_unavailable`: Billing could not be reached just now. Try again in a few minutes.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable","purchases_unavailable","billing_unavailable"]}}}}}]}}}}}}},"/credits":{"get":{"operationId":"getCredits","tags":["Account"],"summary":"Retrieve the credit balance","description":"Derived from the ledger on every call: there is no balance column, since a cached total drifts under partial failure and the customer is the one who finds out. `unlockCost` is what unlocking one image costs, published so a client never hardcodes it; `tier` says which caps apply.","x-plane":"data","parameters":[],"responses":{"200":{"description":"Balance and entitlement.","content":{"application/json":{"schema":{"type":"object","properties":{"balance":{"type":"integer","minimum":0},"tier":{"type":"string","enum":["free","paid"]},"unlockCost":{"type":"integer","minimum":1}},"required":["balance","tier","unlockCost"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/limits":{"get":{"operationId":"getLimits","tags":["Account"],"summary":"Retrieve today's limits","description":"The caps that apply to the caller (a guest, a free account or a customer) and how much of today is used: the same count the create refuses by. `usedToday` counts free conversions (waiting ones included) and refunded holds; a stopped one never ran and is not counted.","x-plane":"data","x-guest-allowed":true,"parameters":[],"responses":{"200":{"description":"Today's limits.","content":{"application/json":{"schema":{"type":"object","properties":{"activeAtOnce":{"type":"integer","minimum":1,"description":"How many may run at once; with `queue: true` the rest wait."},"dailyFree":{"type":"integer","minimum":0,"description":"Free conversions a UTC day allows."},"usedToday":{"type":"integer","minimum":0},"resetsAt":{"type":"string","format":"date-time","description":"The next UTC midnight."}},"required":["activeAtOnce","dailyFree","usedToday","resetsAt"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `plan_required`: Live API keys and live webhooks come with the Pro plan, and this account is not on Pro. Choose Pro, or use test mode: it is free.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","plan_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/prices":{"get":{"operationId":"getPrices","tags":["Billing"],"summary":"Retrieve the prices","description":"Public. One entry per sold item: each credit pack, and each plan level billed by `month` or `year`. `amount` is in the currency's MINOR units, so no float carries money. Cached for 5 minutes.","security":[],"x-plane":"public","parameters":[{"name":"country","in":"query","required":false,"description":"ISO 3166-1 alpha-2, in capitals. Absent: the country the request comes from, if known.","schema":{"type":"string","pattern":"^[A-Z]{2}$","x-error-code":"invalid_country"}}],"responses":{"200":{"description":"The price sheet.","content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string","description":"ISO 4217."},"source":{"type":"string","enum":["list","localized"],"description":"`list`: our USD list price before tax; `localized`: its preview for the visitor's country, in their currency."},"taxIncluded":{"type":"boolean","description":"Whether `amount` includes tax (where that is the local norm, on a localized sheet)."},"items":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"key":{"type":"string"},"kind":{"type":"string","const":"pack"},"packId":{"type":"string"},"credits":{"type":"integer","minimum":1},"amount":{"type":"integer","minimum":0}},"required":["key","kind","packId","credits","amount"]},{"type":"object","properties":{"key":{"type":"string","description":"`<plan>-<monthly credits>:<interval>`."},"kind":{"type":"string","const":"plan"},"plan":{"type":"string","enum":["starter","pro"]},"credits":{"type":"integer","minimum":1,"description":"What the plan level grants each month."},"interval":{"type":"string","enum":["month","year"]},"amount":{"type":"integer","minimum":0,"description":"Minor units of `currency` (cents): no float carries money."}},"required":["key","kind","plan","credits","interval","amount"]}]}}},"required":["currency","source","taxIncluded","items"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_country`: The country is not a two-letter ISO 3166 code. Send a code like US or SG, or leave it out.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_country"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/checkout":{"post":{"operationId":"startCheckout","tags":["Billing"],"summary":"Start a purchase","description":"A credit pack (credits once) or a plan level (a subscription), named by its key in GET /prices. Answers the provider's hosted checkout: send the browser to `url`. A plan is bought once and CHANGED afterwards (POST /subscription/change): a second plan's checkout is 409 `already_subscribed`. The price is the provider's, stated on its page; credits arrive when it reports the payment.","x-plane":"management","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"item":{"type":"string","enum":["pack-20","pack-50","pack-200","pack-1000","pack-5000","starter-100:month","starter-100:year","pro-200:month","pro-200:year","pro-500:month","pro-500:year","pro-1000:month","pro-1000:year","pro-2500:month","pro-2500:year","pro-5000:month","pro-5000:year","pro-10000:month","pro-10000:year"],"description":"What is bought: its key in GET /prices."}},"required":["item"],"additionalProperties":false}}}},"responses":{"200":{"description":"Send the browser to `url`.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"item":{"anyOf":[{"type":"object","properties":{"key":{"type":"string"},"kind":{"type":"string","const":"pack"},"credits":{"type":"integer","minimum":1},"label":{"type":"string"}},"required":["key","kind","credits","label"]},{"type":"object","properties":{"key":{"type":"string"},"kind":{"type":"string","const":"plan"},"credits":{"type":"integer","minimum":1},"plan":{"type":"string","enum":["starter","pro"]},"interval":{"type":"string","enum":["month","year"]}},"required":["key","kind","credits","plan","interval"]}],"description":"What is bought, echoed: a client shows it without keeping its own copy of the catalog."}},"required":["url","item"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `unknown_pack`: There is no credit pack by that name. Use one of the items GET /prices lists.\n- `unknown_plan`: There is no plan level by that name. Use one of the plan items GET /prices lists.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","malformed_body","unknown_pack","unknown_plan"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `already_subscribed`: This account already has a plan. Change the plan instead of buying another.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","already_subscribed"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.\n- `purchases_unavailable`: Purchases are not open on this deployment. Try again later.\n- `checkout_unavailable`: Checkout is not open yet. Try again later.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable","purchases_unavailable","checkout_unavailable"]}}}}}]}}}}}}},"/subscription":{"get":{"operationId":"getSubscription","tags":["Billing"],"summary":"Retrieve the plan","description":"The account's plan (null without one), and its credits by POCKET: `plan` credits, spent first and expiring 30 days after a lapse, and `kept`, which never expire. `plan + kept` is the balance.","x-plane":"management","parameters":[],"responses":{"200":{"description":"The plan and the pockets.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"anyOf":[{"type":"object","properties":{"level":{"description":"What the account HAS: the level last paid for (before the first payment lands, the one being bought).","$ref":"#/components/schemas/PlanLevel"},"status":{"type":"string","enum":["active","past_due","paused","canceled"]},"then":{"anyOf":[{"$ref":"#/components/schemas/PlanLevel"},{"type":"null"}],"description":"What the next bill buys when it differs: a downgrade or an interval switch waiting for the renewal."},"periodEnd":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"The end of what was paid: the renewal, or the end when a cancel is scheduled."},"renewsAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the provider will next bill; null when none is coming."},"nextCreditsAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When the next month of credits arrives; null when no more are coming."},"cancelAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"A cancel scheduled at the provider: when it takes effect."},"endedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"When it stopped being live."},"lapsesAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Once it stopped: when what remains of its credits expires."}},"required":["level","status","then","periodEnd","renewsAt","nextCreditsAt","cancelAt","endedAt","lapsesAt"]},{"type":"null"}]},"pockets":{"type":"object","properties":{"plan":{"type":"integer","minimum":0},"kept":{"type":"integer","minimum":0}},"required":["plan","kept"]}},"required":["plan","pockets"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/subscription/change":{"post":{"operationId":"changeSubscription","tags":["Billing"],"summary":"Change the plan","description":"Its level or billing period: an upgrade at once (charged the difference); a downgrade or a monthly/yearly switch at the renewal. Asking for the level the plan HAS while another waits for the renewal undoes the wait. `preview: true` answers what would be charged and changes nothing.","x-plane":"management","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"item":{"type":"string","enum":["starter-100:month","starter-100:year","pro-200:month","pro-200:year","pro-500:month","pro-500:year","pro-1000:month","pro-1000:year","pro-2500:month","pro-2500:year","pro-5000:month","pro-5000:year","pro-10000:month","pro-10000:year"],"x-error-code":"unknown_plan"},"preview":{"default":false,"type":"boolean"}},"required":["item"],"additionalProperties":false}}}},"responses":{"200":{"description":"What the change does, or did.","content":{"application/json":{"schema":{"type":"object","properties":{"to":{"$ref":"#/components/schemas/PlanLevel"},"when":{"type":"string","enum":["now","at_renewal"],"description":"`now`: an upgrade, charged and granted at once; `at_renewal`: the next bill, at `periodEnd`."},"periodEnd":{"type":"string","format":"date-time"},"chargeNow":{"anyOf":[{"type":"object","properties":{"minor":{"type":"integer"},"currency":{"type":"string","description":"ISO 4217."}},"required":["minor","currency"]},{"type":"null"}],"description":"What the provider charges now (a preview's), in minor units; null when nothing is, or it states no amount."},"applied":{"type":"boolean","description":"False for a preview: nothing changed."}},"required":["to","when","periodEnd","chargeNow","applied"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `unknown_plan`: There is no plan level by that name. Use one of the plan items GET /prices lists.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `same_plan`: The account is already on that plan level. Nothing to do. Pick another level to change it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","unknown_plan","malformed_body","same_plan"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `no_plan`: This account has no plan to act on. Subscribe first.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["no_plan"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `plan_past_due`: The plan's last payment did not go through. Update the payment method in the billing portal.\n- `plan_ending`: The plan is set to end. Keep the plan first, then change it.\n- `plan_renewal_pending`: A renewal is being paid right now. Try again in a few minutes.\n- `plan_renewing`: The plan renews in the next few minutes. Try again after the renewal.\n- `plan_switch_waiting`: A change of plan is already waiting for the next renewal. Wait for it, or keep the current plan.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","plan_past_due","plan_ending","plan_renewal_pending","plan_renewing","plan_switch_waiting"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.\n- `purchases_unavailable`: Purchases are not open on this deployment. Try again later.\n- `billing_unavailable`: Billing could not be reached just now. Try again in a few minutes.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable","purchases_unavailable","billing_unavailable"]}}}}}]}}}}}}},"/subscription/keep":{"post":{"operationId":"keepSubscription","tags":["Billing"],"summary":"Keep the plan","description":"Removes a scheduled cancel: the plan renews as before. Nothing scheduled: nothing to do, answered the same (a second press is safe).","x-plane":"management","parameters":[],"responses":{"200":{"description":"Kept.","content":{"application/json":{"schema":{"type":"object","properties":{"kept":{"type":"boolean","const":true}},"required":["kept"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `no_plan`: This account has no plan to act on. Subscribe first.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["no_plan"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `plan_past_due`: The plan's last payment did not go through. Update the payment method in the billing portal.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","plan_past_due"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.\n- `purchases_unavailable`: Purchases are not open on this deployment. Try again later.\n- `billing_unavailable`: Billing could not be reached just now. Try again in a few minutes.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable","purchases_unavailable","billing_unavailable"]}}}}}]}}}}}}},"/subscription/portal":{"post":{"operationId":"openBillingPortal","tags":["Billing"],"summary":"Open the billing page","description":"Short-lived links to the provider's billing page for the account's plan.","x-plane":"management","parameters":[],"responses":{"200":{"description":"Send the browser to one of them.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"The provider's overview: card and invoices."},"cancelUrl":{"type":"string","format":"uri","description":"Straight into the provider's cancellation flow."},"paymentMethodUrl":{"type":"string","format":"uri","description":"The card."}},"required":["url","cancelUrl","paymentMethodUrl"]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.\n- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `invalid_api_key`: The API key is unknown, revoked, past its end, or mistyped. Copy the key again, or make a new one on the developer page.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated","email_refused","email_unverified","account_exists","invalid_api_key"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `api_key_not_allowed`: An API key cannot do this: it manages the account, so only its signed-in owner may. Do it on vecsnap.com, signed in.\n- `account_required`: Trying without an account does not include this. Sign in or create an account. The conversions come with you.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified","api_key_not_allowed","account_required"]}}}}}]}}}},"404":{"description":"- `no_plan`: This account has no plan to act on. Subscribe first.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["no_plan"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.\n- `purchases_unavailable`: Purchases are not open on this deployment. Try again later.\n- `billing_unavailable`: Billing could not be reached just now. Try again in a few minutes.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable","purchases_unavailable","billing_unavailable"]}}}}}]}}}}}}},"/session":{"get":{"operationId":"getSession","tags":["Session"],"summary":"Retrieve the session","description":"Public and read-only: it admits, ends and erases nothing. `user` is the signed-in ACCOUNT, null when nobody is (or the session resolves to no live account); `guest` is a guest trying without an account (never an account: `user` stays null). `signInMethods` is what THIS deployment offers: `google`, `github` and `email` in production; `development` and `email` on the keyless local stack; and `guest` where trying without an account is offered. `captcha` is what an emailed code and a guest's start need (null: none).","security":[],"x-plane":"public","parameters":[],"responses":{"200":{"description":"The session.","content":{"application/json":{"schema":{"type":"object","properties":{"guest":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},"required":["id"]},{"type":"null"}]},"user":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"},"email":{"type":["string","null"]},"tier":{"type":"string","enum":["free","paid"]},"identities":{"type":"array","items":{"type":"string"},"description":"The sign-in methods the account has used."},"allowAnalytics":{"type":"boolean","description":"Its analytics switch (PATCH /account)."}},"required":["id","email","tier","identities","allowAnalytics"]},{"type":"null"}]},"signInMethods":{"type":"array","items":{"type":"string","enum":["google","github","email","development","guest"]}},"captcha":{"anyOf":[{"type":"object","properties":{"provider":{"type":"string","const":"turnstile"},"siteKey":{"type":"string"}},"required":["provider","siteKey"]},{"type":"null"}]}},"required":["guest","user","signInMethods","captcha"]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"post":{"operationId":"signIn","tags":["Session"],"summary":"Sign in, or start a guest","description":"`google` / `github`: answers the provider's page to navigate to; the exchange is server-side (PKCE), its verifier a cookie on this response. `email` with `email` + `code`, or with the emailed link's `tokenHash`: signs in (the session's cookies on this response) and answers `{ next }`. Every sign-in admits the account (one per person), and a sign-in made from a guest's session moves the guest's conversions into it. `guest` with `captchaToken` (where `signInMethods` offers it): starts a guest (201), or answers 200 with the guest this browser already has.","security":[],"x-plane":"public","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["google","github","email","guest"],"x-error-code":"unknown_provider"},"next":{"description":"Where to land afterwards: reduced to a path on this origin.","type":"string"},"email":{"description":"`email` with `code`: the address the code was asked for.","type":"string","x-error-code":"invalid_email"},"code":{"description":"`email`: the six digits from the email.","type":"string","x-error-code":"code_invalid"},"tokenHash":{"description":"`email`: the emailed link's token, instead of `email` + `code`.","type":"string","x-error-code":"code_invalid"},"captchaToken":{"description":"`guest`: the challenge's token (`captcha` in GET /session).","type":"string","x-error-code":"captcha_failed"},"analyticsId":{"description":"The page's anonymous analytics id, joined to the account at sign-in (analytics only).","type":"string"},"news":{"description":"The sign-up box: product news for an account this sign-in CREATES; on unless `false`.","type":"boolean"}},"required":["provider"],"additionalProperties":false}}}},"responses":{"200":{"description":"OAuth: the provider's `url`. Email: signed in, and where to go (`next`). Guest: the guest this browser already has.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]},{"type":"object","properties":{"next":{"type":"string"}},"required":["next"]},{"type":"object","properties":{"guest":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},"required":["id"]}},"required":["guest"]}]}}}},"201":{"description":"Guest: a new guest started; its session's cookies on this response.","content":{"application/json":{"schema":{"type":"object","properties":{"guest":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}},"required":["id"]}},"required":["guest"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `unknown_provider`: That is not a way to sign in here. Use one of the methods GET /session offers.\n- `invalid_email`: That is not an email address. Check the address and send it again.\n- `code_invalid`: The sign-in code is wrong, used or expired. Ask for a new code.\n- `captcha_failed`: The challenge was not passed. Complete the challenge again, then send the request.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","unknown_provider","invalid_email","code_invalid","captcha_failed","malformed_body"]}}}}}]}}}},"401":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.\n- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.\n- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused","email_unverified","account_exists"]}}}}}]}}}},"403":{"description":"- `email_unverified`: The sign-in provider has not verified this email address. Verify the address with the provider, or sign in with the email code.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_unverified"]}}}}}]}}}},"409":{"description":"- `account_exists`: An account already holds this email address under another spelling. Sign in with that account.\n- `already_signed_in`: An account is already signed in here. Sign out first to start a guest.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["account_exists","already_signed_in"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `sign_in_unavailable`: The sign-in provider could not be reached. Try again in a minute.\n- `sign_in_failed`: The sign-in provider did not finish the sign-in. Start the sign-in again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["sign_in_unavailable","sign_in_failed"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}},"delete":{"operationId":"signOut","tags":["Session"],"summary":"Sign out","description":"Ends this browser's session only: the account stays signed in on its other devices. Idempotent: with no session it is still a 204.","security":[],"x-plane":"public","parameters":[],"responses":{"204":{"description":"Signed out; the session's cookies are cleared."},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `sign_out_failed`: The session could not be ended just now. Try again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["sign_out_failed"]}}}}}]}}}}}}},"/session/code":{"post":{"operationId":"requestSignInCode","tags":["Session"],"summary":"Email a sign-in code","description":"A six-digit code and its one-click link. 202 whether or not the address has an account, and whether or not sign-ups are open: no answer says which addresses exist. An alias of an existing account's address reaches that account (the same inbox). `captchaToken` is required where GET /session's `captcha` asks for one; one code per address a minute.","security":[],"x-plane":"public","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","x-error-code":"invalid_email"},"captchaToken":{"type":"string","x-error-code":"captcha_failed"},"next":{"description":"Where the emailed link lands: a path on this origin.","type":"string"},"news":{"description":"The sign-up box: product news for an account this sign-in CREATES; on unless `false`.","type":"boolean"}},"required":["email"],"additionalProperties":false}}}},"responses":{"202":{"description":"If the address may sign in, a code is on its way. `next` is the landing the server chose.","content":{"application/json":{"schema":{"type":"object","properties":{"sent":{"type":"boolean","const":true},"next":{"type":"string"}},"required":["sent","next"]}}}},"400":{"description":"- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `invalid_email`: That is not an email address. Check the address and send it again.\n- `captcha_failed`: The challenge was not passed. Complete the challenge again, then send the request.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_request","invalid_email","captcha_failed","malformed_body"]}}}}}]}}}},"401":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"422":{"description":"- `email_refused`: We do not open accounts for that email domain. Use another address.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["email_refused"]}}}}}]}}}},"429":{"description":"- `rate_limited`: Too many requests in a short time. Wait the Retry-After seconds, then send it again.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["rate_limited"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"502":{"description":"- `code_unavailable`: The sign-in email could not be sent just now. Try again in a minute.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["code_unavailable"]}}}}}]}}}},"503":{"description":"- `auth_unavailable`: We could not check who you are just now. You are not signed out. Send it again in a few seconds.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["auth_unavailable"]}}}}}]}}}}}}},"/session/callback":{"get":{"operationId":"finishOAuthSignIn","tags":["Session"],"summary":"Finish an OAuth sign-in","description":"Where the provider returns the browser: exchanges its code for a session and redirects (303) to the validated `next`, or to `/signin?error=` with a code from a closed vocabulary, never the provider's text. A browser's road, never an API client's.","security":[],"x-plane":"public","parameters":[],"responses":{"303":{"description":"A redirect on this deployment's own origin."},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/cron/reconcile":{"get":{"operationId":"runReconcile","tags":["Operator"],"summary":"Reconcile conversions","description":"Expires the conversions that outlived their time (their credit refunded) and starts what waits in line. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`examined`, `expired`, `started`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runReconcileNow","tags":["Operator"],"summary":"Reconcile conversions (by hand)","description":"Expires the conversions that outlived their time (their credit refunded) and starts what waits in line. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`examined`, `expired`, `started`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/cron/retention":{"get":{"operationId":"runRetention","tags":["Operator"],"summary":"Sweep expired inputs and erased images","description":"Deletes the uploads past their retention, and the images whose time in Recently deleted is over. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"Each half's counts; `failed` and `foreign` each their own signal.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runRetentionNow","tags":["Operator"],"summary":"Sweep expired inputs and erased images (by hand)","description":"Deletes the uploads past their retention, and the images whose time in Recently deleted is over. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"Each half's counts; `failed` and `foreign` each their own signal.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/cron/forget":{"get":{"operationId":"runForget","tags":["Operator"],"summary":"Forget erased accounts in analytics","description":"Deletes the erased accounts from the analytics store. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`forgotten`, and `truncated` when more are owed.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runForgetNow","tags":["Operator"],"summary":"Forget erased accounts in analytics (by hand)","description":"Deletes the erased accounts from the analytics store. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`forgotten`, and `truncated` when more are owed.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/cron/guests":{"get":{"operationId":"runGuests","tags":["Operator"],"summary":"Erase idle guests","description":"Erases the guests whose try ended long ago, with what they converted. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`erased`, `skipped`, `failed`, `objectsLeft`, `truncated`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runGuestsNow","tags":["Operator"],"summary":"Erase idle guests (by hand)","description":"Erases the guests whose try ended long ago, with what they converted. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`erased`, `skipped`, `failed`, `objectsLeft`, `truncated`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/cron/billing":{"get":{"operationId":"runBilling","tags":["Operator"],"summary":"Run the plans' timetable","description":"Grants the plan months that came due, expires lapsed plan pockets, and reports plans billed past what was paid. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`months` (granted, credits, zero, failed, truncated), `expired`, `unbilled`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runBillingNow","tags":["Operator"],"summary":"Run the plans' timetable (by hand)","description":"Grants the plan months that came due, expires lapsed plan pockets, and reports plans billed past what was paid. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`months` (granted, credits, zero, failed, truncated), `expired`, `unbilled`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/cron/email":{"get":{"operationId":"runEmail","tags":["Operator"],"summary":"Send the emails still owed","description":"Every email queued and never taken, taken under a lease that ran out, or refused and due again. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`taken`: how many this run took.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runEmailNow","tags":["Operator"],"summary":"Send the emails still owed (by hand)","description":"Every email queued and never taken, taken under a lease that ran out, or refused and due again. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`taken`: how many this run took.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/cron/webhooks":{"get":{"operationId":"runWebhooks","tags":["Operator"],"summary":"Send the webhooks still owed","description":"Every webhook delivery due (never taken because its request ended first, taken under a lease that ran out, or failed and due again on its schedule) sent now; then the events past 30 days pruned. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`taken`: how many deliveries this run took.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"runWebhooksNow","tags":["Operator"],"summary":"Send the webhooks still owed (by hand)","description":"Every webhook delivery due (never taken because its request ended first, taken under a lease that ran out, or failed and due again on its schedule) sent now; then the events past 30 days pruned. Needs the cron secret (a bearer token).","security":[{"cronSecret":[]}],"x-plane":"operator","parameters":[],"responses":{"200":{"description":"`taken`: how many deliveries this run took.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}}},"/internal/jobs/{id}":{"post":{"operationId":"reportJob","tags":["Operator"],"summary":"Report a conversion's progress or ending","description":"The worker's signed report (`X-VecSnap-Signature`, an HMAC over the raw body): a phase, a completion with its files, or a failure. At-least-once: a repeat applies nothing and answers `applied: false`.","security":[],"x-plane":"operator","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}}],"requestBody":{"required":true,"description":"The report, signed: verified before it is parsed.","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Whether this report moved the conversion, and where it stands.","content":{"application/json":{"schema":{"type":"object","properties":{"applied":{"type":"boolean"},"status":{"type":"string"}},"required":["applied","status"]}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.\n- `invalid_status`: The worker reported a status we do not know. Nothing for a customer: this is the worker's channel.\n- `invalid_phase`: The worker reported a progress phase we do not know. Nothing for a customer: this is the worker's channel.\n- `invalid_formats`: The worker reported files this result cannot have. Nothing for a customer: this is the worker's channel.\n- `invalid_output_key`: The worker reported a result outside this conversion's folder. Nothing for a customer: this is the worker's channel.\n- `invalid_transition`: The worker reported a move this conversion cannot make. Nothing for a customer: this is the worker's channel.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","malformed_body","invalid_status","invalid_phase","invalid_formats","invalid_output_key","invalid_transition"]}}}}}]}}}},"403":{"description":"- `forbidden`: This caller may not do that. Read the message: it says who may.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["forbidden"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/internal/auth/before-user-created":{"post":{"operationId":"beforeUserCreated","tags":["Operator"],"summary":"Admit a new account (auth hook)","description":"The auth server's signed call before it creates a user: the sign-up policy's answer, in the hook's own format.","security":[],"x-plane":"operator","parameters":[],"requestBody":{"required":true,"description":"The hook's payload, signed (Standard Webhooks).","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"`{}` to admit; `{ error: { http_code, message } }` to refuse.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"400":{"description":"- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/internal/auth/send-email":{"post":{"operationId":"sendAuthEmail","tags":["Operator"],"summary":"Send a sign-in email (auth hook)","description":"The auth server's signed call to send a sign-in code: our email, through our gateway.","security":[],"x-plane":"operator","parameters":[],"requestBody":{"required":true,"description":"The hook's payload, signed (Standard Webhooks).","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"`{}` when sent; `{ error: { http_code, message } }` otherwise.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"400":{"description":"- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/webhooks/paddle":{"post":{"operationId":"receiveBillingWebhook","tags":["Operator"],"summary":"Receive a billing event","description":"The merchant of record's signed event: a payment, a refund, a subscription's change. 404 on a deployment that takes no payment.","security":[],"x-plane":"operator","parameters":[],"requestBody":{"required":true,"description":"The event, signed (`Paddle-Signature`).","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Whether it was handled, and as what.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"403":{"description":"- `forbidden`: This caller may not do that. Read the message: it says who may.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["forbidden"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/webhooks/resend":{"post":{"operationId":"receiveEmailWebhook","tags":["Operator"],"summary":"Receive an email event","description":"The email provider's signed event (delivered, bounced, complained), recorded against the message we logged.","security":[],"x-plane":"operator","parameters":[],"requestBody":{"required":true,"description":"The event, signed (Standard Webhooks, Svix's header names).","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Whether it named a message we logged.","content":{"application/json":{"schema":{"type":"object","properties":{"recorded":{"type":"boolean"}},"required":["recorded"]}}}},"400":{"description":"- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/operator/news/{issue}":{"get":{"operationId":"getNewsIssue","tags":["Operator"],"summary":"Read a news issue's state","description":"What would stop it going, who it reaches, and what was sent. Needs the operator's secret.","security":[{"operatorSecret":[]}],"x-plane":"operator","parameters":[{"name":"issue","in":"path","required":true,"description":"An issue's id in this release.","schema":{"type":"string"}}],"responses":{"200":{"description":"`issue`, `subject`, `blockers`, `readers`, `proofs`, `proofed`, `sends`.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured"]}}}}}]}}}}}},"post":{"operationId":"sendNewsIssue","tags":["Operator"],"summary":"Send a news issue","description":"To the proof readers, or to everyone once a proof of it as it reads now was sent. Needs the operator's secret.","security":[{"operatorSecret":[]}],"x-plane":"operator","parameters":[{"name":"issue","in":"path","required":true,"description":"An issue's id in this release.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"audience":{"type":"string","enum":["proof","everyone"]}},"required":["audience"],"additionalProperties":false}}}},"responses":{"200":{"description":"`issue`, `audience`, and what was queued.","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}},"400":{"description":"- `invalid_id`: An id in the path is not a UUID. Use the id exactly as the API returned it.\n- `invalid_request`: A field is missing, has the wrong type, or is not one this endpoint takes. Read the message: it names the field. Fix it and send again.\n- `malformed_body`: The body is missing, or is not a JSON object (or, where the endpoint takes a file, form data). Send a JSON object with Content-Type: application/json, or multipart/form-data where the endpoint takes a file.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_id","invalid_request","malformed_body"]}}}}}]}}}},"401":{"description":"- `unauthenticated`: Nobody is signed in, or the session or key is not valid. Sign in again, or send a valid key as Authorization: Bearer.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["unauthenticated"]}}}}}]}}}},"404":{"description":"- `not_found`: There is nothing at that id for this caller. Check the id. Another account's objects read as not found too.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_found"]}}}}}]}}}},"409":{"description":"- `proof_first`: An issue of the news is sent to its proof readers first. Nothing for a customer: this is the operator's channel.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["proof_first"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"- `not_configured`: This deployment is missing a setting this endpoint needs. Nothing for a customer: the operator is told.\n- `news_not_ready`: The news cannot be sent from this deployment yet. Nothing for a customer: this is the operator's channel.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["not_configured","news_not_ready"]}}}}}]}}}}}}},"/health":{"get":{"operationId":"getHealth","tags":["Operator"],"summary":"Check the deployment","description":"Public: 200 `ok` or 503 `misconfigured`, the service set, the engine version and the schema. The names of what is missing, and the storage, auth and API-key probes, are added only for a caller presenting the operator's (cron) secret.","security":[],"x-plane":"public","parameters":[],"responses":{"200":{"description":"Configured.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","misconfigured"]},"serviceSet":{"type":"string","enum":["local","production","undeclared"]},"engineVersion":{"description":"The engine this deployment stamps on new conversions.","type":["string","null"]},"schema":{"type":"string","description":"The database migration this build was compiled against: the release reads it before migrating."},"missing":{"description":"Operator only: the names of what is missing, never a value.","type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"string"}},"storage":{"type":"string"},"auth":{"type":"string","enum":["ok","fault","unchecked"]},"apiKeys":{"description":"Operator only: whether the database accepts the token an API key's request is minted.","type":"string","enum":["ok","fault","unchecked"]}},"required":["status","serviceSet","engineVersion","schema"]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}},"503":{"description":"Something the deployment needs is missing.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["ok","misconfigured"]},"serviceSet":{"type":"string","enum":["local","production","undeclared"]},"engineVersion":{"description":"The engine this deployment stamps on new conversions.","type":["string","null"]},"schema":{"type":"string","description":"The database migration this build was compiled against: the release reads it before migrating."},"missing":{"description":"Operator only: the names of what is missing, never a value.","type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"string"}},"storage":{"type":"string"},"auth":{"type":"string","enum":["ok","fault","unchecked"]},"apiKeys":{"description":"Operator only: whether the database accepts the token an API key's request is minted.","type":"string","enum":["ok","fault","unchecked"]}},"required":["status","serviceSet","engineVersion","schema"]}}}}}}},"/openapi":{"get":{"operationId":"getOpenApi","tags":["Operator"],"summary":"This document","description":"The OpenAPI 3.1 description of this API, generated from the same declarations that parse every request.","security":[],"x-plane":"public","parameters":[],"responses":{"200":{"description":"The document.","content":{"application/json":{"schema":{"type":"object","properties":{"openapi":{"type":"string","const":"3.1.0"}},"required":["openapi"],"additionalProperties":{}}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}},"/email/unsubscribe":{"get":{"operationId":"openUnsubscribe","tags":["Operator"],"summary":"Open an unsubscribe link","description":"An email's link: redirects (303) to the page that asks, carrying its token. A GET changes nothing (a link scanner follows it).","security":[],"x-plane":"public","parameters":[],"responses":{"303":{"description":"To the unsubscribe page."},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}},"post":{"operationId":"unsubscribe","tags":["Operator"],"summary":"Stop the product news","description":"From the page (`{ token }`, JSON) or a mail client's one-click (RFC 8058: the token in the query, a form body). Written only when it changes the answer: a replay adds nothing.","security":[],"x-plane":"public","parameters":[],"requestBody":{"required":true,"description":"`{ token }` from the page; a one-click's form body is ignored (its token is in the query).","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"No more news.","content":{"application/json":{"schema":{"type":"object","properties":{"productNews":{"type":"boolean","const":false}},"required":["productNews"]}}}},"400":{"description":"- `invalid_token`: The link's token is malformed, expired or already used. Ask for a new link.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["invalid_token"]}}}}}]}}}},"500":{"description":"- `internal_error`: Something failed on our side. Send it again. If it keeps failing, quote the requestId to support.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"enum":["internal_error"]}}}}}]}}}}}}}},"webhooks":{"conversion.completed":{"post":{"tags":["Webhooks"],"summary":"The result is ready: its figures and its files.","description":"Sent to every endpoint of the conversion's mode that wants it, signed by the Standard Webhooks scheme with the endpoint's secret: verify `webhook-signature` over `${webhook-id}.${webhook-timestamp}.${raw body}` before trusting it. At least once: dedupe on `webhook-id`. Answer 2xx within 15 seconds; anything else is retried for about 24 hours.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"The event's id, the same on every attempt: dedupe on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"When this attempt was signed, in Unix seconds: refuse one more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"`v1,<base64 HMAC-SHA256>` of `id.timestamp.body` with the endpoint's secret; two, space-separated, while a rolled secret overlaps.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Received. Any other answer, or none in 15 seconds, is retried."}}}},"conversion.failed":{"post":{"tags":["Webhooks"],"summary":"It ended without a result. Any credit came back.","description":"Sent to every endpoint of the conversion's mode that wants it, signed by the Standard Webhooks scheme with the endpoint's secret: verify `webhook-signature` over `${webhook-id}.${webhook-timestamp}.${raw body}` before trusting it. At least once: dedupe on `webhook-id`. Answer 2xx within 15 seconds; anything else is retried for about 24 hours.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"The event's id, the same on every attempt: dedupe on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"When this attempt was signed, in Unix seconds: refuse one more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"`v1,<base64 HMAC-SHA256>` of `id.timestamp.body` with the endpoint's secret; two, space-separated, while a rolled secret overlaps.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Received. Any other answer, or none in 15 seconds, is retried."}}}},"conversion.expired":{"post":{"tags":["Webhooks"],"summary":"It did not finish in time. Any credit came back.","description":"Sent to every endpoint of the conversion's mode that wants it, signed by the Standard Webhooks scheme with the endpoint's secret: verify `webhook-signature` over `${webhook-id}.${webhook-timestamp}.${raw body}` before trusting it. At least once: dedupe on `webhook-id`. Answer 2xx within 15 seconds; anything else is retried for about 24 hours.","parameters":[{"name":"webhook-id","in":"header","required":true,"description":"The event's id, the same on every attempt: dedupe on it.","schema":{"type":"string"}},{"name":"webhook-timestamp","in":"header","required":true,"description":"When this attempt was signed, in Unix seconds: refuse one more than 5 minutes off.","schema":{"type":"string"}},{"name":"webhook-signature","in":"header","required":true,"description":"`v1,<base64 HMAC-SHA256>` of `id.timestamp.body` with the endpoint's secret; two, space-separated, while a rolled secret overlaps.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"2XX":{"description":"Received. Any other answer, or none in 15 seconds, is retried."}}}}}}