Reference
Errors
Every error carries a stable code. Branch on that, never on the message text.
Response
{
"statusCode": 400,
"request_id": "a78010ec-a2bd-41e7-9c0d-654449103c7b",
"timestamp": "2026-08-13T06:52:02.829Z",
"error": {
"code": "VALIDATION_ERROR",
"message": "exchange_rate is required when invoice_currency_code is not OMR",
"field": "exchange_rate"
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_ERROR | A field is missing, malformed, or forbidden in context |
| 400 | PROFILE_MISMATCH | The profile you asserted doesn't match what the document declares |
| 400 | INDETERMINATE_PROFILE | The document doesn't identify its own profile |
| 401 | INVALID_API_KEY | See Authentication |
| 403 | TAXPAYER_NOT_YOURS | The taxpayer belongs to another organisation |
| 404 | NOT_FOUND | No such transaction, document or taxpayer |
| 409 | DUPLICATE_INVOICE_NUMBER | That invoice number is already used by this taxpayer |
| 409 | TAXPAYER_NOT_ASSOCIATED | Not yet connected to your Service Provider account in Fawtara |
| 422 | SCHEMATRON_INVALID | The document breaks an Oman rule — issues lists them |
| 429 | RATE_LIMITED | Slow down. Retry-After says by how long |
| 503 | NETWORK_UNAVAILABLE | Peppol or the Tax Authority is unreachable. Retry later |