Errors
RFC 9457 problem responses and every error code the API returns.
Every failed API call returns application/problem+json as defined by RFC 9457. The type links to the section of this page for the status, title and code name the error, and detail says what to do about it. Quote request_id when you contact jonathan@welcome.meterapp.co; you can also send your own in X-Request-Id.
422 Unprocessable content
{ "type": "https://glossa-meterapp.vercel.app/docs/errors#422", "title": "placeholder_mismatch", "status": 422, "detail": "The translation must keep the source's placeholders: {name}.", "request_id": "5b0e3c7a-…", "code": "placeholder_mismatch", "mismatch": [ "{name}" ]}A 401 also carries WWW-Authenticate: Bearer resource_metadata=…, which MCP clients follow to sign in with OAuth. Over MCP, the same errors come back as tool errors with the code and message.
400 Bad request
| Code | Meaning |
|---|---|
| invalid_json | The body (or ?input for GET) is not valid JSON. |
| invalid_input | The input failed the op's schema. `issues` lists each problem with its path. |
| invalid_action | resolve_task got an action the task's kind does not accept. The message lists the valid ones. |
| invalid_slug | The project name produced no usable slug. Use letters, digits and dashes. |
| text_required | An edit action needs `text` with the corrected translation. |
| unknown_format | The forced `format` id is neither built in nor learned by this workspace. |
401 Unauthorized
| Code | Meaning |
|---|---|
| unauthorized | No credential. Send `Authorization: Bearer gls_…`. |
| invalid_key | The API key does not exist or was revoked. |
| invalid_token | The OAuth access token is invalid or expired. Refresh it and retry. |
402
| Code | Meaning |
|---|---|
| payment_failed | Stripe declined the charge for a plan change. Ask a human to update the card (create_billing_portal_link) or pay through create_checkout_link. |
403 Forbidden
| Code | Meaning |
|---|---|
| forbidden | The op needs an owner or admin. |
| no_workspace | The signed-in user is not a member of the requested workspace (or of any). |
404 Not found
| Code | Meaning |
|---|---|
| unknown_op | No op has that name. `GET /api/v1` lists them. |
| not_found | The project, unit, task or other record is not in this workspace. |
405 Method not allowed
| Code | Meaning |
|---|---|
| method_not_allowed | A write op was sent with GET. Use POST. |
409 Conflict
| Code | Meaning |
|---|---|
| project_exists | A project with that slug already exists. |
| task_closed | The task was already resolved or dismissed. |
| format_not_ready | The file has no working format yet. Resolve its learn_format task first. |
| job_missing | The job a task refers to no longer exists. Push the file again. |
| already_subscribed | The workspace is already on that plan and interval. get_billing shows the subscription. |
| no_subscription | There is no paid subscription to cancel or resume. |
422 Unprocessable content
| Code | Meaning |
|---|---|
| placeholder_mismatch | A translation's placeholders differ from the source string's. Keep every placeholder exactly. |
| invalid_template | A learned format template is malformed. |
| template_reads_nothing | A learned format template parses the sample into zero entries. |
500 Internal error
| Code | Meaning |
|---|---|
| internal_error | Something failed on our side. Retry, and quote `request_id` if it persists. |
503
| Code | Meaning |
|---|---|
| billing_unavailable | Billing is not configured on this server yet (no Stripe key or price). Email support to subscribe. |
Retrying
- 4xx errors will fail the same way again until you change the request.
- 5xx errors are safe to retry with backoff. Write ops that queue work (translate, run_audit) may have taken effect; check with get_job or list_jobs first.