English
منصة الإفصاح الإلكتروني الإصدار المتقدمالهيئة العامة للرقابة المالية

بوابة المطورين — 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.

Base URL: https://fra2.corprise.ai/api/v1
Spec: https://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>'
ScopeGrants
filing:submitSubmit filings, structured figures and attachments.
filing:statusRead filings, their status, deadlines and the reporting calendar.
template:readRead templates, fields and validators.
taxonomy:readRead taxonomies.
client:key_rotateReplace the client's RSA signing key.
compliance:read_allRead any company's compliance history (FRA/partner clients only).
mcp:readRead 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.

FieldTypeMeaning
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.

StatusBodyMeaning
BadRequestApiErrorMalformed request: missing (`idempotency_key_required`) or invalid (`invalid_idempotency_key`) Idempotency-Key.
UnauthorizedApiErrorMissing, invalid or expired token (`missing_token`, `invalid_token`).
ForbiddenApiErrorMissing 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.
NotFoundValidationError | ApiErrorNot found (or not yours).
ConflictApiErrorConflict: duplicate payload (`duplicate_submission`), idempotent request in progress (`idempotency_request_in_progress`), or a lost status race.
ValidationFailedValidationError | ApiErrorValidation failed.
TooManyRequestsValidationError | ApiErrorRate limit exceeded — for authenticated calls the API client's own per-minute or per-day quota (`rate_limit_exceeded`, `retry_after` seconds).
ServerErrorApiErrorProcessing error (`processing_error`); the message is sanitised.
ApiError fieldTypeMeaning
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.

EventWhen
filing.status_changedA 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_assignedA reviewer was assigned to a filing. Delivered to the client's webhook_url; retried with back-off on non-2xx.
filing.amendment_requestedThe FRA requested an amendment. Delivered to the client's webhook_url; retried with back-off on non-2xx.
filing.validation_completedXBRL validation finished. Delivered to the client's webhook_url; retried with back-off on non-2xx.
template.updatedA template the client uses changed. Delivered to the client's webhook_url; retried with back-off on non-2xx.
template.deployedA template was deployed to the client. Delivered to the client's webhook_url; retried with back-off on non-2xx.
access_request.approvedAn access request was approved. Delivered to the client's webhook_url; retried with back-off on non-2xx.
access_request.rejectedAn 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
operationId: createAccessRequest public rate: 5/min Idempotency-Key

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

FieldTypeDescription
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

StatusDescriptionBody
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
operationId: requestKeyRegeneration public rate: 3/min Idempotency-Key

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

FieldTypeDescription
client_id* string
contact_email* string (email)
reason* string

Responses

StatusDescriptionBody
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
operationId: getAccessRequestStatus public rate: 30/min

The contact email must match. Once approved, `credentials.client_id` is included (the secret is delivered out of band).

Parameters

NameInTypeDescription
id*pathintegerRequest id.
email*querystring (email)Contact email of the request.

Responses

StatusDescriptionBody
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
operationId: agencyComplianceAggregates agencyApiKey rate: 30/min

Status totals, 6-month trend and sector compliance rates. Requires an active data-sharing agreement; access is logged.

Responses

StatusDescriptionBody
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
operationId: agencyFilingTimeline agencyApiKey rate: 30/min

Submitted / accepted / rejected / pending per month, last 12 months. Requires an active data-sharing agreement; access is logged.

Responses

StatusDescriptionBody
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
operationId: agencySectorStats agencyApiKey rate: 30/min

Active companies, filings and acceptance per sector this year. Requires an active data-sharing agreement; access is logged.

Responses

StatusDescriptionBody
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
operationId: rotateClientKey fraOAuth: client:key_rotatemutualTLS rate: 5/min Idempotency-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

FieldTypeDescription
rsa_public_key* string PEM-encoded RSA public key (min. 200 characters).

Responses

StatusDescriptionBody
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
operationId: getPublicKey public rate: 60/min

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

StatusDescriptionBody
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
operationId: getPublicKeyVersion public rate: 60/min

For payloads prepared just before a rotation.

Parameters

NameInTypeDescription
version*pathintegerKey version.

Responses

StatusDescriptionBody
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
operationId: getComplianceHistory fraOAuthmutualTLS rate: 60/min

A client reads only its own company unless its token holds `compliance:read_all`.

Parameters

NameInTypeDescription
id*pathstringCompany (tenant) id.
monthsqueryintegerWindow when from/to are absent.
fromquerystring (date)Start date.
toquerystring (date)End date.

Responses

StatusDescriptionBody
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
operationId: listDeadlines fraOAuth: filing:statusmutualTLS rate: 60/min

Pending and overdue by default.

Parameters

NameInTypeDescription
statusquerystring (pending, filed, overdue, waived)Only this status.
include_pastquerybooleanInclude deadlines older than 30 days.

Responses

StatusDescriptionBody
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
operationId: listReportingPeriods fraOAuth: filing:statusmutualTLS rate: 60/min

Published reporting periods of a year (default: current year).

Parameters

NameInTypeDescription
yearqueryintegerFiscal year.

Responses

StatusDescriptionBody
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
operationId: listDecrees public rate: 120/min (shared api limiter)

Decrees and circulars the rules cite.

Responses

StatusDescriptionBody
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
operationId: getDecree public rate: 120/min (shared api limiter)

Parameters

NameInTypeDescription
id*pathstringDecree id.

Responses

StatusDescriptionBody
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
operationId: listRules public rate: 120/min (shared api limiter)

Paginated; `since` returns rules changed after a timestamp (delta sync).

Parameters

NameInTypeDescription
sincequerystring (date-time)Only rules updated since.
categoryquerystringRule category.
severityquerystringcritical | warning | info.
per_pagequeryintegerPage size.
pagequeryintegerPage.

Responses

StatusDescriptionBody
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)
operationId: evaluateRules public rate: 120/min (shared api limiter) Idempotency-Key

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

FieldTypeDescription
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

StatusDescriptionBody
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
operationId: getRule public rate: 120/min (shared api limiter)

Parameters

NameInTypeDescription
ruleId*pathstringRule id.

Responses

StatusDescriptionBody
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
operationId: submitDisclosureEnvelope fraOAuth: filing:submitmutualTLS rate: 120/min (shared api limiter) Idempotency-Key

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

FieldTypeDescription
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

StatusDescriptionBody
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
operationId: getDisclosureStatus fraOAuth: filing:statusmutualTLS rate: 120/min (shared api limiter)

Tenant-isolated: only the issuer's own disclosures.

Parameters

NameInTypeDescription
trackingId*pathstringULID returned as `tracking_id`.

Responses

StatusDescriptionBody
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
operationId: extractionJob portalSession

Parameters

NameInTypeDescription
job_id*pathstringExtraction job id.

Responses

StatusDescriptionBody
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
operationId: extractionJobExportXbrl portalSession Idempotency-Key

Session + CSRF token.

Parameters

NameInTypeDescription
job_id*pathstringExtraction job id.

Responses

StatusDescriptionBody
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
operationId: extractionJobRetry portalSession Idempotency-Key

Session + CSRF token.

Parameters

NameInTypeDescription
job_id*pathstringExtraction job id.

Responses

StatusDescriptionBody
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
operationId: extractionJobStatus portalSession

Parameters

NameInTypeDescription
job_id*pathstringExtraction job id.

Responses

StatusDescriptionBody
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
operationId: extractionFormats public rate: 60/min

Public.

Responses

StatusDescriptionBody
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
operationId: extractionExportCsv portalSession

Parameters

NameInTypeDescription
filenamequerystringFile name contains.
statusquerystringJob status.
confirmation_statusquerystringapproved | rejected | pending.
formatquerystringpdf, xlsx…
languagequerystringar | en.
date_fromquerystring (date)From.
date_toquerystring (date)To.

Responses

StatusDescriptionBody
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
operationId: extractionFilterOptions portalSession

Responses

StatusDescriptionBody
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
operationId: extractionHistory portalSession

Parameters

NameInTypeDescription
limitqueryintegerPage size.
offsetqueryintegerOffset.

Responses

StatusDescriptionBody
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
operationId: extractionSearch portalSession

Parameters

NameInTypeDescription
filenamequerystringFile name contains.
statusquerystringJob status.
confirmation_statusquerystringapproved | rejected | pending.
formatquerystringpdf, xlsx…
languagequerystringar | en.
date_fromquerystring (date)From.
date_toquerystring (date)To.
filing_idquerystringFiling.
sortquerystringSort column.
directionquerystring (asc, desc)Direction.

Responses

StatusDescriptionBody
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
operationId: extractionFilterStats portalSession

Responses

StatusDescriptionBody
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
operationId: extractionSuggestions portalSession

Parameters

NameInTypeDescription
queryquerystringPrefix.
typequerystringfilename (default).

Responses

StatusDescriptionBody
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
operationId: extractionSummaryStats portalSession

Responses

StatusDescriptionBody
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
operationId: confirmExtraction portalSession Idempotency-Key

Session + CSRF token.

Parameters

NameInTypeDescription
filing_id*pathstringDisclosure submission id.

Request body application/json — object

FieldTypeDescription
job_id* string
confirmation_status* string (approved, rejected)
notes string | null
figures object[]

Responses

StatusDescriptionBody
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
operationId: extractFromUpload portalSession rate: 20/min Idempotency-Key

Multipart upload (PDF, XLSX, XLS, CSV, DOCX; ≤ 100 MB). Session + CSRF token.

Parameters

NameInTypeDescription
filing_id*pathstringDisclosure submission id.

Request body multipart/form-data — object

FieldTypeDescription
file* string Statement file.
language string (ar, en)
confidence_threshold number

Responses

StatusDescriptionBody
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
operationId: extractionPreview portalSession

Parameters

NameInTypeDescription
filing_id*pathstringDisclosure submission id.

Responses

StatusDescriptionBody
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
operationId: extractionStatusForFiling portalSession

Parameters

NameInTypeDescription
filing_id*pathstringDisclosure submission id.

Responses

StatusDescriptionBody
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
operationId: filingExtractions portalSession

Parameters

NameInTypeDescription
filing_id*pathstringDisclosure submission id.

Responses

StatusDescriptionBody
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)
operationId: internalDocumentExtract sanctumToken Idempotency-Key

Internal FRA pipeline; Sanctum personal access token.

Parameters

NameInTypeDescription
id*pathintegerFRA document id.

Responses

StatusDescriptionBody
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
operationId: listFacts public rate: 60/min

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

NameInTypeDescription
conceptquerystringConcept QName(s), e.g. ifrs-full:Revenue.
companyquerystringFRA licence number(s) or LEI(s).
sectorquerystringSector code(s).
fiscal_yearquerystringFiscal year(s) of the filing.
periodquerystring (FY, Q1, Q2, Q3, Q4)Annual (FY) or quarter.
period_contextquerystring (current, prior)Current period or comparative.
statementquerystringStatement code(s), e.g. SFP, PL.
filingquerystringFiling reference number(s).
pagequeryintegerPage.
per_pagequeryintegerPage size.
If-None-MatchheaderstringETag of a previous response.

Responses

StatusDescriptionBody
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
operationId: listBulkFiles public rate: 60/min

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

StatusDescriptionBody
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
operationId: getPublicFilingValidation public rate: 60/min

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

NameInTypeDescription
submission*pathintegerFiling id (as in GET /xbrl/filings).

Responses

StatusDescriptionBody
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
operationId: searchPublicFilings public rate: 60/min

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

NameInTypeDescription
qquerystringWords and "quoted phrases".
companyquerystringFRA licence number(s) or LEI(s), comma separated, or part of the company name.
sectorquerystringSector code(s).
templatequerystringTemplate code(s).
fiscal_yearquerystringFiscal year(s).
periodquerystring (FY, Q1, Q2, Q3, Q4)Annual (FY) or quarter.
accepted_fromquerystring (date)Accepted on or after.
accepted_toquerystring (date)Accepted on or before.
kindquerystring (filing, note, figure)Only filings, notes/policies or statement figures.
localequerystring (ar, en)Language of the text (bilingual rows always match).
pagequeryintegerPage.
per_pagequeryintegerPage size.

Responses

StatusDescriptionBody
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)
operationId: checkXbrlPublic public rate: 5/min, 50/day Idempotency-Key

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

FieldTypeDescription
file* string The report or report package.

Responses

StatusDescriptionBody
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
operationId: listConcepts public rate: 60/min

Concepts with labels, data type and period type; search by `q`, restrict by namespace prefix.

Parameters

NameInTypeDescription
namespacequerystringNamespace prefix, e.g. ifrs-full.
qquerystringSearch text.

Responses

StatusDescriptionBody
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
operationId: getSectorBenchmarks public rate: 60/min

Average and median of each concept across the sector's latest accepted filings.

Parameters

NameInTypeDescription
sector_id*queryintegerSector id.

Responses

StatusDescriptionBody
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
operationId: listFilings fraOAuth: filing:statusmutualTLS rate: 60/min

Newest first, 20 per page. A sandbox client sees only its sandbox filings.

Parameters

NameInTypeDescription
statusquerystringFilter by status, e.g. draft, submitted, accepted.
periodquerystringSubstring of the period label, e.g. 2025.
pagequeryintegerPage number.

Responses

StatusDescriptionBody
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)
operationId: submitExtraction fraOAuth: filing:submitmutualTLS rate: 30/min Idempotency-Key

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

FieldTypeDescription
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

StatusDescriptionBody
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)
operationId: submitStructuredFiling fraOAuth: filing:submitmutualTLS rate: 30/min Idempotency-Key

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

FieldTypeDescription
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

StatusDescriptionBody
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)
operationId: submitXbrlFiling fraOAuth: filing:submitmutualTLS rate: 30/min Idempotency-Key

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

FieldTypeDescription
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

StatusDescriptionBody
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
operationId: getFilingFigures fraOAuth: filing:statusmutualTLS rate: 60/min

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

NameInTypeDescription
reference*pathstringFiling reference number, e.g. FRA-2025-E-00042.

Responses

StatusDescriptionBody
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)
operationId: getFilingStatus fraOAuth: filing:statusmutualTLS rate: 60/min

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

NameInTypeDescription
reference*pathstringFiling reference number, e.g. FRA-2025-E-00042.

Responses

StatusDescriptionBody
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
operationId: downloadFilingXbrl fraOAuth: filing:statusmutualTLS rate: 30/min

Only for accepted filings of the authenticated company.

Parameters

NameInTypeDescription
reference*pathstringFiling reference number, e.g. FRA-2025-E-00042.

Responses

StatusDescriptionBody
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
operationId: uploadAttachment fraOAuth: filing:submitmutualTLS rate: 20/min Idempotency-Key

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

NameInTypeDescription
reference*pathstringFiling reference number, e.g. FRA-2025-E-00042.

Request body application/json — AttachmentRequest

FieldTypeDescription
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

StatusDescriptionBody
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
operationId: health public rate: 60/min

Database reachability only; no internal state.

Responses

StatusDescriptionBody
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)
operationId: healthDetailed public

For load balancers and monitoring; not throttled.

Responses

StatusDescriptionBody
200 Status. object
503 Not healthy / not ready.
get/health/liveLiveness probe
operationId: healthLive public

For load balancers and monitoring; not throttled.

Responses

StatusDescriptionBody
200 Status. object
503 Not healthy / not ready.
get/health/metricsOperational metrics
operationId: healthMetrics portalSession

FRA administrators only (portal session).

Responses

StatusDescriptionBody
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
operationId: healthReady public

For load balancers and monitoring; not throttled.

Responses

StatusDescriptionBody
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
operationId: issueToken public rate: 10/min per IP

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

FieldTypeDescription
grant_type* string (client_credentials)
client_id* string
client_secret* string
scope string Space-separated subset of the client's scopes (optional).

Responses

StatusDescriptionBody
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)
operationId: openapiJson public rate: 60/min

Responses

StatusDescriptionBody
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)
operationId: openapiYaml public rate: 60/min

Responses

StatusDescriptionBody
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
operationId: statisticsBySector public rate: 60/min

Companies, filings and acceptance rate per sector (this year). Cached for one hour. Sandbox and test data are never counted.

Responses

StatusDescriptionBody
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
operationId: statisticsMonthlyTrend public rate: 60/min

Filings and acceptances per month. Cached for one hour. Sandbox and test data are never counted.

Parameters

NameInTypeDescription
monthsqueryintegerNumber of months.

Responses

StatusDescriptionBody
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
operationId: statisticsOverview public rate: 60/min

Companies, filings this year, acceptance rate. Cached for one hour. Sandbox and test data are never counted.

Responses

StatusDescriptionBody
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
operationId: statisticsTopCompanies public rate: 60/min

Public compliance ranking. Cached for one hour. Sandbox and test data are never counted.

Responses

StatusDescriptionBody
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
operationId: statisticsUpcomingDeadlines public rate: 60/min

Template deadlines in the coming weeks with filing counts so far. Cached for one hour. Sandbox and test data are never counted.

Responses

StatusDescriptionBody
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
operationId: listTaxonomies fraOAuth: taxonomy:readmutualTLS rate: 60/min

Responses

StatusDescriptionBody
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
operationId: getTaxonomiesForSector fraOAuth: taxonomy:readmutualTLS rate: 60/min

Parameters

NameInTypeDescription
sectorCode*pathstringSector code, e.g. INS, LEAS.

Responses

StatusDescriptionBody
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
operationId: getTaxonomy fraOAuth: taxonomy:readmutualTLS rate: 60/min

Parameters

NameInTypeDescription
taxonomy*pathintegerTaxonomy id.

Responses

StatusDescriptionBody
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
operationId: listTemplates fraOAuth: template:readmutualTLS rate: 60/min

Without fields; use /templates/{template} or /templates/sync for fields.

Parameters

NameInTypeDescription
sector_codequerystringTemplates applicable to this sector.
frequencyquerystringFiling frequency, e.g. annual, quarterly.

Responses

StatusDescriptionBody
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
operationId: getLabelMaps fraOAuth: template:readmutualTLS rate: 60/min

The label aliases the platform uses to map extracted line items to fields.

Responses

StatusDescriptionBody
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
operationId: getTemplateForSector fraOAuth: template:readmutualTLS rate: 60/min

The sector-specific template, falling back to the general one.

Parameters

NameInTypeDescription
sectorCode*pathstringSector code, e.g. INS, LEAS.

Responses

StatusDescriptionBody
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)
operationId: syncTemplates fraOAuth: template:readmutualTLS rate: 30/min

For IR systems that mirror the templates. `since` returns only templates updated after that time.

Parameters

NameInTypeDescription
sincequerystring (date-time)Only templates updated since.

Responses

StatusDescriptionBody
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
operationId: getTemplate fraOAuth: template:readmutualTLS rate: 60/min

404 when inactive.

Parameters

NameInTypeDescription
template*pathintegerTemplate id (from GET /templates).

Responses

StatusDescriptionBody
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
operationId: getTemplateEncrypted fraOAuth: template:readmutualTLS rate: 30/min

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

NameInTypeDescription
template*pathintegerTemplate id (from GET /templates).

Responses

StatusDescriptionBody
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
operationId: getTemplateFieldHints fraOAuth: template:readmutualTLS rate: 60/min

Per field: labels, type, section, label aliases, XBRL concept, required.

Parameters

NameInTypeDescription
template*pathintegerTemplate id (from GET /templates).

Responses

StatusDescriptionBody
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
operationId: getTemplateFields fraOAuth: template:readmutualTLS rate: 60/min

Ordered as on the form.

Parameters

NameInTypeDescription
template*pathintegerTemplate id (from GET /templates).

Responses

StatusDescriptionBody
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
operationId: getTemplateSchema fraOAuth: template:readmutualTLS rate: 60/min

The JSON form schema used by the portal wizard.

Parameters

NameInTypeDescription
template*pathintegerTemplate id (from GET /templates).

Responses

StatusDescriptionBody
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
operationId: getTemplateValidators fraOAuth: template:readmutualTLS rate: 60/min

Cross-check formulas applied by the FRA, with tolerance and severity.

Parameters

NameInTypeDescription
template*pathintegerTemplate id (from GET /templates).

Responses

StatusDescriptionBody
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)
operationId: xbrlTestFiling fraOAuth: filing:submitmutualTLS rate: 20/min Idempotency-Key

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

FieldTypeDescription
file* string The report or report package.
template_code string
fiscal_year integer

Responses

StatusDescriptionBody
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
operationId: listAgentCompanies fraOAuth: filing:statusmutualTLS

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

NameInTypeDescription
X-FRA-Agent-User-Token*headerstringPersonal API token of the agent staff member (issued in the agent workspace; expires).

Responses

StatusDescriptionBody
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
operationId: rotateAgentClientSecret fraOAuthmutualTLS rate: 5/min Idempotency-Key

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

NameInTypeDescription
X-FRA-Agent-User-Token*headerstringPersonal API token of the agent staff member (issued in the agent workspace; expires).

Responses

StatusDescriptionBody
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)
operationId: mcpRequest fraOAuth: mcp:readmutualTLS fraPersonalToken rate: 60/min per caller Idempotency-Key

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

NameInTypeDescription
Mcp-Session-IdheaderstringSession id returned by initialize.
MCP-Protocol-VersionheaderstringNegotiated protocol version (an unsupported value → 400 / -32005).

Request body application/json — object

FieldTypeDescription
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

StatusDescriptionBody
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.

FieldTypeDescription
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).

FieldTypeDescription
message* string
errors* object Field → messages.
OAuthError
FieldTypeDescription
error* string (invalid_client)
error_description string
TokenRequest
FieldTypeDescription
grant_type* string (client_credentials)
client_id* string
client_secret* string
scope string Space-separated subset of the client's scopes (optional).
TokenResponse
FieldTypeDescription
access_token* string Opaque token (80 characters).
token_type* string (Bearer)
expires_in* integer Seconds (3600).
scope* string Granted scopes, space-separated.
PublicKey
FieldTypeDescription
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.

FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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.

FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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).

FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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.

FieldTypeDescription
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.

FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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).

FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
attachment_id integer
filename string
file_size integer
status string = received
timestamp string (date-time)
DisclosureEnvelope
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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).

FieldTypeDescription
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
FieldTypeDescription
current_page integer
per_page integer
total integer
last_page integer
served_at string | null (date-time)
DeadlineList
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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).

FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
id integer
name string
name_ar string | null
namespace string
version string
type string
sector_codes array | null
TaxonomyConcept
FieldTypeDescription
id integer
qname string
label_en string | null
label_ar string | null
data_type string | null
period_type string | null
AccessRequest
FieldTypeDescription
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
FieldTypeDescription
request_id integer
status string = pending
message string
timestamp string | null (date-time)
AccessRequestStatus
FieldTypeDescription
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
FieldTypeDescription
total_tenants integer
active_tenants integer
total_submissions_ytd integer
acceptance_rate number
last_updated string | null (date-time)
StatsSector
FieldTypeDescription
sector_id integer
sector_name_ar string
sector_name_en string
tenant_count integer
submission_count_ytd integer
acceptance_rate number
StatsMonth
FieldTypeDescription
month string
submissions integer
accepted integer
rate number
StatsCompany
FieldTypeDescription
fra_license_number string
company_name_ar string
sector string | null
compliance_score number
submissions_count integer
Fact
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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
FieldTypeDescription
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).

FieldTypeDescription
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.