{"openapi":"3.1.0","info":{"title":"Localize.io API","description":"Agentic localization pipelines at scale. Submit localization orders, poll their status, collect the results.","version":"0.1.0"},"paths":{"/v1/models":{"get":{"tags":["configuration"],"summary":"Offered Models","description":"The models an order may name in `models`, for each thing it may name one for.\n\nAnything else is refused at intake. Without `models` an order runs on what the\nconfiguration names, else our default — except the model that translates, which\nonly the order or the configuration can name. `embedding` is what the\nconfiguration's `embedder` may be — the model your memory is searched with; it\nis set in the configuration only, not per order.","operationId":"offered_models_v1_models_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Offered Models V1 Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/config":{"get":{"tags":["configuration"],"summary":"Read Config","description":"Your `config.json`, as it is.\n\nThe languages you translate into and from, your content types, and which model\ndoes what — the file itself, byte for byte. Each project has its own at\n`/v1/projects/{project}/config`. The `ETag` it comes with is what a change sends\nback (`PUT /v1/config`).","operationId":"read_config_v1_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["configuration"],"summary":"Write Config","description":"Replace your `config.json` with the body, as it is.\n\nNeeds a key with `config:write` (or the account's own token), and `If-Match`\nwith the ETag you read it with. Checked before it replaces anything — the same\nchecks the file is always read with, and every model it names must be one this\nservice offers for that purpose — and refused whole, each problem named. The version it\nreplaces is kept: `GET /v1/config/history`, `POST /v1/config/restore`. Takes\neffect on the next order; nothing is read again.","operationId":"write_config_v1_config_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/config/history":{"get":{"tags":["configuration"],"summary":"Config History","description":"The versions of your `config.json` that were replaced, newest first.","operationId":"config_history_v1_config_history_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Config History V1 Config History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/config/history/{version}":{"get":{"tags":["configuration"],"summary":"Config Version","description":"One kept version of your `config.json`, as it was.","operationId":"config_version_v1_config_history__version__get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/config/restore":{"post":{"tags":["configuration"],"summary":"Restore Config","description":"Put a kept version back: `{\"version\": \"<from the history>\"}`. The one it\nreplaces is kept in turn, so a restore can be undone the same way.","operationId":"restore_config_v1_config_restore_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project}/config":{"put":{"tags":["configuration"],"summary":"Write Project Config","description":"Replace one project's `config.json` — see `PUT /v1/config`.","operationId":"write_project_config_v1_projects__project__config_put","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["configuration"],"summary":"Read Project Config","description":"One project's `config.json`, as it is — see `/v1/config`.","operationId":"read_project_config_v1_projects__project__config_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project}/config/history":{"get":{"tags":["configuration"],"summary":"Project Config History","description":"The versions of this project's `config.json` that were replaced, newest first.","operationId":"project_config_history_v1_projects__project__config_history_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Project Config History V1 Projects  Project  Config History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project}/config/history/{version}":{"get":{"tags":["configuration"],"summary":"Project Config Version","description":"One kept version of this project's `config.json`, as it was.","operationId":"project_config_version_v1_projects__project__config_history__version__get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project}/config/restore":{"post":{"tags":["configuration"],"summary":"Restore Project Config","description":"Put a kept version of this project's `config.json` back — see `/v1/config/restore`.","operationId":"restore_project_config_v1_projects__project__config_restore_post","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["ops"],"summary":"Is the service up","description":"Answers `{\"status\": \"ok\"}` while the service is running.","operationId":"health_health_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Health Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs":{"post":{"tags":["jobs"],"summary":"Submit a job","description":"Send work to be translated or proofread. The body can be an order in this API's own schema, a file exported from your own tooling, or `text/plain` — one endpoint, because a job is one thing whatever shape it arrives in.\n\nEvery order names a `requester` (who asked) and a `content_type` (one your configuration declares); `project` is optional. An order in the schema carries them in the body. A file or plain text has nowhere to put them, so they go on the query — with `source_lang` and `target_langs` too, for plain text. An order that cannot be answered is refused here, while you are still on the line, rather than failing quietly later.\n\nAn order may choose its own models in `models` — `translation`, `annotation`, `qa`, `selection` — from those `GET /v1/models` lists for each; a file or plain text names them on the query as `translation_model`, `annotation_model`, `qa_model` and `selection_model`. Without them the configuration's are used.\n\nA segment is `{id, text, context?, max_length?, references?}`. `context` is the strongest thing you can send for quality: where the string appears, what it must fit, which names stay as written. Fields a segment or an order does not have are not read: the response's `warnings` names them, and an order of several strings with no `context` at all, and both come back again among the result's warnings.","operationId":"create_job_v1_jobs_post","parameters":[{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}},{"name":"project","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"}},{"name":"content_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"}},{"name":"requester","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester"}},{"name":"source_lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Lang"}},{"name":"target_langs","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Langs"}},{"name":"translation_model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Model"}},{"name":"annotation_model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annotation Model"}},{"name":"qa_model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qa Model"}},{"name":"selection_model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selection Model"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"What a client sends to POST /v1/jobs.\n\n`project` and `content_type` are what routing keys off. Both are optional so\nexisting integrations keep working — an order without them falls back to the\nclient's defaults.","properties":{"type":{"default":"translate","enum":["translate","proofread"],"title":"Type","type":"string"},"steps":{"anyOf":[{"items":{"enum":["translate","proofread"],"type":"string"},"type":"array"},{"type":"null"}],"title":"Steps"},"project":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"requester":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester"},"source_lang":{"title":"Source Lang","type":"string"},"target_langs":{"description":"Languages `GET /v1/config` declares, under its codes or under your own ones that its `aliases` map to them (`\"zh-CN\": \"zh-Hans\"` lets you order `zh-CN`). Each comes back under the code you sent.","items":{"type":"string"},"minItems":1,"title":"Target Langs","type":"array"},"segments":{"items":{"description":"One translatable unit. `id` is the client's own key — we echo it back.","properties":{"id":{"description":"Your key for the string. Echoed back on every translation of it.","title":"Id","type":"string"},"text":{"description":"The source text.","title":"Text","type":"string"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What the translator needs to know about this string and cannot see: where it appears (a button, a page title, an error), what it must fit, which names stay exactly as written. The strongest thing you can send for quality; an order of several strings with none is accepted, and says so in its warnings.","title":"Context"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"The most characters a translation may have. Enforced: a longer translation is sent back to the model, and one that still does not fit is delivered with an `issue` and not charged.","title":"Max Length"},"references":{"description":"Handles from POST /v1/uploads: screenshots this string appears on.","items":{"type":"string"},"title":"References","type":"array"}},"required":["id","text"],"title":"Segment","type":"object"},"minItems":1,"title":"Segments","type":"array"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"references":{"items":{"type":"string"},"title":"References","type":"array"},"models":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Models"},"metadata":{"additionalProperties":true,"title":"Metadata","type":"object"}},"required":["source_lang","target_langs","segments"],"title":"OrderRequest","type":"object"}},"text/plain":{"schema":{"type":"string"}}}}},"get":{"tags":["jobs"],"summary":"List your jobs","description":"Your jobs, newest first, each described rather than merely named: status, project, the models that worked it, how many segments, what it cost and how many warnings it carries — enough to decide whether you care about that job without a request per job. Narrow it with `status`, `project` and `limit`.","operationId":"list_jobs_v1_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"project","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Jobs V1 Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/file":{"get":{"tags":["files"],"summary":"Job File","description":"Collect the result as the file you sent, with the translations in it.\n\nA client's file format usually has room for one target language, so a job asked\nfor several has work in it the file cannot show. `?lang=` chooses which; without\nit the file's own declared target is used, and asking for a language the job did\nnot produce is an error rather than an empty file.","operationId":"job_file_v1_jobs__job_id__file_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}":{"get":{"tags":["jobs"],"summary":"Job Status","description":"Where one job is, which pass it is on, and which models have worked it.","operationId":"job_status_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/result":{"get":{"tags":["jobs"],"summary":"Collect the result","description":"The finished work: every segment with its translation, together with the order it came from. `409` while the job is still running, `422` if it failed — with the reason.","operationId":"job_result_v1_jobs__job_id__result_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/assets/versions":{"get":{"tags":["assets"],"summary":"Asset Versions","description":"Every version of your assets, kept for good.\n\nWith `path` (and `project` for a project's file): that file's versions, newest\nfirst. Each is one distinct content, by its SHA-256, with when it was the file\n(`first_at`, `last_at`), what happened to it (`events`: `stored`, `removed`,\n`restored`, `found` for a version that reached the file some other way), and whether it is the file\nnow (`current`). A job records the first twelve characters of the SHA-256 of\neach file it was made from (`result.assets`); `GET /v1/assets/versions/{sha}` opens it.\n\nWithout `path`: every file that has a history, at both levels, with how many\nversions it has.","operationId":"asset_versions_v1_assets_versions_get","parameters":[{"name":"path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"}},{"name":"project","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Asset Versions V1 Assets Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/assets/versions/{ref}":{"get":{"tags":["assets"],"summary":"Download Version","description":"One kept version, byte for byte: by its SHA-256, or the twelve characters of\nit a job records.","operationId":"download_version_v1_assets_versions__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/assets/versions/{ref}/restore":{"post":{"tags":["assets"],"summary":"Restore Version","description":"Put a kept version back as the file now: `{\"path\": \"glossary.csv\"}`, with\n`\"project\"` for a project's file. It becomes the latest version, is read like an\nupload, and the version it replaces is kept too — a restore loses nothing.","operationId":"restore_version_v1_assets_versions__ref__restore_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restore Version V1 Assets Versions  Ref  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/uploads":{"post":{"tags":["assets"],"summary":"Upload Attachment","description":"Attach a screenshot to the job you are about to order.\n\nFor the picture that belongs to a *question* — this string, this screen, now —\nrather than to the product. Product material goes in `assets/`, where it is\nindexed and read by every job; this is named by the orders that need it — as\nmany as you like — is read once, and is kept until you delete it.\n\n    POST /v1/uploads           multipart/form-data: `file`, and `meta` as JSON\n    POST /v1/uploads?name=checkout.png&note=…      (or the bytes as the body)\n    → {\"id\": \"up_9f2c8d1e4a7b\", …}\n    POST /v1/jobs   segments[].references: [\"up_9f2c8d1e4a7b\"]\n\n`note` is anything you want to say about it — that the dialog appears only for\none market, that a word is a brand and not a noun, that this is mid-flow. It is\nread before the picture is looked at, and it reaches the translator whatever the\nmodel made of the image. Send it in `meta`, or as `?note=…` when it is short. The\n`x-note` header is refused: see `_multipart`.\n\nImages only. Nothing here can watch a video, and storing one would look like\ncontext that is being used — and for the same reason, an attachment is refused\noutright when the model that would read it (the `annotator` your configuration\nnames, else ours) cannot be shown an image. A picture nobody reads is worse than\nno picture: the job looks better supplied than it is.","operationId":"upload_attachment_v1_uploads_post","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name"}},{"name":"note","in":"query","required":false,"schema":{"type":"string","default":"","title":"Note"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Attachment V1 Uploads Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["assets"],"summary":"List Attachments","description":"Every screenshot you have attached and not deleted.","operationId":"list_attachments_v1_uploads_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Attachments V1 Uploads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/uploads/{handle}":{"get":{"tags":["assets"],"summary":"Download Attachment","description":"One of your own attachments, as you sent it.","operationId":"download_attachment_v1_uploads__handle__get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["assets"],"summary":"Delete Attachment","description":"Delete one of your attachments. Delivered jobs that used it keep their record,\nwithout the picture. Refused while a job that names it is still to be done,\nbecause that job would then translate without the screen it was promised.","operationId":"delete_attachment_v1_uploads__handle__delete","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/assets":{"get":{"tags":["assets"],"summary":"List Client Assets","description":"Material that belongs to you rather than to one project.\n\nA company glossary, a company voice, a memory that spans products. It applies to\nevery project, and to jobs that name no project at all — without that, the same\nstring comes back two different ways depending on whether a project was given.","operationId":"list_client_assets_v1_assets_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Client Assets V1 Assets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/assets/{rel}":{"get":{"tags":["assets"],"summary":"Download Client Asset","description":"Take one of your own files back, byte for byte as you sent it.","operationId":"download_client_asset_v1_assets__rel__get","parameters":[{"name":"rel","in":"path","required":true,"schema":{"type":"string","title":"Rel"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["assets"],"summary":"Upload Client Asset","description":"Put a file where it applies to every project.\n\nThe reply says it was stored, and its SHA-256. What the file is gets decided by\nreading it, straight away, and the listing (`GET /v1/assets`) shows what was\nmade of it once it has been read.","operationId":"upload_client_asset_v1_assets__rel__put","parameters":[{"name":"rel","in":"path","required":true,"schema":{"type":"string","title":"Rel"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Client Asset V1 Assets  Rel  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["assets"],"summary":"Delete Client Asset","description":"Remove one of your files. Jobs after this stop seeing it.","operationId":"delete_client_asset_v1_assets__rel__delete","parameters":[{"name":"rel","in":"path","required":true,"schema":{"type":"string","title":"Rel"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects":{"get":{"tags":["assets"],"summary":"List Projects","description":"The projects this client has, and what each one is routed to.","operationId":"list_projects_v1_projects_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Projects V1 Projects Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["assets"],"summary":"Create a project","description":"A project is a name your orders can carry so they get their own glossary, memory and voice. Material uploaded to a project applies only there; material uploaded to you applies everywhere.\n\nNothing has to be declared here — what you upload is recognised by what is inside it. `content_types` is optional: a set of names (`ui`, `marketing`, `legal`) you may then route separately. A project with none works the same way for every order in it.\n\nIt writes the project's configuration, so it needs a key with `config:write`, or the account's own token.","operationId":"create_project_v1_projects_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Project V1 Projects Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project}/assets":{"get":{"tags":["assets"],"summary":"List Assets","description":"Everything you have given this project, and what the service made of it.\n\n`kind` is what the file was recognised as by looking inside it. `reference` is\nmaterial meant to be looked at rather than parsed — a screenshot, a brand book —\nand `unknown` is the service admitting it cannot read something. Once a file has\nbeen used for a job its row also says what was made of it: `by` (read, or still\na first look), `languages` as the file writes them, `read`, `feeds` and\n`counts`. An `unknown` kind and anything in `problems` are the entries worth\nacting on.","operationId":"list_assets_v1_projects__project__assets_get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Assets V1 Projects  Project  Assets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project}/assets/{rel}":{"get":{"tags":["assets"],"summary":"Download Asset","description":"Take a project's file back, byte for byte as you sent it.","operationId":"download_asset_v1_projects__project__assets__rel__get","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"rel","in":"path","required":true,"schema":{"type":"string","title":"Rel"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["assets"],"summary":"Upload Asset","description":"Put a file into the project. Anything at all: it is read for what it is.\n\nThe reply says it was stored, and its SHA-256. The file is read straight away,\nand the project's listing shows what was made of it once it has been.\n\nWriting is atomic: a partly-uploaded glossary that a job picks up mid-write\nwould be worse than no glossary, so the bytes land beside the target and are\nmoved into place in one step.","operationId":"upload_asset_v1_projects__project__assets__rel__put","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"rel","in":"path","required":true,"schema":{"type":"string","title":"Rel"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Asset V1 Projects  Project  Assets  Rel  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["assets"],"summary":"Delete Asset","description":"Remove a file from a project. Jobs after this stop seeing it.","operationId":"delete_asset_v1_projects__project__assets__rel__delete","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"string","title":"Project"}},{"name":"rel","in":"path","required":true,"schema":{"type":"string","title":"Rel"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/jobs/{job_id}/trace":{"get":{"tags":["jobs"],"summary":"How a job was made","description":"Everything that happened to one job, in order: how it was routed and why, which model answered, the exact context that was sent to it, the glossary terms and memory matches that went in, every check that ran and what it found, and what each call cost.\n\nNone of this can be reconstructed from the result afterwards, which is why it is recorded as it happens. It is the answer to \"why did it translate it that way\".","operationId":"job_trace_v1_jobs__job_id__trace_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Job Trace V1 Jobs  Job Id  Trace Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/log":{"get":{"tags":["jobs"],"summary":"Everything that happened in your account","description":"The same records a trace shows for one job, across all of them, plus what belongs to no job: material stored or removed, keys minted or revoked.\n\n`event` filters and accepts wildcards — `job.*` for the life of your orders, `asset.*` for changes to the material that shapes them, `gate.rejected` for everything refused and why. `since` takes a timestamp; `limit` defaults to 200.","operationId":"client_log_v1_log_get","parameters":[{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"project","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Client Log V1 Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/costs":{"get":{"tags":["costs"],"summary":"Your costs for a month","description":"One month of your work, by the job: every delivered job's characters, its model usage by kind (translation, choosing terms and screens, the terminology check, memory search, reading your material) and its price; totals by project and by API key; and what was spent outside any job (screenshots described as they were uploaded). A job counts in the month it was delivered, in UTC. `month` is `YYYY-MM`, this month when left out; `months` lists every month with anything in it.","operationId":"client_costs_v1_costs_get","parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"},{"type":"null"}],"title":"Month"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Client Costs V1 Costs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/credit":{"get":{"tags":["costs"],"summary":"Your prepaid credit","description":"For a prepaid account: credit added, what delivered jobs have drawn from it,\nwhat jobs in progress are expected to take, and what is due when the balance is\nbelow zero. An order is accepted while the balance is above zero, whatever it\ncomes to — memory reused word for word is not charged, so a job's price is known\nonly when it is delivered — and refused otherwise (`402`, `credit_exhausted`);\nwork already accepted finishes. `prepaid` false: the account is not prepaid, and\nnone of this applies.","operationId":"get_credit_v1_credit_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Credit V1 Credit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/budget":{"get":{"tags":["costs"],"summary":"This month against your budget","description":"Your monthly budget, if you set one, and this month against it: the price of\nwhat was delivered, the estimate of what is in progress, and what is left. An\norder that would take the month past it is refused when it arrives (`402`,\n`budget_exceeded`); work already accepted finishes.","operationId":"get_budget_v1_budget_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Budget V1 Budget Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["costs"],"summary":"Set your monthly budget","description":"`{\"monthly_usd\": 500}` caps what a month may be charged; `null` removes the\ncap. Needs a key with `config:write`, or the account's own token.","operationId":"put_budget_v1_budget_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Budget V1 Budget Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/costs.csv":{"get":{"tags":["costs"],"summary":"Your costs for a month, as CSV","description":"The job lines of `GET /v1/costs`, one row a job, for a spreadsheet.","operationId":"client_costs_csv_v1_costs_csv_get","parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"},{"type":"null"}],"title":"Month"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JobAccepted":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"$ref":"#/components/schemas/JobStatus"},"created_at":{"type":"string","title":"Created At"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"}},"type":"object","required":["job_id","status","created_at"],"title":"JobAccepted"},"JobStatus":{"type":"string","enum":["queued","processing","done","partial","failed"],"title":"JobStatus"},"JobStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"$ref":"#/components/schemas/JobStatus"},"step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step"},"steps":{"items":{"type":"string"},"type":"array","title":"Steps"},"completed_steps":{"type":"integer","title":"Completed Steps","default":0},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"attempts":{"type":"integer","title":"Attempts"},"models":{"items":{"type":"string"},"type":"array","title":"Models"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["job_id","status","created_at","updated_at","attempts"],"title":"JobStatusResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"servers":[{"url":"https://t.localize.io"}]}