بوابة المطورين — FRA Digital Financial Disclosure API v1.4.0
مرجع واجهة برمجة تطبيقات منصة الإفصاح الإلكتروني، مولَّد من وثيقة OpenAPI 3.1 نفسها التي تُختبر آلياً مقابل كل مسار مسجل في المنصة.
Every endpoint of /api/v1, generated from the OpenAPI 3.1 document that the test-suite holds against the registered routes.
https://fra2.corprise.ai/api/v1https://fra2.corprise.ai/api/v1/openapi.json · https://fra2.corprise.ai/api/v1/openapi.yaml — load it in any OpenAPI tool (Postman, Insomnia, openapi-generator).المصادقة والصلاحيات Authentication
OAuth 2.0 client_credentials: بيانات اعتماد العميل تُستبدل برمز Bearer صالح ساعة واحدة.
curl -s -X POST https://fra2.corprise.ai/api/v1/oauth/token \
-H 'Content-Type: application/json' \
-d '{"grant_type":"client_credentials","client_id":"fra-client-…","client_secret":"…","scope":"filing:submit filing:status"}'
# → {"access_token":"…","token_type":"Bearer","expires_in":3600,"scope":"filing:submit filing:status"}
curl -s https://fra2.corprise.ai/api/v1/filings -H 'Authorization: Bearer <access_token>'
| Scope | Grants |
|---|---|
filing:submit | Submit filings, structured figures and attachments. |
filing:status | Read filings, their status, deadlines and the reporting calendar. |
template:read | Read templates, fields and validators. |
taxonomy:read | Read taxonomies. |
client:key_rotate | Replace the client's RSA signing key. |
compliance:read_all | Read any company's compliance history (FRA/partner clients only). |
mcp:read | Read public data through the MCP server (POST /mcp). |
عملاء الجهات الشريكة يرسلون السر في الرأس X-API-Key لمسارات /agency/*. القائمة البيضاء لعناوين IP — إن فُعّلت للعميل — تُطبَّق على كل طلب.
الظرف المشفّر Encryption envelope (RSA-OAEP + AES-256-GCM, signed)
Hybrid encryption envelope (XBRLEncryptionService). Steps for a request: (1) random AES-256 key + 12-byte IV; (2) AES-256-GCM encrypt the plaintext → ciphertext + 16-byte tag; (3) RSA-OAEP-encrypt the AES key with the FRA public key; (4) sign the ciphertext bytes with your RSA private key (PKCS#1 v1.5, SHA-256); (5) base64 every field. The FRA verifies the signature first, then decrypts, then compares SHA-256(plaintext) with the checksum you send.
| Field | Type | Meaning |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
Channel B plaintext (POST /filings/structured)
{
"format": "fra-structured-json-v1",
"figures": [
{"field_key": "ncbs_cash", "current": 1250000, "prior": 980000, "note": "5"},
{"concept": "ifrs-full:Revenue", "current": 4100000}
],
"text": {"auditor_name": "…"}
}
metadata.checksum_sha256 = hex SHA-256 of exactly these plaintext bytes. Get the FRA key from GET /public-key and send its version as fra_key_version.
Idempotency-Key
Optional. A unique key per operation (a UUID). Within 24 h the same key with the same body replays the stored response (`Idempotency-Replayed: true`); with a different body → 422 `idempotency_key_reused`; while the first is in flight → 409 `idempotency_request_in_progress`. Scoped per API client (session user / IP for public endpoints). 5xx, 401, 403 and 429 outcomes are not stored.
curl -X POST https://fra2.corprise.ai/api/v1/filings/structured -H 'Authorization: Bearer …' \ -H 'Idempotency-Key: 6f1c2a8e-4c1b-4c55-9d36-2f3f0e1f9a10' -H 'Content-Type: application/json' -d @envelope.json
حدود المعدل والأخطاء Rate limits & errors
Each endpoint has its own per-minute limit (shown on every operation below). Responses carry X-RateLimit-Limit and X-RateLimit-Remaining; a 429 adds Retry-After and X-RateLimit-Reset.
| Status | Body | Meaning |
|---|---|---|
BadRequest | ApiError | Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. |
Unauthorized | ApiError | Missing, invalid or expired token (`missing_token`, `invalid_token`). |
Forbidden | ApiError | Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. |
NotFound | ValidationError | ApiError | Not found (or not yours). |
Conflict | ApiError | Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. |
ValidationFailed | ValidationError | ApiError | Validation failed. |
TooManyRequests | ValidationError | ApiError | Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds). |
ServerError | ApiError | Processing error (`processing_error`); the message is sanitised. |
| ApiError field | Type | Meaning |
|---|---|---|
error* |
string |
Machine-readable error code, e.g. unknown_template, decryption_failed, checksum_mismatch, key_version_mismatch, submission_not_ready, invalid_figures, duplicate_submission, idempotency_key_reused, insufficient_scope, sandbox_unsupported. |
message |
string |
Human-readable explanation. |
code |
string |
Sub-code, e.g. signature_invalid / decryption_error, missing_token, invalid_token. |
بيئة الاختبار Sandbox
يصدر مدير حساب الشركة بيانات اعتماد تجريبية من صفحة «توثيق API» في بوابة الشركة. العنوان نفسه والمسارات نفسها؛ تحمل الاستجابات
X-FRA-Environment: sandbox، ولا يصل أي إفصاح تجريبي إلى مراجعة الهيئة ولا يدخل في الإحصاءات أو البيانات المفتوحة. عند submit: true تُطبق فحوص البيانات فعلياً وتُحاكى المراجعة: submitted → fra_under_review → accepted
(أو rejected / requires_amendment عبر metadata.sandbox_outcome) خلال 30 ثانية.
Webhooks
لمستهلكي البيانات العامة: سجّل نقطة استقبال لإشعارات قبول الإفصاحات ونشرها — إدارة الإشعارات الآلية
Events are POSTed to the client's webhook_url, signed: X-FRA-Signature: sha256=HMAC_SHA256(secret, "{X-FRA-Timestamp}.{raw body}"), X-FRA-Signature-Version: 2. Reject timestamps more than 5 minutes off and compare signatures in constant time.
| Event | When |
|---|---|
filing.status_changed | A filing changed status (submitted, assigned, under review, accepted, rejected, amendment requested). Delivered to the client's webhook_url; retried with back-off on non-2xx. |
filing.inspector_assigned | A reviewer was assigned to a filing. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
filing.amendment_requested | The FRA requested an amendment. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
filing.validation_completed | XBRL validation finished. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
template.updated | A template the client uses changed. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
template.deployed | A template was deployed to the client. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
access_request.approved | An access request was approved. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
access_request.rejected | An access request was rejected. Delivered to the client's webhook_url; retried with back-off on non-2xx. |
أمثلة SDK SDK samples
أمثلة قابلة للتشغيل لتقديم إفصاح منظّم مشفّر من البداية للنهاية (جلب المفتاح، التشفير والتوقيع، Idempotency-Key، متابعة الحالة) في مستودع المنصة:
sdk/php · sdk/python · sdk/java · sdk/dotnet — كل منها مع ملف README.
Onboarding
Access requests and key-regeneration requests (no credentials needed).
post/access-requestsRequest API access
An IR platform or company asks the FRA for credentials. One pending request per contact email. The FRA answers by webhook (`access_request.approved` / `rejected`) when `webhook_url` is given; poll /access-requests/{id}/status otherwise.
Request body application/json — AccessRequest
| Field | Type | Description |
|---|---|---|
company_name* |
string |
|
company_name_ar |
string | null |
|
fra_license_number |
string | null |
|
sector_code |
string | null |
|
entity_type |
string | null (listed_company, nbfi, insurance, mortgage, leasing, factoring, microfinance, consumer_finance, fintech, securitization, other) |
|
contact_name* |
string |
|
contact_email* |
string (email) |
|
contact_phone |
string | null |
|
rsa_public_key |
string | null |
PEM. |
webhook_url |
string | null (uri) |
|
ir_system_base_url* |
string (uri) |
|
notes |
string | null |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Request recorded.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
AccessRequestCreated |
409 |
A request from this email is already pending. | ApiError |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
post/access-requests/key-regenerationRequest new client credentials
For a client that lost its secret. The email must belong to a user of the client's company or to the original requester.
Request body application/json — object
| Field | Type | Description |
|---|---|---|
client_id* |
string |
|
contact_email* |
string (email) |
|
reason* |
string |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Request recorded.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
AccessRequestCreated |
404 |
No active client with this client_id. | ApiError |
403 |
Email does not match the client. | ApiError |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/access-requests/{id}/statusStatus of an access request
The contact email must match. Once approved, `credentials.client_id` is included (the secret is delivered out of band).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id* | path | integer | Request id. |
email* | query | string (email) | Contact email of the request. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
AccessRequestStatus |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Agency data sharing
Aggregates for partner agencies under a data-sharing agreement (X-API-Key).
get/agency/compliance-aggregatesCompliance aggregates
Status totals, 6-month trend and sector compliance rates. Requires an active data-sharing agreement; access is logged.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Aggregates.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/agency/filing-timelineFiling timeline
Submitted / accepted / rejected / pending per month, last 12 months. Requires an active data-sharing agreement; access is logged.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Aggregates.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/agency/sector-statsSector statistics
Active companies, filings and acceptance per sector this year. Requires an active data-sharing agreement; access is logged.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Aggregates.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Keys
FRA transport public key (to encrypt) and the client's own signing key (to rotate).
put/client/public-keyReplace the client's RSA signing public key
Registers a new RSA public key (PEM, ≥ 2048 bits) used to verify the client's signatures. Requires scope `client:key_rotate`. Audited.
Request body application/json — object
| Field | Type | Description |
|---|---|---|
rsa_public_key* |
string |
PEM-encoded RSA public key (min. 200 characters). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Key replaced.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
object |
422 |
Not an RSA key of at least 2048 bits, or validation failed. | ApiError |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/public-keyCurrent FRA transport public key
RSA-2048 public key (PEM) to wrap the AES key of every encrypted payload. Cache it by `version`; send that version as `fra_key_version`. When called with a valid Bearer token the client's cached key version is recorded (best effort).
Responses
| Status | Description | Body |
|---|---|---|
200 |
The active key.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
PublicKey |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/public-key/{version}A specific FRA public key version
For payloads prepared just before a rotation.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
version* | path | integer | Key version. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
The key.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
PublicKey |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Compliance
Compliance score history.
get/companies/{id}/compliance-historyCompliance score history of a company
A client reads only its own company unless its token holds `compliance:read_all`.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string | Company (tenant) id. |
months | query | integer | Window when from/to are absent. |
from | query | string (date) | Start date. |
to | query | string (date) | End date. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
History.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
ComplianceHistory |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Reference data
Deadlines and the official reporting calendar of the authenticated company.
get/deadlinesFiling deadlines of the company
Pending and overdue by default.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status | query | string (pending, filed, overdue, waived) | Only this status. |
include_past | query | boolean | Include deadlines older than 30 days. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Deadlines.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
DeadlineList |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/reporting-periodsOfficial FRA reporting calendar
Published reporting periods of a year (default: current year).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
year | query | integer | Fiscal year. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Periods.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
ReportingPeriodList |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Rules
Canonical rules and decrees registry, and stateless rule evaluation.
get/decreesDecrees registry
Decrees and circulars the rules cite.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Decrees.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/decrees/{id}One decree
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id* | path | string | Decree id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Decree.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/rulesCanonical rules registry
Paginated; `since` returns rules changed after a timestamp (delta sync).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
since | query | string (date-time) | Only rules updated since. |
category | query | string | Rule category. |
severity | query | string | critical | warning | info. |
per_page | query | integer | Page size. |
page | query | integer | Page. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Rules.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
post/rules/evaluateEvaluate rules against an envelope (stateless)
Runs the FRA rules (or the given subset) against a disclosure envelope and returns the flags it would raise. Stores nothing.
Request body application/json — object
| Field | Type | Description |
|---|---|---|
envelope* |
DisclosureEnvelope |
|
disclosure_id* |
string |
ULID chosen by the issuer. |
envelope_version |
string |
Default 1.0. |
company_id* |
string |
Issuer company identifier. |
category* |
string |
Disclosure category. |
language |
string (ar, en) |
|
submitted_at* |
string (date-time) |
Within ±5 min of FRA time. |
period |
object |
|
start |
string | null (date) |
|
end |
string | null (date) |
|
fiscal_year |
integer | null |
|
quarter |
integer | null |
|
figures |
object[] |
|
quotes |
object[] |
|
attachments |
object[] |
|
promises |
object[] |
|
audit |
object |
|
ir_validation_hash |
string |
SHA-256 of canonical {figures, quotes, promises}. |
signatures |
object |
|
issuer_sig |
string |
Signature over the canonical JSON without `signatures`. |
issuer_cert_thumbprint |
string |
|
rules |
string[] |
Rule ids to evaluate (default: all applicable). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Flags.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
object |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/rules/{ruleId}One rule
Parameters
| Name | In | Type | Description |
|---|---|---|---|
ruleId* | path | string | Rule id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Rule.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Disclosure envelope
Canonical signed disclosure envelope (event-driven disclosures, IR platform).
post/disclosuresSubmit a signed disclosure envelope
Canonical JSON envelope signed by the issuer certificate (`signatures.issuer_sig` over the canonical JSON without `signatures`). `submitted_at` must be within ±5 minutes of FRA time; `audit.ir_validation_hash`, when present, must match FRA's re-hash of figures/quotes/promises. FRA rules are evaluated on receipt and returned as `flags`. Not available to sandbox credentials (403 `sandbox_unsupported`).
Request body application/json — DisclosureEnvelope
| Field | Type | Description |
|---|---|---|
disclosure_id* |
string |
ULID chosen by the issuer. |
envelope_version |
string |
Default 1.0. |
company_id* |
string |
Issuer company identifier. |
category* |
string |
Disclosure category. |
language |
string (ar, en) |
|
submitted_at* |
string (date-time) |
Within ±5 min of FRA time. |
period |
object |
|
start |
string | null (date) |
|
end |
string | null (date) |
|
fiscal_year |
integer | null |
|
quarter |
integer | null |
|
figures |
object[] |
|
quotes |
object[] |
|
attachments |
object[] |
|
promises |
object[] |
|
audit |
object |
|
ir_validation_hash |
string |
SHA-256 of canonical {figures, quotes, promises}. |
signatures |
object |
|
issuer_sig |
string |
Signature over the canonical JSON without `signatures`. |
issuer_cert_thumbprint |
string |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Received.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
DisclosureReceived |
422 |
Rejected: `error` is schema | signature | integrity | duplicate | … | ApiError |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/disclosures/{trackingId}/statusStatus of a disclosure envelope
Tenant-isolated: only the issuer's own disclosures.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
trackingId* | path | string | ULID returned as `tracking_id`. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
DisclosureStatus |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Portal extraction
Endpoints used by the company portal's own pages (logged-in session + CSRF), documented for completeness.
get/extraction-jobs/{job_id}An extraction job with its results
Parameters
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string | Extraction job id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Job. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
post/extraction-jobs/{job_id}/export-xbrlExport a job's figures as XBRL
Session + CSRF token.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string | Extraction job id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
XBRL document.
Headers: Idempotency-Replayed |
string |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
post/extraction-jobs/{job_id}/retryRetry a failed extraction job
Session + CSRF token.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string | Extraction job id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Re-queued.
Headers: Idempotency-Replayed |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/extraction-jobs/{job_id}/statusProgress of an extraction job
Parameters
| Name | In | Type | Description |
|---|---|---|---|
job_id* | path | string | Extraction job id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
get/extraction/formatsSupported upload formats
Public.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Formats.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/extractions/export-csvExport the job list as CSV
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filename | query | string | File name contains. |
status | query | string | Job status. |
confirmation_status | query | string | approved | rejected | pending. |
format | query | string | pdf, xlsx… |
language | query | string | ar | en. |
date_from | query | string (date) | From. |
date_to | query | string (date) | To. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
CSV. | string |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/extractions/filter-optionsFilter values for the search UI
Responses
| Status | Description | Body |
|---|---|---|
200 |
Options. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/extractions/historyExtraction jobs of the company
Parameters
| Name | In | Type | Description |
|---|---|---|---|
limit | query | integer | Page size. |
offset | query | integer | Offset. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Jobs. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/extractions/searchSearch extraction jobs
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filename | query | string | File name contains. |
status | query | string | Job status. |
confirmation_status | query | string | approved | rejected | pending. |
format | query | string | pdf, xlsx… |
language | query | string | ar | en. |
date_from | query | string (date) | From. |
date_to | query | string (date) | To. |
filing_id | query | string | Filing. |
sort | query | string | Sort column. |
direction | query | string (asc, desc) | Direction. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Results. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/extractions/statsCounts per filter value
Responses
| Status | Description | Body |
|---|---|---|
200 |
Stats. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/extractions/suggestionsSearch suggestions
Parameters
| Name | In | Type | Description |
|---|---|---|---|
query | query | string | Prefix. |
type | query | string | filename (default). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Suggestions. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/extractions/summary-statsExtraction statistics of the company
Responses
| Status | Description | Body |
|---|---|---|
200 |
Stats. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
put/filings/{filing_id}/confirm-extractionApprove or reject an extraction
Session + CSRF token.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filing_id* | path | string | Disclosure submission id. |
Request body application/json — object
| Field | Type | Description |
|---|---|---|
job_id* |
string |
|
confirmation_status* |
string (approved, rejected) |
|
notes |
string | null |
|
figures |
object[] |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Recorded.
Headers: Idempotency-Replayed |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
post/filings/{filing_id}/extractUpload a statement file to extract
Multipart upload (PDF, XLSX, XLS, CSV, DOCX; ≤ 100 MB). Session + CSRF token.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filing_id* | path | string | Disclosure submission id. |
Request body multipart/form-data — object
| Field | Type | Description |
|---|---|---|
file* |
string |
Statement file. |
language |
string (ar, en) |
|
confidence_threshold |
number |
Responses
| Status | Description | Body |
|---|---|---|
202 |
Queued.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/filings/{filing_id}/extraction-previewPreview extracted figures of a filing
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filing_id* | path | string | Disclosure submission id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Preview. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
get/filings/{filing_id}/extraction-statusExtraction status of a filing
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filing_id* | path | string | Disclosure submission id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
get/filings/{filing_id}/extractionsExtraction jobs of a filing
Parameters
| Name | In | Type | Description |
|---|---|---|---|
filing_id* | path | string | Disclosure submission id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Jobs. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
post/internal/documents/{id}/extractQueue extraction of a regulatory document (internal)
Internal FRA pipeline; Sanctum personal access token.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id* | path | integer | FRA document id. |
Responses
| Status | Description | Body |
|---|---|---|
202 |
Queued.
Headers: Idempotency-Replayed |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
Public data
Facts of accepted filings, bulk files and XBRL reference data — public, cacheable.
get/factsFacts of accepted filings
Every XBRL fact of every filing the FRA accepted — never drafts, filings under review, rejected filings or sandbox data. Filters combine with AND; list-valued filters accept comma-separated values. Responses are cached (`Cache-Control: public`) and carry an `ETag`; send `If-None-Match` to get 304. Bulk files: /facts/bulk.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
concept | query | string | Concept QName(s), e.g. ifrs-full:Revenue. |
company | query | string | FRA licence number(s) or LEI(s). |
sector | query | string | Sector code(s). |
fiscal_year | query | string | Fiscal year(s) of the filing. |
period | query | string (FY, Q1, Q2, Q3, Q4) | Annual (FY) or quarter. |
period_context | query | string (current, prior) | Current period or comparative. |
statement | query | string | Statement code(s), e.g. SFP, PL. |
filing | query | string | Filing reference number(s). |
page | query | integer | Page. |
per_page | query | integer | Page size. |
If-None-Match | header | string | ETag of a previous response. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
A page of facts.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, ETag, Cache-Control |
FactPage |
304 |
Not modified (If-None-Match matched). | |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/facts/bulkDaily bulk files
Gzipped CSV and xBRL-JSON (OIM 1.0) per fiscal year, regenerated daily, with row counts and SHA-256. Data dictionary: /open-data/bulk.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Files.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, ETag |
BulkFileList |
304 |
Not modified. | |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/public/filings/{submission}/validationValidation results of a published filing
The STORED validation outcome of the published XBRL report of an accepted filing (in the spirit of filings.xbrl.org): overall status (valid / warnings / errors), counts per layer and every finding with rule id, severity, Arabic/English message, concept and context. Platform native checks, Arelle on the published packages and the FRA business rules. Never re-validated on request; nothing internal (reviewer notes, the uploaded file, users) is included. 404 for anything that is not an accepted public filing.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
submission* | path | integer | Filing id (as in GET /xbrl/filings). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Validation results.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
PublicFilingValidation |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/public/searchFull-text search over accepted filings
Searches the public text of every filing the FRA accepted — company names (Arabic/English), filing metadata (reference, template, period, sector), figure labels and concepts of the published XBRL report, note and accounting-policy text blocks. Never drafts, filings under review, rejected filings or sandbox data. Arabic is normalised on both sides: diacritics and tatweel are ignored, alef forms (أ إ آ) read as ا, ى as ي, ة as ه, and Arabic-Indic digits as 0-9 — «الشركه» finds «الشركة». Put a phrase in double quotes for an exact phrase; all words must match. Results are ordered by relevance and carry an HTML snippet (`snippet_html`: escaped text, matches in `<mark>`). Give `q` or at least one filter. Cached for a short time (`Cache-Control: public`).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
q | query | string | Words and "quoted phrases". |
company | query | string | FRA licence number(s) or LEI(s), comma separated, or part of the company name. |
sector | query | string | Sector code(s). |
template | query | string | Template code(s). |
fiscal_year | query | string | Fiscal year(s). |
period | query | string (FY, Q1, Q2, Q3, Q4) | Annual (FY) or quarter. |
accepted_from | query | string (date) | Accepted on or after. |
accepted_to | query | string (date) | Accepted on or before. |
kind | query | string (filing, note, figure) | Only filings, notes/policies or statement figures. |
locale | query | string (ar, en) | Language of the text (bilingual rows always match). |
page | query | integer | Page. |
per_page | query | integer | Page size. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
A page of results.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Cache-Control |
PublicSearchPage |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
post/public/xbrl/checkFree XBRL check (anonymous)
Anyone can validate an Inline XBRL / XBRL 2.1 / xBRL-JSON report or a report package against the FRA rules — the same engine as POST /xbrl/test-filing and the filing intake (rule ids, layers, Arabic/English messages) — WITHOUT filing anything and WITHOUT the file being kept: it is malware-scanned, validated in memory and deleted; only an anonymous counter (hash prefix, size, outcome, keyed IP hash) is recorded. The entity identifier is NOT checked against a registered company (anonymous); `validation.service.notes` says so. Arelle runs only when the FRA enables it for this service. Send `multipart/form-data` (`file`) or JSON (`file_name` + `content_base64`). Strict per-IP limits (per minute and per day) and a size cap (default 20 MB, 413 above it). No credentials needed. An Idempotency-Key is optional; with one, the response is kept 24 h for replay like every /api/v1 POST.
Request body multipart/form-data — object
| Field | Type | Description |
|---|---|---|
file* |
string |
The report or report package. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
The validation report.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
PublicXbrlCheckResult |
413 |
The file is larger than the limit. | ApiError |
422 |
Missing, empty or unsupported upload, invalid base64, or refused by the malware scan. | ApiError | ValidationError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
get/xbrl/conceptsConcepts used in filings
Concepts with labels, data type and period type; search by `q`, restrict by namespace prefix.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
namespace | query | string | Namespace prefix, e.g. ifrs-full. |
q | query | string | Search text. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Concepts.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/xbrl/sector-benchmarksSector benchmarks
Average and median of each concept across the sector's latest accepted filings.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
sector_id* | query | integer | Sector id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Benchmarks.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Filings
Channel A — an encrypted XBRL/iXBRL instance; Channel B — figures by field_key/concept in the same envelope; extraction mappings; status and listing.
get/filingsList the company's filings
Newest first, 20 per page. A sandbox client sees only its sandbox filings.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status | query | string | Filter by status, e.g. draft, submitted, accepted. |
period | query | string | Substring of the period label, e.g. 2025. |
page | query | integer | Page number. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
A page of filings.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
FilingList |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
post/filings/from-extractionCreate a draft from extracted line items (plain JSON)
For IR systems that extracted the statements themselves: items are mapped to the template by label. High-confidence, fully-matched mappings become a `draft`; otherwise `mapping_review`. Not encrypted — prefer Channel B for figures by field.
Request body application/json — FromExtractionRequest
| Field | Type | Description |
|---|---|---|
template_id* |
integer |
|
period_start* |
string (date) |
|
period_end* |
string (date) |
|
fiscal_year* |
integer |
|
quarter |
integer | null |
|
extracted_data* |
object[] |
At least one item. |
item* |
string |
Line-item label. |
value |
number | null |
|
type |
string | null |
|
section |
string | null |
|
source |
string | null |
|
ai_model |
string | null |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Draft created with its mapping summary.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
ExtractionMappingResult |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
post/filings/structuredSubmit figures by field (Channel B, encrypted)
The decrypted plaintext is JSON (`StructuredFilingPayload`, format `fra-structured-json-v1`): each figure names its template field by `field_key`, or by an XBRL `concept` that exactly one field carries. An unknown key, an ambiguous concept or a non-number refuses the whole filing with the list (`invalid_figures`) — nothing is guessed. Totals are re-checked and differences reported as `warnings`, never corrected. Created as a draft for the company to review and seal; with `metadata.submit: true` it goes to the FRA when every readiness gate passes (else 422 `submission_not_ready`, the draft is kept). **Sandbox**: `submit: true` runs the real data checklist and simulates the review.
Request body application/json — StructuredFilingRequest
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
fra_key_version* |
integer |
|
metadata* |
object |
|
template_code* |
string |
|
fiscal_year* |
integer |
|
period_start |
string | null (date) |
|
period_end |
string | null (date) |
|
quarter |
integer | null |
|
period_label |
string | null |
|
checksum_sha256* |
string |
Hex SHA-256 of the plaintext JSON bytes. |
submit |
boolean | null |
Submit to the FRA when every readiness gate passes. |
sandbox_outcome |
string (accepted, rejected, requires_amendment) |
Sandbox only: simulated decision. |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Stored (draft) or received.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
StructuredFilingResult |
422 |
Validation, unknown template, envelope failure, invalid payload, unbindable figures, or not ready. | InvalidFigures | SubmissionNotReady | ApiError | ValidationError |
409 |
This exact payload was already submitted. | ApiError |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
500 |
Processing error (`processing_error`); the message is sanitised. | ApiError |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
post/filings/submitSubmit an encrypted XBRL / iXBRL filing (Channel A)
The plaintext is the XBRL report: Inline XBRL (one document, or a document set inside a report package), XBRL 2.1, xBRL-JSON, or a report package (`.xbri`/`.xbr`/`.zip`, sent as its raw ZIP bytes). The platform verifies the signature, decrypts, checks `metadata.checksum_sha256` against the decrypted bytes, then reads the report through **Channel D intake**: a report that references an FRA entry point (or any package / xBRL-JSON) is validated as filed — package safety, XBRL conformance (Arelle, offline), Calculations 1.1, duplicates, FRA filing rules, data quality — and refused with 422 `xbrl_validation_failed` and the full `validation` report (`XbrlValidationReport`) on any error; nothing is filed then. Its facts are bound to the template by element, period and dimensions. The response carries `xbrl_mode: standard` and `xbrl_validation`. **Legacy mode** (`xbrl_mode: legacy_dynamic_fields`): a document without an FRA entry point — the IR platform's `fra:DynamicField_N` facts — is still read by label as before while the FRA keeps `XBRL_API_LEGACY_MODE=allow`; with `reject` it is refused (422 `legacy_format_rejected`). Validate before filing with POST /xbrl/test-filing. The filing is then stored, and the readiness gates run (checklist, attestation, internal approval). Ready → submitted to the FRA (201, `status: received`); not ready → kept as a draft the company completes in the portal (422 `submission_not_ready` with `blocking`). Optional `attachments[]` are additional encrypted files (e.g. the signed PDF) in the same envelope format, virus-scanned before storage. The exact same ciphertext can be submitted only once (409 `duplicate_submission`); use an Idempotency-Key to retry safely. **Sandbox**: the review is simulated (`sandbox: true`, `simulated_status`); `metadata.sandbox_outcome` chooses the simulated decision.
Request body application/json — XbrlFilingRequest
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
fra_key_version* |
integer |
Version of the FRA public key used. |
metadata* |
object |
|
template_code* |
string |
Template code from GET /templates. |
period_start* |
string (date) |
|
period_end* |
string (date) |
|
fiscal_year* |
integer |
|
checksum_sha256* |
string |
Hex SHA-256 of the plaintext document. |
content_type |
string (xbrl, ixbrl, iXBRL, XBRL, IXBRL, xbri, xbr, zip, xbrl-json, json, xbrl-csv) |
Format of the plaintext; a ZIP plaintext is always read as a report package. |
file_name |
string |
File name of the report or package, e.g. FRA-LIC-0001-2025-12-31-annual.xbri (naming rule FRA-121). |
sandbox_outcome |
string (accepted, rejected, requires_amendment) |
Sandbox only: simulated decision. |
attachments |
object[] |
Optional encrypted files (same envelope, same FRA key version). |
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
filename |
string |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Received and submitted to the FRA (sandbox: simulated).
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
FilingReceived |
422 |
Validation failed, unknown template, decryption/signature/checksum failure, key version not found, XBRL report refused (xbrl_validation_failed, template_mismatch, legacy_format_rejected), or not ready (stored as draft). | SubmissionNotReady | XbrlValidationFailed | ApiError | ValidationError |
409 |
This exact payload was already submitted. | ApiError |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
500 |
Processing error (`processing_error`); the message is sanitised. | ApiError |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
get/filings/{reference}/figuresExtracted figures with source position and verdict
The figures read from the company's own filing, each with its source position (page, row, bounding box) and — once data reconciliation has run — its verdict (read correctly / corrected with evidence / suspect / unreadable) and the evidence it rests on (DI-011, DI-031). Text-only items are left out.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
reference* | path | string | Filing reference number, e.g. FRA-2025-E-00042. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
The filing's figures.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
FilingFigures |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/filings/{reference}/statusFiling status (poll this)
Workflow status, validation result, reviewer assignment and AI pre-review summary. Poll with back-off (e.g. 5 s → 60 s); webhooks (`filing.status_changed`) avoid polling. For a sandbox filing `status` is the simulated status.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
reference* | path | string | Filing reference number, e.g. FRA-2025-E-00042. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
FilingStatus |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/filings/{reference}/xbrlDownload the XBRL instance of an accepted filing
Only for accepted filings of the authenticated company.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
reference* | path | string | Filing reference number, e.g. FRA-2025-E-00042. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
XBRL 2.1 instance.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
string |
422 |
The filing is not accepted yet. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Attachments
Encrypted supporting documents for an existing filing.
post/filings/{reference}/attachmentsAdd an encrypted attachment to a filing
Same envelope as the filing. The decrypted bytes must match `checksum_sha256`, pass the virus scan and the content-type sniffing. Refused for finalized (accepted/rejected) filings.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
reference* | path | string | Filing reference number, e.g. FRA-2025-E-00042. |
Request body application/json — AttachmentRequest
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
fra_key_version* |
integer |
|
filename* |
string |
Letters, digits, spaces, . _ - only. |
content_type* |
string |
|
checksum_sha256* |
string |
Hex SHA-256 of the file. |
Responses
| Status | Description | Body |
|---|---|---|
201 |
Stored.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
AttachmentReceived |
422 |
Validation, decryption, checksum, scan, or finalized filing. | ApiError | ValidationError |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
500 |
Processing error (`processing_error`); the message is sanitised. | ApiError |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
Health
Liveness/readiness probes for load balancers and monitoring.
get/healthAPI health
Database reachability only; no internal state.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Healthy.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
Health |
503 |
Degraded. | Health |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/health/detailedComponent health (database, cache, queue, storage)
For load balancers and monitoring; not throttled.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status. | object |
503 |
Not healthy / not ready. |
get/health/liveLiveness probe
For load balancers and monitoring; not throttled.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status. | object |
503 |
Not healthy / not ready. |
get/health/metricsOperational metrics
FRA administrators only (portal session).
Responses
| Status | Description | Body |
|---|---|---|
200 |
Metrics. | object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
get/health/readyReadiness probe
For load balancers and monitoring; not throttled.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Status. | object |
503 |
Not healthy / not ready. |
Authentication
OAuth 2.0 client credentials. Tokens are opaque, valid for 3600 s, and carry a subset of the client's scopes.
post/oauth/tokenObtain an access token
OAuth 2.0 client-credentials grant. Send `client_id` and `client_secret` (JSON or form). `scope` (space-separated) narrows the token to a subset of the client's scopes; unknown scopes are dropped. Excluded from Idempotency-Key handling: its response is a credential and is never stored.
Request body application/json — TokenRequest
| Field | Type | Description |
|---|---|---|
grant_type* |
string (client_credentials) |
|
client_id* |
string |
|
client_secret* |
string |
|
scope |
string |
Space-separated subset of the client's scopes (optional). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Token issued.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
TokenResponse |
401 |
Unknown, inactive or expired client, or wrong secret. | OAuthError |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Developer
This document.
get/openapi.jsonThis document (JSON)
Responses
| Status | Description | Body |
|---|---|---|
200 |
OpenAPI 3.1 document.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/openapi.yamlThis document (YAML)
Responses
| Status | Description | Body |
|---|---|---|
200 |
OpenAPI 3.1 document. | string |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Public statistics
Aggregate statistics — public, cached hourly.
get/statistics/by-sectorStatistics by sector
Companies, filings and acceptance rate per sector (this year). Cached for one hour. Sandbox and test data are never counted.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Statistics.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
StatsSector[] |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/statistics/monthly-trendMonthly filing trend
Filings and acceptances per month. Cached for one hour. Sandbox and test data are never counted.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
months | query | integer | Number of months. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Statistics.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
StatsMonth[] |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/statistics/overviewPlatform overview
Companies, filings this year, acceptance rate. Cached for one hour. Sandbox and test data are never counted.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Statistics.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
StatsOverview |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/statistics/top-companiesTop companies by compliance score
Public compliance ranking. Cached for one hour. Sandbox and test data are never counted.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Statistics.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
StatsCompany[] |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/statistics/upcoming-deadlinesUpcoming filing deadlines
Template deadlines in the coming weeks with filing counts so far. Cached for one hour. Sandbox and test data are never counted.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Statistics.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object[] |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Taxonomies
XBRL taxonomies and their concepts.
get/taxonomiesActive XBRL taxonomies
Responses
| Status | Description | Body |
|---|---|---|
200 |
Taxonomies.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/taxonomies/for-sector/{sectorCode}Taxonomies applicable to a sector
Parameters
| Name | In | Type | Description |
|---|---|---|---|
sectorCode* | path | string | Sector code, e.g. INS, LEAS. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Taxonomies.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/taxonomies/{taxonomy}A taxonomy with its concepts
Parameters
| Name | In | Type | Description |
|---|---|---|---|
taxonomy* | path | integer | Taxonomy id. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Taxonomy.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
Templates
Disclosure templates (models), their fields, XBRL concepts and validators.
get/templatesActive disclosure templates
Without fields; use /templates/{template} or /templates/sync for fields.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
sector_code | query | string | Templates applicable to this sector. |
frequency | query | string | Filing frequency, e.g. annual, quarterly. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Templates.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/label-mapsLabel → field mapping dictionary
The label aliases the platform uses to map extracted line items to fields.
Responses
| Status | Description | Body |
|---|---|---|
200 |
Label map.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/sector/{sectorCode}The template of a sector
The sector-specific template, falling back to the general one.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
sectorCode* | path | string | Sector code, e.g. INS, LEAS. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Template with fields.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/syncPublished templates with their fields (delta sync)
For IR systems that mirror the templates. `since` returns only templates updated after that time.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
since | query | string (date-time) | Only templates updated since. |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Templates with fields.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
TemplateSync |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/{template}A template with its fields
404 when inactive.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
template* | path | integer | Template id (from GET /templates). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Template.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/{template}/encryptedThe template, encrypted to the client
The template JSON in the hybrid envelope, encrypted under the CLIENT's RSA public key and signed by the FRA — decrypt with your private key, verify with the FRA public key.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
template* | path | integer | Template id (from GET /templates). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Encrypted template.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
422 |
Validation failed. | ValidationError | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/{template}/field-hintsField hints for automatic mapping
Per field: labels, type, section, label aliases, XBRL concept, required.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
template* | path | integer | Template id (from GET /templates). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Hints keyed by field_key.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/{template}/fieldsThe template's fields
Ordered as on the form.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
template* | path | integer | Template id (from GET /templates). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Fields.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/{template}/schemaThe template's form schema
The JSON form schema used by the portal wizard.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
template* | path | integer | Template id (from GET /templates). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Form schema.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
get/templates/{template}/validatorsValidation rules of a template
Cross-check formulas applied by the FRA, with tolerance and severity.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
template* | path | integer | Template id (from GET /templates). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
Validators.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
TemplateValidators |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
404 |
Not found (or not yours). | object |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
XBRL test filing
Pre-validation of an XBRL report against every FRA rule layer, without filing anything (XB-IN-005).
post/xbrl/test-filingValidate an XBRL report without filing it (test filing)
Runs the full Channel D validation of an XBRL report — exactly what POST /filings/submit would apply — and returns the machine-readable validation report (`XbrlValidationReport`): every finding with its numbered rule id (rules file: `GET /xbrl/filer-manual/rules.json`), its layer (package, xbrl, calculation, duplicates, filing, data_quality, business), severity and Arabic/English message. **Nothing is filed** and no filing is created; the run is kept for audit. Send the report as `multipart/form-data` (`file`) or as JSON (`file_name` + `content_base64`). Report packages (`.xbri`, `.xbr`, `.zip`) are accepted, including multi-document Inline XBRL document sets. `template_code` is only needed when the report does not reference an FRA template entry point; `fiscal_year` checks rule FRA-109. Works with sandbox and production credentials (the company of the credential is the one whose identifier is checked). The file is malware-scanned first. HTTP 200 whenever the report could be validated — `validation.valid` says whether it would be accepted.
Request body multipart/form-data — object
| Field | Type | Description |
|---|---|---|
file* |
string |
The report or report package. |
template_code |
string |
|
fiscal_year |
integer |
Responses
| Status | Description | Body |
|---|---|---|
200 |
The validation report (valid or not).
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
XbrlTestFilingResult |
422 |
Missing or unreadable upload, unknown template_code, or the file failed the malware scan. | ApiError | ValidationError |
401 |
Missing, invalid or expired token (`missing_token`, `invalid_token`). | ApiError |
403 |
Missing scope (`insufficient_scope`), IP not allowed (`ip_not_allowed`), client certificate missing or not accepted (`client_certificate_required`, `client_certificate_mismatch`, `client_certificate_expired`, `client_certificate_revoked`, `client_certificate_not_registered`, `client_certificate_invalid`), client not bound to a company, or sandbox restriction. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
Filing agents
Third-party filing agents (accounting firms, filing service providers) acting for many companies. An agent's OAuth client belongs to the agent, not to a company: on every company-level call (the ordinary filing, status, template endpoints) send `X-FRA-Company` (company UUID or FRA licence number) and `X-FRA-Agent-User-Token` (the agent staff member's personal token, expiring after 30 days by default). The call is allowed only while that company's authorisation of the agent is in force and covers the capability it exercises (view, prepare, submit — `filing:submit` prepares a draft; `metadata.submit: true` or Channel A submits); otherwise 403 `agent_not_authorised` / `capability_not_authorised` / `template_not_authorised` / `period_not_authorised` / `segregation_of_duties`, 400 `company_required`, 401 `user_token_required` / `invalid_user_token`. Client secrets expire (365 days by default) and are rotated with POST /agent/client/rotate-secret.
get/agent/companiesCompanies that authorised this filing agent
Only authorisations in force today (active, inside valid_from…valid_to, agent approved by the FRA). Never lists any other company. Agent clients only.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-FRA-Agent-User-Token* | header | string | Personal API token of the agent staff member (issued in the agent workspace; expires). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
The authorising companies.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
401 |
Missing / invalid bearer token, or missing / expired agent user token. | ApiError |
403 |
Not an agent client (`not_an_agent_client`), agent not active, or scope missing. | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
post/agent/client/rotate-secretRotate the agent client secret
Issues a new client secret with a new expiry (agents.api.client_secret_ttl_days) and revokes every access token issued under the previous one. Requires the personal token of an agent admin. Audited. The response carries a credential and is never stored by the idempotency layer: a retry with the same key rotates again.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
X-FRA-Agent-User-Token* | header | string | Personal API token of the agent staff member (issued in the agent workspace; expires). |
Responses
| Status | Description | Body |
|---|---|---|
200 |
New secret (shown once).
Headers: X-RateLimit-Limit, X-RateLimit-Remaining |
object |
400 |
Malformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key. | ApiError |
401 |
Missing / invalid bearer token or agent user token. | ApiError |
403 |
Not an agent client, or the user token is not an agent admin's (`agent_admin_required`). | ApiError |
429 |
Rate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
Headers: Retry-After, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining |
object |
MCP
Model Context Protocol server (bring-your-own AI): JSON-RPC 2.0 over the Streamable HTTP transport. Read-only tools: search_filings, get_filing_facts, get_validation_results, get_taxonomy_element, list_entry_points, compare_filings. OAuth API clients with scope `mcp:read` see public data (accepted filings); FRA staff with a personal token see public data and their portfolio. See docs/api/MCP.md for client configuration.
post/mcpMCP JSON-RPC message (initialize, ping, tools/list, tools/call, resources/list, resources/read)
One JSON-RPC 2.0 message per request (no batches). `initialize` returns the negotiated `protocolVersion` (2025-06-18, 2025-03-26 or 2024-11-05), the server capabilities and an `Mcp-Session-Id` header; send it back on later requests (an unknown session → 404 / -32004). A notification (no `id`) is accepted with 202 and no body. Responses are `application/json` (no SSE stream; GET on this URL → 405). Tool results carry `content` (text) and `structuredContent`; a tool that cannot answer (e.g. filing not found) returns `isError: true`. Every call is audited. Limits: per caller 60 messages and 30 tool calls per minute (429 / -32003), plus the API client quota.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
Mcp-Session-Id | header | string | Session id returned by initialize. |
MCP-Protocol-Version | header | string | Negotiated protocol version (an unsupported value → 400 / -32005). |
Request body application/json — object
| Field | Type | Description |
|---|---|---|
jsonrpc* |
string (2.0) |
|
id |
string | integer |
|
method* |
string (initialize, ping, tools/list, tools/call, resources/list, resources/read, notifications/initialized, notifications/cancelled) |
|
params |
object |
Responses
| Status | Description | Body |
|---|---|---|
200 |
JSON-RPC response (result or error).
Headers: Mcp-Session-Id, X-RateLimit-Limit, X-RateLimit-Remaining, Idempotency-Replayed |
object | object |
202 |
Notification accepted (no body). | |
400 |
Parse error, invalid request, batch, unsupported protocol version, or a bad Idempotency-Key. | object |
401 |
Missing, invalid or expired token (-32001). | object |
403 |
Missing scope mcp:read, not FRA staff, IP / client certificate refused (-32002). | object |
404 |
Session not found or expired (-32004), or the server is disabled. | object |
409 |
Conflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race. | ApiError |
413 |
Request body too large. | object |
429 |
Rate limit or API client quota exceeded (-32003); Retry-After. | object |
Schemas
ApiErrorError model of the platform's own errors.
Error model of the platform's own errors.
| Field | Type | Description |
|---|---|---|
error* |
string |
Machine-readable error code, e.g. unknown_template, decryption_failed, checksum_mismatch, key_version_mismatch, submission_not_ready, invalid_figures, duplicate_submission, idempotency_key_reused, insufficient_scope, sandbox_unsupported. |
message |
string |
Human-readable explanation. |
code |
string |
Sub-code, e.g. signature_invalid / decryption_error, missing_token, invalid_token. |
ValidationErrorRequest validation failure (HTTP 422).
Request validation failure (HTTP 422).
| Field | Type | Description |
|---|---|---|
message* |
string |
|
errors* |
object |
Field → messages. |
OAuthError
| Field | Type | Description |
|---|---|---|
error* |
string (invalid_client) |
|
error_description |
string |
TokenRequest
| Field | Type | Description |
|---|---|---|
grant_type* |
string (client_credentials) |
|
client_id* |
string |
|
client_secret* |
string |
|
scope |
string |
Space-separated subset of the client's scopes (optional). |
TokenResponse
| Field | Type | Description |
|---|---|---|
access_token* |
string |
Opaque token (80 characters). |
token_type* |
string (Bearer) |
|
expires_in* |
integer |
Seconds (3600). |
scope* |
string |
Granted scopes, space-separated. |
PublicKey
| Field | Type | Description |
|---|---|---|
public_key* |
string |
PEM, RSA-2048. |
version* |
integer |
Send as fra_key_version. |
algorithm |
string (RSA-2048) |
|
purpose |
string (xbrl_transport) |
|
expires_at |
string | null (date-time) |
|
fingerprint |
string |
SHA256:<base64> of the DER key. |
is_active |
boolean |
EncryptedEnvelopeHybrid encryption envelope (XBRLEncryptionService). Steps for a request: (1) random AES-25...
Hybrid encryption envelope (XBRLEncryptionService). Steps for a request: (1) random AES-256 key + 12-byte IV; (2) AES-256-GCM encrypt the plaintext → ciphertext + 16-byte tag; (3) RSA-OAEP-encrypt the AES key with the FRA public key; (4) sign the ciphertext bytes with your RSA private key (PKCS#1 v1.5, SHA-256); (5) base64 every field. The FRA verifies the signature first, then decrypts, then compares SHA-256(plaintext) with the checksum you send.
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
XbrlFilingRequest
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
fra_key_version* |
integer |
Version of the FRA public key used. |
metadata* |
object |
|
template_code* |
string |
Template code from GET /templates. |
period_start* |
string (date) |
|
period_end* |
string (date) |
|
fiscal_year* |
integer |
|
checksum_sha256* |
string |
Hex SHA-256 of the plaintext document. |
content_type |
string (xbrl, ixbrl, iXBRL, XBRL, IXBRL, xbri, xbr, zip, xbrl-json, json, xbrl-csv) |
Format of the plaintext; a ZIP plaintext is always read as a report package. |
file_name |
string |
File name of the report or package, e.g. FRA-LIC-0001-2025-12-31-annual.xbri (naming rule FRA-121). |
sandbox_outcome |
string (accepted, rejected, requires_amendment) |
Sandbox only: simulated decision. |
attachments |
object[] |
Optional encrypted files (same envelope, same FRA key version). |
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
filename |
string |
StructuredFilingRequest
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
fra_key_version* |
integer |
|
metadata* |
object |
|
template_code* |
string |
|
fiscal_year* |
integer |
|
period_start |
string | null (date) |
|
period_end |
string | null (date) |
|
quarter |
integer | null |
|
period_label |
string | null |
|
checksum_sha256* |
string |
Hex SHA-256 of the plaintext JSON bytes. |
submit |
boolean | null |
Submit to the FRA when every readiness gate passes. |
sandbox_outcome |
string (accepted, rejected, requires_amendment) |
Sandbox only: simulated decision. |
StructuredFilingPayloadThe PLAINTEXT of a Channel B filing, before encryption. Its exact bytes are what checksum_...
The PLAINTEXT of a Channel B filing, before encryption. Its exact bytes are what checksum_sha256 covers.
| Field | Type | Description |
|---|---|---|
format* |
string = fra-structured-json-v1 |
|
figures* |
object[] |
|
field_key |
string |
Template field key (preferred). |
concept |
string |
XBRL concept QName carried by exactly one field (alternative to field_key). |
current |
number | string | null |
Current-period value; strings like "1,250" or "(5)" are read as numbers. |
prior |
number | string | null |
Comparative value. |
note |
string |
Note reference (≤ 20 chars). |
text |
object |
Text fields by field_key (≤ 5000 chars each). |
FilingReceived
| Field | Type | Description |
|---|---|---|
filing_reference* |
string |
|
submission_id* |
integer |
|
status* |
string (received) |
|
decryption_status |
string |
|
signature_valid |
boolean |
|
validation_status |
string |
|
estimated_review_time |
string |
|
rejected_attachments |
object[] |
|
index |
integer |
|
error |
string |
|
message |
string |
|
timestamp |
string (date-time) |
|
sandbox |
boolean |
|
simulated_status |
string |
|
simulated_gates |
string[] |
|
xbrl_mode |
string (standard, legacy_dynamic_fields) |
How the report was read. |
xbrl_validation |
object |
Standard mode: the stored validation run of the report (warnings only — a report with errors is refused). |
run_id |
integer |
|
status |
string (passed, warnings) |
|
rules_version |
string |
|
errors |
integer |
|
warnings |
integer |
|
findings |
XbrlValidationFinding[] |
|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
xbrl_mode_notice |
string |
Legacy mode notice. |
XbrlValidationFinding
| Field | Type | Description |
|---|---|---|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
ar* |
string |
|
en* |
string |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
XbrlValidationReportLayered validation report of an XBRL report (Channel D).
Layered validation report of an XBRL report (Channel D).
| Field | Type | Description |
|---|---|---|
report_version* |
string = 1.0 |
|
rules_version* |
string |
Version of the rules file the report was checked against. |
valid* |
boolean |
No error: the report would be accepted. |
status* |
string (passed, warnings, failed) |
|
summary* |
object |
|
errors* |
integer |
|
warnings* |
integer |
|
info* |
integer |
|
layers* |
object[] |
|
layer* |
string |
|
title |
object |
|
ar |
string |
|
en |
string |
|
status* |
string (passed, warnings, failed, skipped, not_configured, disabled) |
|
errors* |
integer |
|
warnings* |
integer |
|
detail |
object |
Layer details (Arelle mode and version, checks counted…). |
findings* |
XbrlValidationFinding[] |
|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
ar* |
string |
|
en* |
string |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
report |
object |
|
file_name |
string |
|
file_sha256 |
string |
|
format |
string (ixbrl, ixbrl-set, xbrl-xml, xbrl-json, xbrl-csv, unknown) |
|
documents |
string[] |
|
schema_refs |
string[] |
|
entry_point |
string | null |
|
taxonomy_version |
string | null |
|
entity |
object | null |
|
scheme |
string |
|
id |
string |
|
facts |
integer |
|
mapping |
object | null |
|
template_code |
string |
|
framework |
string |
|
fiscal_year |
integer |
|
figures |
integer |
Template rows filled. |
unmapped |
integer |
|
dimensional_not_transferred |
integer |
|
generated_at |
string (date-time) |
XbrlTestFilingRequest
| Field | Type | Description |
|---|---|---|
file_name* |
string |
e.g. FRA-LIC-0001-2025-12-31-annual.xbri |
content_base64* |
string |
The report or report package bytes. |
template_code |
string |
Only when the report references no FRA template entry point. |
fiscal_year |
integer |
XbrlTestFilingResult
| Field | Type | Description |
|---|---|---|
environment* |
string (sandbox, production) |
|
filed* |
boolean = |
|
run_id |
integer |
Stored validation run (audit). |
validation* |
XbrlValidationReport |
Layered validation report of an XBRL report (Channel D). |
report_version* |
string = 1.0 |
|
rules_version* |
string |
Version of the rules file the report was checked against. |
valid* |
boolean |
No error: the report would be accepted. |
status* |
string (passed, warnings, failed) |
|
summary* |
object |
|
errors* |
integer |
|
warnings* |
integer |
|
info* |
integer |
|
layers* |
object[] |
|
layer* |
string |
|
title |
object |
|
status* |
string (passed, warnings, failed, skipped, not_configured, disabled) |
|
errors* |
integer |
|
warnings* |
integer |
|
detail |
object |
Layer details (Arelle mode and version, checks counted…). |
findings* |
XbrlValidationFinding[] |
|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
report |
object |
|
file_name |
string |
|
file_sha256 |
string |
|
format |
string (ixbrl, ixbrl-set, xbrl-xml, xbrl-json, xbrl-csv, unknown) |
|
documents |
string[] |
|
schema_refs |
string[] |
|
entry_point |
string | null |
|
taxonomy_version |
string | null |
|
entity |
object | null |
|
facts |
integer |
|
mapping |
object | null |
|
template_code |
string |
|
framework |
string |
|
fiscal_year |
integer |
|
figures |
integer |
Template rows filled. |
unmapped |
integer |
|
dimensional_not_transferred |
integer |
|
generated_at |
string (date-time) |
XbrlValidationFailedThe XBRL report was refused; nothing was filed.
The XBRL report was refused; nothing was filed.
| Field | Type | Description |
|---|---|---|
error* |
string (xbrl_validation_failed) |
|
message |
string |
|
xbrl_mode |
string = standard |
|
validation* |
XbrlValidationReport |
Layered validation report of an XBRL report (Channel D). |
report_version* |
string = 1.0 |
|
rules_version* |
string |
Version of the rules file the report was checked against. |
valid* |
boolean |
No error: the report would be accepted. |
status* |
string (passed, warnings, failed) |
|
summary* |
object |
|
errors* |
integer |
|
warnings* |
integer |
|
info* |
integer |
|
layers* |
object[] |
|
layer* |
string |
|
title |
object |
|
status* |
string (passed, warnings, failed, skipped, not_configured, disabled) |
|
errors* |
integer |
|
warnings* |
integer |
|
detail |
object |
Layer details (Arelle mode and version, checks counted…). |
findings* |
XbrlValidationFinding[] |
|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
report |
object |
|
file_name |
string |
|
file_sha256 |
string |
|
format |
string (ixbrl, ixbrl-set, xbrl-xml, xbrl-json, xbrl-csv, unknown) |
|
documents |
string[] |
|
schema_refs |
string[] |
|
entry_point |
string | null |
|
taxonomy_version |
string | null |
|
entity |
object | null |
|
facts |
integer |
|
mapping |
object | null |
|
template_code |
string |
|
framework |
string |
|
fiscal_year |
integer |
|
figures |
integer |
Template rows filled. |
unmapped |
integer |
|
dimensional_not_transferred |
integer |
|
generated_at |
string (date-time) |
SubmissionNotReadyStored as a draft; the company completes it in the portal.
Stored as a draft; the company completes it in the portal.
| Field | Type | Description |
|---|---|---|
error* |
string = submission_not_ready |
|
message |
string |
|
filing_reference* |
string |
|
submission_id |
integer |
|
status* |
string = draft |
|
blocking* |
object[] |
|
gate |
string (checklist, attestation, approval) |
|
messages |
string[] |
|
sandbox |
boolean |
StructuredFilingResult
| Field | Type | Description |
|---|---|---|
filing_reference* |
string |
|
submission_id* |
integer |
|
figures |
integer |
Figures bound (current + prior). |
values_hash |
string |
Canonical hash of the figures as filed (what an auditor seal covers). |
warnings |
object[] |
|
status* |
string (draft, received) |
|
message |
string |
|
sandbox |
boolean |
|
simulated_status |
string |
|
simulated_gates |
string[] |
InvalidFigures
| Field | Type | Description |
|---|---|---|
error* |
string = invalid_figures |
|
message |
string |
|
errors* |
object[] |
|
index |
integer |
|
field_key |
string |
|
concept |
string |
|
error |
string (unknown_field_key, unknown_concept, ambiguous_concept, not_a_number, duplicate_field, text_field_in_figures, numeric_field_in_text, missing_field_key_or_concept, no_figures) |
|
candidates |
string[] |
|
period |
string |
FromExtractionRequest
| Field | Type | Description |
|---|---|---|
template_id* |
integer |
|
period_start* |
string (date) |
|
period_end* |
string (date) |
|
fiscal_year* |
integer |
|
quarter |
integer | null |
|
extracted_data* |
object[] |
At least one item. |
item* |
string |
Line-item label. |
value |
number | null |
|
type |
string | null |
|
section |
string | null |
|
source |
string | null |
|
ai_model |
string | null |
ExtractionMappingResult
| Field | Type | Description |
|---|---|---|
submission_id |
integer |
|
filing_reference |
string |
|
status |
string (draft, mapping_review) |
|
mapping_summary |
object |
total_extracted, matched, unmatched, average_confidence, fields_by_confidence. |
form_data |
object |
field_key → value. |
dynamic_fields |
object[] |
|
field_map |
object |
Mapping detail. |
FilingSummaryThe filing row (additional columns may appear).
The filing row (additional columns may appear).
| Field | Type | Description |
|---|---|---|
id |
integer |
|
reference_number |
string |
|
status |
string |
|
period_label |
string |
|
fiscal_year |
integer | null |
|
quarter |
integer | null |
|
source |
string |
|
is_test |
boolean |
Sandbox filing. |
submitted_at |
string | null (date-time) |
|
created_at |
string | null (date-time) |
|
template |
object | null |
|
id |
integer |
|
code |
string |
|
name |
string |
|
name_ar |
string |
FilingList
| Field | Type | Description |
|---|---|---|
data |
FilingSummary[] |
|
id |
integer |
|
reference_number |
string |
|
status |
string |
|
period_label |
string |
|
fiscal_year |
integer | null |
|
quarter |
integer | null |
|
source |
string |
|
is_test |
boolean |
Sandbox filing. |
submitted_at |
string | null (date-time) |
|
created_at |
string | null (date-time) |
|
template |
object | null |
|
id |
integer |
|
code |
string |
|
name |
string |
|
name_ar |
string |
|
total |
integer |
|
page |
integer |
FilingFigure
| Field | Type | Description |
|---|---|---|
fig_id |
string | null |
Stable figure id within the filing. |
label |
string | null |
Line label as read (Arabic when available). |
statement |
string | null |
Statement code, e.g. SFP, PL, OCI, CF, SCE or a note. |
period |
string | null |
Period context, e.g. current / prior. |
year |
integer | null |
|
value* |
number |
|
page |
integer | null |
Source PDF page (1-based). |
row_y |
number | null |
Vertical position of the row on the page. |
bbox |
array | null |
Bounding box of the figure on the page. |
bbox_source |
string | null |
How the bounding box was obtained. |
dr_status |
string | null |
Data-reconciliation status of the figure. |
verdict |
string | null (read_correctly, corrected_with_evidence, suspect, unreadable, ) |
Per-figure verdict. |
evidence |
object | array | null |
The evidence the verdict rests on. |
FilingFigures
| Field | Type | Description |
|---|---|---|
filing_reference* |
string |
|
verdicts_available* |
boolean |
True once data reconciliation has run on the filing. |
verdict_values |
string (read_correctly, corrected_with_evidence, suspect, unreadable)[] |
|
summary |
object | null |
|
total |
integer |
|
counts |
object |
Figures per verdict. |
face |
object |
Primary-statement figures per verdict. |
notes |
object |
Note figures per verdict. |
figures* |
FilingFigure[] |
|
fig_id |
string | null |
Stable figure id within the filing. |
label |
string | null |
Line label as read (Arabic when available). |
statement |
string | null |
Statement code, e.g. SFP, PL, OCI, CF, SCE or a note. |
period |
string | null |
Period context, e.g. current / prior. |
year |
integer | null |
|
value* |
number |
|
page |
integer | null |
Source PDF page (1-based). |
row_y |
number | null |
Vertical position of the row on the page. |
bbox |
array | null |
Bounding box of the figure on the page. |
bbox_source |
string | null |
How the bounding box was obtained. |
dr_status |
string | null |
Data-reconciliation status of the figure. |
verdict |
string | null (read_correctly, corrected_with_evidence, suspect, unreadable, ) |
Per-figure verdict. |
evidence |
object | array | null |
The evidence the verdict rests on. |
FilingStatus
| Field | Type | Description |
|---|---|---|
filing_reference* |
string |
|
status* |
string |
draft | mapping_review | submitted | fra_assigned | fra_under_review | accepted | rejected | requires_amendment | … |
sandbox |
boolean |
|
template |
object |
|
code |
string |
|
name |
string |
|
name_ar |
string |
|
period_label |
string |
|
validation_status |
string |
|
validation_errors |
object[] |
|
validation_warnings |
object[] |
|
inspector_assigned |
boolean |
|
inspector_name |
string | null |
|
review_notes |
string | null |
|
review_started_at |
string | null (date-time) |
|
review_completed_at |
string | null (date-time) |
|
ai_review |
object | null |
|
compliance_score |
number | null |
|
risk_level |
string |
|
suggested_decision |
string |
|
penalty_amount |
number | string | null |
|
is_amendment |
boolean | null |
|
resubmission_count |
integer | null |
|
submitted_at |
string | null (date-time) |
|
last_updated_at |
string | null (date-time) |
AttachmentRequest
| Field | Type | Description |
|---|---|---|
encrypted_key* |
string |
The 32-byte AES-256 key, encrypted with RSA-OAEP (SHA-1, MGF1-SHA-1 — OpenSSL OPENSSL_PKCS1_OAEP_PADDING) under the RECIPIENT's public key (FRA's for requests). |
iv* |
string |
12-byte random GCM nonce. |
ciphertext* |
string |
AES-256-GCM ciphertext of the plaintext (no AAD). |
auth_tag* |
string |
16-byte GCM authentication tag. |
signature* |
string |
RSASSA-PKCS1-v1_5 / SHA-256 signature by the SENDER over the raw ciphertext bytes (not the base64 text). |
fra_key_version* |
integer |
|
filename* |
string |
Letters, digits, spaces, . _ - only. |
content_type* |
string |
|
checksum_sha256* |
string |
Hex SHA-256 of the file. |
AttachmentReceived
| Field | Type | Description |
|---|---|---|
attachment_id |
integer |
|
filename |
string |
|
file_size |
integer |
|
status |
string = received |
|
timestamp |
string (date-time) |
DisclosureEnvelope
| Field | Type | Description |
|---|---|---|
disclosure_id* |
string |
ULID chosen by the issuer. |
envelope_version |
string |
Default 1.0. |
company_id* |
string |
Issuer company identifier. |
category* |
string |
Disclosure category. |
language |
string (ar, en) |
|
submitted_at* |
string (date-time) |
Within ±5 min of FRA time. |
period |
object |
|
start |
string | null (date) |
|
end |
string | null (date) |
|
fiscal_year |
integer | null |
|
quarter |
integer | null |
|
figures |
object[] |
|
quotes |
object[] |
|
attachments |
object[] |
|
promises |
object[] |
|
audit |
object |
|
ir_validation_hash |
string |
SHA-256 of canonical {figures, quotes, promises}. |
signatures |
object |
|
issuer_sig |
string |
Signature over the canonical JSON without `signatures`. |
issuer_cert_thumbprint |
string |
DisclosureReceived
| Field | Type | Description |
|---|---|---|
data |
object |
|
tracking_id |
string |
|
status |
string |
|
received_at |
string | null (date-time) |
|
flags |
RuleFlag[] |
|
rule_id |
string |
|
severity |
string (critical, warning, info) |
|
title |
string |
|
citation |
string | null |
DisclosureStatus
| Field | Type | Description |
|---|---|---|
data |
object |
|
tracking_id |
string |
|
status |
string |
|
received_at |
string | null (date-time) |
|
approved_at |
string | null (date-time) |
|
published_at |
string | null (date-time) |
|
rejected_at |
string | null (date-time) |
|
rejection_reason |
string | null |
|
flags_count |
object |
|
critical |
integer |
|
warning |
integer |
|
info |
integer |
RuleFlagA rule finding (further fields may appear).
A rule finding (further fields may appear).
| Field | Type | Description |
|---|---|---|
rule_id |
string |
|
severity |
string (critical, warning, info) |
|
title |
string |
|
citation |
string | null |
CanonicalRuleCanonical rule: id, category, severity, titles, formula/condition, citation, versioning.
Canonical rule: id, category, severity, titles, formula/condition, citation, versioning.
DecreeDecree or circular: id, number, date, titles, articles.
Decree or circular: id, number, date, titles, articles.
PageMeta
| Field | Type | Description |
|---|---|---|
current_page |
integer |
|
per_page |
integer |
|
total |
integer |
|
last_page |
integer |
|
served_at |
string | null (date-time) |
DeadlineList
| Field | Type | Description |
|---|---|---|
data |
object[] |
|
id |
integer |
|
template_code |
string | null |
|
template_name |
string | null |
|
period_label |
string | null |
|
period_start |
string | null (date) |
|
period_end |
string | null (date) |
|
deadline_date |
string | null (date) |
|
status |
string |
|
is_overdue |
boolean |
|
days_until |
integer | null |
|
penalty_amount |
number | string | null |
|
submission_id |
integer | null |
|
notes |
string | null |
|
meta |
object |
|
total |
integer |
|
overdue |
integer |
ReportingPeriodList
| Field | Type | Description |
|---|---|---|
year |
integer |
|
count |
integer |
|
periods |
object[] |
|
id |
integer |
|
period_name_ar |
string |
|
period_name_en |
string | null |
|
period_type |
string |
|
period_type_label |
string |
|
fiscal_year |
integer |
|
start_date |
string | null (date) |
|
end_date |
string | null (date) |
|
submission_deadline |
string | null (date) |
|
extended_deadline |
string | null (date) |
|
effective_deadline |
string | null (date) |
|
applies_to |
string[] |
|
days_until_deadline |
integer | null |
|
deadline_status |
string |
|
notes_ar |
string | null |
ComplianceHistory
| Field | Type | Description |
|---|---|---|
data |
object[] |
|
id |
integer |
|
score |
number |
|
previous_score |
number | null |
|
change |
number | null |
|
direction |
string |
|
reason |
string |
|
reason_label |
string |
|
component_scores |
object | null |
Component → score. |
date |
string | null (date) |
|
timestamp |
string | null (date-time) |
|
meta |
object |
|
company_id |
string |
|
company_name |
string |
|
from |
string | null (date) |
|
to |
string | null (date) |
|
count |
integer |
|
latest_score |
number | null |
TemplateTemplate (resource fields may vary by endpoint).
Template (resource fields may vary by endpoint).
| Field | Type | Description |
|---|---|---|
id |
integer |
|
code |
string |
|
name |
string |
|
name_ar |
string |
|
description |
string | null |
|
filing_frequency |
string |
|
sector_codes |
array | null |
|
submission_window_days |
integer | null |
|
requires_xbrl |
boolean |
|
requires_auditor_sign |
boolean | null |
|
version |
string | null |
|
fields |
TemplateField[] |
|
field_key* |
string |
|
label |
string |
|
label_ar |
string |
|
field_type |
string |
currency, number, decimal, percentage, text, … |
section |
string | null |
|
section_ar |
string | null |
|
is_required |
boolean | null |
|
options |
array | object | null |
|
xbrl_concept |
string | null |
|
sort_order |
integer | null |
TemplateField
| Field | Type | Description |
|---|---|---|
field_key* |
string |
|
label |
string |
|
label_ar |
string |
|
field_type |
string |
currency, number, decimal, percentage, text, … |
section |
string | null |
|
section_ar |
string | null |
|
is_required |
boolean | null |
|
options |
array | object | null |
|
xbrl_concept |
string | null |
|
sort_order |
integer | null |
TemplateSync
| Field | Type | Description |
|---|---|---|
data |
object[] |
|
id |
integer |
|
code |
string |
|
name |
string |
|
name_ar |
string |
|
description |
string | null |
|
filing_frequency |
string |
|
sector_codes |
array | null |
|
submission_window_days |
integer | null |
|
requires_xbrl |
boolean |
|
requires_auditor_sign |
boolean | null |
|
version |
string | null |
|
fields |
TemplateField[] |
|
field_key* |
string |
|
label |
string |
|
label_ar |
string |
|
field_type |
string |
currency, number, decimal, percentage, text, … |
section |
string | null |
|
section_ar |
string | null |
|
is_required |
boolean | null |
|
options |
array | object | null |
|
xbrl_concept |
string | null |
|
sort_order |
integer | null |
|
category |
string | null |
|
updated_at |
string | null (date-time) |
|
total |
integer |
|
synced_at |
string | null (date-time) |
TemplateValidators
| Field | Type | Description |
|---|---|---|
template_id |
integer |
|
template_code |
string |
|
validators |
object[] |
|
code |
string |
|
category |
string |
|
label_ar |
string |
|
label_en |
string | null |
|
formula |
string |
|
tolerance_percent |
number | string | null |
|
severity |
string |
|
is_error |
boolean |
Taxonomy
| Field | Type | Description |
|---|---|---|
id |
integer |
|
name |
string |
|
name_ar |
string | null |
|
namespace |
string |
|
version |
string |
|
type |
string |
|
sector_codes |
array | null |
TaxonomyConcept
| Field | Type | Description |
|---|---|---|
id |
integer |
|
qname |
string |
|
label_en |
string | null |
|
label_ar |
string | null |
|
data_type |
string | null |
|
period_type |
string | null |
AccessRequest
| Field | Type | Description |
|---|---|---|
company_name* |
string |
|
company_name_ar |
string | null |
|
fra_license_number |
string | null |
|
sector_code |
string | null |
|
entity_type |
string | null (listed_company, nbfi, insurance, mortgage, leasing, factoring, microfinance, consumer_finance, fintech, securitization, other) |
|
contact_name* |
string |
|
contact_email* |
string (email) |
|
contact_phone |
string | null |
|
rsa_public_key |
string | null |
PEM. |
webhook_url |
string | null (uri) |
|
ir_system_base_url* |
string (uri) |
|
notes |
string | null |
AccessRequestCreated
| Field | Type | Description |
|---|---|---|
request_id |
integer |
|
status |
string = pending |
|
message |
string |
|
timestamp |
string | null (date-time) |
AccessRequestStatus
| Field | Type | Description |
|---|---|---|
request_id |
integer |
|
status |
string |
|
company_name |
string |
|
submitted_at |
string | null (date-time) |
|
reviewed_at |
string | null (date-time) |
|
review_notes |
string | null |
|
credentials |
object |
|
client_id |
string |
|
fra_base_url |
string |
|
tenant_created |
boolean |
StatsOverview
| Field | Type | Description |
|---|---|---|
total_tenants |
integer |
|
active_tenants |
integer |
|
total_submissions_ytd |
integer |
|
acceptance_rate |
number |
|
last_updated |
string | null (date-time) |
StatsSector
| Field | Type | Description |
|---|---|---|
sector_id |
integer |
|
sector_name_ar |
string |
|
sector_name_en |
string |
|
tenant_count |
integer |
|
submission_count_ytd |
integer |
|
acceptance_rate |
number |
StatsMonth
| Field | Type | Description |
|---|---|---|
month |
string |
|
submissions |
integer |
|
accepted |
integer |
|
rate |
number |
StatsCompany
| Field | Type | Description |
|---|---|---|
fra_license_number |
string |
|
company_name_ar |
string |
|
sector |
string | null |
|
compliance_score |
number |
|
submissions_count |
integer |
Fact
| Field | Type | Description |
|---|---|---|
id* |
integer |
|
concept* |
string |
QName. |
value* |
string | null |
Reported value (natural XBRL sign). |
numeric_value |
number | null |
|
unit |
string | null |
e.g. iso4217:EGP. |
decimals |
integer | null |
|
period* |
object |
|
type |
string (instant, duration) |
|
start |
string | null (date) |
|
end |
string | null (date) |
|
instant |
string | null (date) |
|
context |
string | null (current, prior) |
|
dimensions |
object |
Axis → member. |
labels |
object |
|
ar |
string | null |
|
en |
string | null |
|
statement |
string | null |
|
company* |
object |
|
name_ar |
string | null |
|
name_en |
string | null |
|
license |
string | null |
|
lei |
string | null |
|
sector |
object | null |
|
code |
string |
|
name_ar |
string | null |
|
name_en |
string | null |
|
filing* |
object |
|
reference |
string |
|
template |
string | null |
|
fiscal_year |
integer | null |
|
period |
string (FY, Q1, Q2, Q3, Q4) |
|
period_label |
string | null |
|
accepted_at |
string | null (date-time) |
|
historical |
boolean |
Migrated from the legacy system. |
links |
object |
ixbrl, report_package, xbrl_xml, xbrl_json, xbrl_csv, xbrl_csv_package, viewer, validation. |
FactPage
| Field | Type | Description |
|---|---|---|
data |
Fact[] |
|
id* |
integer |
|
concept* |
string |
QName. |
value* |
string | null |
Reported value (natural XBRL sign). |
numeric_value |
number | null |
|
unit |
string | null |
e.g. iso4217:EGP. |
decimals |
integer | null |
|
period* |
object |
|
type |
string (instant, duration) |
|
start |
string | null (date) |
|
end |
string | null (date) |
|
instant |
string | null (date) |
|
context |
string | null (current, prior) |
|
dimensions |
object |
Axis → member. |
labels |
object |
|
ar |
string | null |
|
en |
string | null |
|
statement |
string | null |
|
company* |
object |
|
name_ar |
string | null |
|
name_en |
string | null |
|
license |
string | null |
|
lei |
string | null |
|
sector |
object | null |
|
filing* |
object |
|
reference |
string |
|
template |
string | null |
|
fiscal_year |
integer | null |
|
period |
string (FY, Q1, Q2, Q3, Q4) |
|
period_label |
string | null |
|
accepted_at |
string | null (date-time) |
|
historical |
boolean |
Migrated from the legacy system. |
links |
object |
ixbrl, report_package, xbrl_xml, xbrl_json, xbrl_csv, xbrl_csv_package, viewer, validation. |
meta |
object |
|
total |
integer |
|
page |
integer |
|
per_page |
integer |
|
last_page |
integer |
|
filters |
object |
Applied filters. |
classification |
string |
|
generated_at |
string | null (date-time) |
|
links |
object |
|
self |
string |
|
next |
string | null |
|
prev |
string | null |
|
bulk |
string |
|
dictionary |
string |
PublicSearchPage
| Field | Type | Description |
|---|---|---|
data |
object[] |
|
id |
integer |
|
kind |
string (filing, note, figure) |
|
locale |
string (ar, en, mul) |
|
title |
string |
|
title_html |
string |
Title, HTML-escaped, matches in <mark>. |
snippet_html |
string |
Excerpt around the first match, HTML-escaped, matches in <mark>. |
score |
number |
|
filing |
object |
|
id |
integer |
|
reference |
string | null |
|
company |
object |
|
sector |
string | null |
|
template |
string | null |
|
fiscal_year |
integer | null |
|
period |
string | null |
|
period_label |
string | null |
|
accepted_at |
string | null (date-time) |
|
links |
object |
ixbrl, report_package, xbrl_xml, xbrl_json, xbrl_csv, xbrl_csv_package, viewer, validation, validation_report, validation_report_json. |
meta |
object |
|
total |
integer |
|
page |
integer |
|
per_page |
integer |
|
last_page |
integer |
|
query |
string |
|
filters |
object |
Applied filters. |
engine |
string (fulltext, like) |
|
classification |
string |
|
normalization |
string |
|
links |
object |
|
next |
string | null |
|
prev |
string | null |
PublicFilingValidation
| Field | Type | Description |
|---|---|---|
filing |
object |
id, reference, company {name_ar, name_en, license, lei}, template, fiscal_year, period, accepted_at, links. |
status |
string (valid, warnings, errors, not_available) |
|
validation |
XbrlValidationReport |
Layered validation report of an XBRL report (Channel D). |
report_version* |
string = 1.0 |
|
rules_version* |
string |
Version of the rules file the report was checked against. |
valid* |
boolean |
No error: the report would be accepted. |
status* |
string (passed, warnings, failed) |
|
summary* |
object |
|
errors* |
integer |
|
warnings* |
integer |
|
info* |
integer |
|
layers* |
object[] |
|
layer* |
string |
|
title |
object |
|
status* |
string (passed, warnings, failed, skipped, not_configured, disabled) |
|
errors* |
integer |
|
warnings* |
integer |
|
detail |
object |
Layer details (Arelle mode and version, checks counted…). |
findings* |
XbrlValidationFinding[] |
|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
report |
object |
|
file_name |
string |
|
file_sha256 |
string |
|
format |
string (ixbrl, ixbrl-set, xbrl-xml, xbrl-json, xbrl-csv, unknown) |
|
documents |
string[] |
|
schema_refs |
string[] |
|
entry_point |
string | null |
|
taxonomy_version |
string | null |
|
entity |
object | null |
|
facts |
integer |
|
mapping |
object | null |
|
template_code |
string |
|
framework |
string |
|
fiscal_year |
integer |
|
figures |
integer |
Template rows filled. |
unmapped |
integer |
|
dimensional_not_transferred |
integer |
|
generated_at |
string (date-time) |
PublicXbrlCheckResult
| Field | Type | Description |
|---|---|---|
filed |
boolean = |
|
stored |
boolean = |
|
validation |
XbrlValidationReport |
Layered validation report of an XBRL report (Channel D). |
report_version* |
string = 1.0 |
|
rules_version* |
string |
Version of the rules file the report was checked against. |
valid* |
boolean |
No error: the report would be accepted. |
status* |
string (passed, warnings, failed) |
|
summary* |
object |
|
errors* |
integer |
|
warnings* |
integer |
|
info* |
integer |
|
layers* |
object[] |
|
layer* |
string |
|
title |
object |
|
status* |
string (passed, warnings, failed, skipped, not_configured, disabled) |
|
errors* |
integer |
|
warnings* |
integer |
|
detail |
object |
Layer details (Arelle mode and version, checks counted…). |
findings* |
XbrlValidationFinding[] |
|
rule_id* |
string |
Rule id from the rules file (PKG-0xx, XBRL-0xx/1xx, CALC-0xx, DUP-0xx, FRA-1xx, DQ-0xx, FRA-00x, FRA_INS_SOLVENCY). |
layer* |
string (package, xbrl, calculation, duplicates, filing, data_quality, business) |
|
severity* |
string (error, warning, info) |
|
message* |
object |
|
concept |
string |
Element QName (platform prefixes: ifrs-full, fra, fra-ins…). |
context |
string |
|
period |
string |
|
unit |
string |
|
value |
string |
|
field |
string |
Template field key. |
path |
string |
Path inside the package. |
arelle_code |
string |
Arelle message code (layer xbrl). |
document |
string |
Document of an Inline XBRL document set. |
source |
string |
arelle when the finding comes from Arelle. |
report |
object |
|
file_name |
string |
|
file_sha256 |
string |
|
format |
string (ixbrl, ixbrl-set, xbrl-xml, xbrl-json, xbrl-csv, unknown) |
|
documents |
string[] |
|
schema_refs |
string[] |
|
entry_point |
string | null |
|
taxonomy_version |
string | null |
|
entity |
object | null |
|
facts |
integer |
|
mapping |
object | null |
|
template_code |
string |
|
framework |
string |
|
fiscal_year |
integer |
|
figures |
integer |
Template rows filled. |
unmapped |
integer |
|
dimensional_not_transferred |
integer |
|
generated_at |
string (date-time) |
BulkFileList
| Field | Type | Description |
|---|---|---|
data |
object[] |
|
year |
integer |
|
format |
string (csv, json) |
|
name |
string |
|
rows |
integer |
|
bytes |
integer |
|
sha256 |
string |
|
generated_at |
string | null (date-time) |
|
url |
string (uri) |
|
meta |
object |
|
generated_at |
string | null (date-time) |
|
taxonomy |
string | null |
|
columns |
string[] |
|
dictionary |
string |
Health
| Field | Type | Description |
|---|---|---|
status |
string (ok, degraded) |
|
system |
string |
|
timestamp |
string | null (date-time) |
WebhookPayloadEvent body (fields depend on the event).
Event body (fields depend on the event).
| Field | Type | Description |
|---|---|---|
event* |
string |
|
filing_reference |
string |
|
old_status |
string |
|
new_status |
string |
|
review_notes |
string | null |
|
timestamp |
string | null (date-time) |
|
metadata |
object |
Event-specific details. |