> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sorce.jobs/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

> One envelope, stable codes, per-field detail.

Every error is JSON in the same envelope, with a machine-stable `code`,
a human-readable `message`, and, for validation failures, a `fields`
map naming exactly what to fix:

```json theme={null}
{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Validation failed.",
    "fields": {
      "remoteOption": "Must be one of: REMOTE, HYBRID, IN_PERSON.",
      "salaryMin": "Must be a whole non-negative number."
    }
  }
}
```

## Codes you'll encounter

| Code                      | Status | Meaning                                                                                             |
| ------------------------- | ------ | --------------------------------------------------------------------------------------------------- |
| `INVALID_SERVICE_KEY`     | 401    | Missing, unknown, or revoked partner key.                                                           |
| `NOT_FOUND`               | 404    | No such job, including another company's jobs.                                                      |
| `VALIDATION_FAILED`       | 422    | Bad input, an incomplete publish, or a live edit that would blank a required field. Check `fields`. |
| `AGREEMENT_OUTDATED`      | 409    | Publishing requires your organization to accept the current terms in the Sorce dashboard first.     |
| `PAYMENT_METHOD_REQUIRED` | 402    | Publishing requires a card on file (add one in Billing).                                            |
| `INVALID_TRANSITION`      | 409    | The status change isn't legal (e.g. publishing a non-draft, resuming an active job).                |
| `JOB_NOT_EDITABLE`        | 409    | Closed and expired jobs can't be edited.                                                            |
| `JOB_FROZEN`              | 409    | Qualifications/questions can't change once a job has applications.                                  |
| `RATE_LIMITED`            | 429    | Out of tokens for this key; retry after `retryAfterSeconds`.                                        |
| `INTERNAL`                | 5xx    | Something broke on our side.                                                                        |

## Idempotency notes

Job arrays are **replace-sets**: `locations`, `qualifications`, `questions`,
and `budgets` become the entire new set you send, so retried PATCHes
converge instead of duplicating.
