Compliance Reports API
One API produces a formatted, regulator-appropriate artifact from the governance data AxonFlow already holds. You choose a regulator, a framework and a reporting period; AxonFlow renders a real PDF, CSV, XLSX, JSON or JSONL file, stores it, and hands you a time-limited download link.
Before this API, every "export" on the platform was raw JSON. This one produces the document you attach to a submission.
This page is the API reference. If you want to select a jurisdiction, read your live posture, and generate a report from the Customer Portal UI, see Compliance Reports (Customer Portal).
Report generation requires an Evaluation or Enterprise licence. On the Community edition the routes are not registered. See Community vs Enterprise.
Quickstart
Three calls: create, poll, download.
# 1. Create. Returns 202 immediately with a job id.
curl -sS -X POST "$AXONFLOW_URL/api/v1/compliance/reports" \
-H "Content-Type: application/json" \
-d '{
"regulator": "euaiact",
"framework": "EU_AI_ACT",
"format": "pdf",
"period_start": "2026-04-01T00:00:00Z",
"period_end": "2026-06-30T23:59:59Z"
}'
# {"id":"creport-9f3c...","status":"pending","report_state":"","progress":0, ...}
# 2. Poll until status is `completed` or `failed`.
curl -sS "$AXONFLOW_URL/api/v1/compliance/reports/creport-9f3c..."
# {"id":"creport-9f3c...","status":"completed","report_state":"populated",
# "progress":100,"record_count":184,"checksum":"3b1f...","size_bytes":58213, ...}
# 3. Download. Responds 307 to a presigned URL valid for one hour.
curl -sSL -o eu-ai-act-q2.pdf \
"$AXONFLOW_URL/api/v1/compliance/reports/creport-9f3c.../download"
Requests are scoped by the X-Org-ID and X-Tenant-ID headers, which the
AxonFlow Agent gateway and the customer portal proxy set from your validated
credential. You never send them by hand from an application.
The three endpoints
| Method | Path | Success | Purpose |
|---|---|---|---|
POST | /api/v1/compliance/reports | 202 Accepted | Create a report job |
GET | /api/v1/compliance/reports/{id} | 200 OK | Poll job status |
GET | /api/v1/compliance/reports/{id}/download | 307 Temporary Redirect | Presigned artifact URL (1 hour) |
Generation is asynchronous because a multi-year OJK report over a busy tenant is not a request-timeout-sized amount of work. The create call returns as soon as the job is durably recorded.
Statuses
status | Meaning |
|---|---|
pending | Recorded, not started |
processing | Collecting data and rendering |
completed | Artifact stored and checksummed - downloadable |
failed | Terminal failure; error names the cause |
A job reaches completed only when a checksummed artifact is durably
stored. If no artifact storage backend is configured, the job fails with an
error naming the missing configuration rather than reporting success you cannot
download.
report_state: the three-state answer
Every create and poll response carries an explicit report_state. It exists
because an empty report is ambiguous, and the two readings need different
responses from you:
report_state | Meaning | What to do |
|---|---|---|
not_available | The regulator's module is not enabled in this deployment | Enable the module, or pick a different regulator |
enabled_empty | The module is enabled and the period genuinely contains no governed activity | Nothing - this is a valid "no activity in range" attestation |
populated | The module is enabled and returned data | Nothing |
| (empty string) | Not determined yet | The job is still pending or processing. Poll again. |
The field is always present on every create and poll response, including while it is the empty string. You never have to tell "absent" from "null" to work out what happened.
not_available is also returned synchronously: creating a report for a
regulator whose module is not enabled is refused with 409 Conflict and
{"error_code":"REGULATOR_NOT_AVAILABLE","report_state":"not_available"}
rather than producing a job that can never succeed.
Regulators, frameworks and formats
Availability: the three US regulators (
usinsurance,usbanking,ussecurities) ship in platform v10.1.0. A deployment on v10.0.0 or earlier refuses all three with400 UNKNOWN_REGULATOR.
| Regulator | regulator | framework | Formats | Retention shown on the artifact |
|---|---|---|---|---|
| EU AI Act | euaiact | EU_AI_ACT | pdf, csv, json | Logs at least 6 months (Art. 12/19); technical documentation 10 years (Art. 18) |
| SEBI (India) | sebi | SEBI_AI_ML | pdf, csv, xlsx, json | 5 years |
| RBI FREE-AI (India) | rbi | RBI_FREE_AI | pdf, csv, xlsx, json | Per the FREE-AI framework and the board-approved policy |
| MAS FEAT (Singapore) | masfeat | MAS_FEAT | pdf, csv, json | 7 years |
| OJK / BI / UU PDP (Indonesia) | ojk | OJK_AI_GOVERNANCE, UU_PDP, BI_PJP, OJK_BI_COMBINED | pdf, csv, json | 5 years |
| NAIC AI Systems Evaluation Tool (US insurance) | usinsurance | NAIC_AIS, NYDFS_CL7, CO_REG_10_1_1 | pdf, csv, xlsx, json | The NAIC exhibits are an examination information request and set no retention period of their own. For the documentation NYDFS Circular Letter No. 7 describes, CL7 cross-references 11 NYCRR 243, New York's insurance records-retention regulation. This line states the REQUIREMENT, not this deployment's configured period. |
| US Banking Supervision (Federal and Farm Credit) | usbanking | US_MRM, US_TPRM, GLBA_SAFEGUARDS, BSA_AML, FCA_EM31 | pdf, csv, json | Set by the instrument in scope, not by this document: BSA suspicious-activity-report support for 5 years (31 CFR 1020.320(d)); GLBA information-security records under the interagency Guidelines Establishing Information Security Standards (12 CFR 30 App. B, 208 App. D-2, 364 App. B) for institutions the federal banking agencies supervise, with their annual written board report; ECOA / Reg B adverse-action records for 25 months where AI touches consumer credit (12 CFR 1002.12(b)). Farm Credit institutions retain on the schedule the FCA sets. This line states the REQUIREMENT, not this deployment's configured period. |
| US Securities Examination (SEC advisers and FINRA broker-dealers) | ussecurities | SEC_EXAM, FINRA_SUPERVISION, REG_SP | pdf, csv, json, jsonl | Set by the registration in scope, not by this document: an investment adviser under Advisers Act rule 204-2, generally 5 years from the end of the fiscal year of the last entry with the first 2 years in an appropriate office; a broker-dealer under Exchange Act rules 17a-3 and 17a-4, generally 3 to 6 years by record type, preserved either on write-once read-many (WORM) media or under the audit-trail alternative the 2022 amendments to rule 17a-4 added. AxonFlow provides no archival storage under either option; the artifact is an export for the firm's own recordkeeping system. This line states the REQUIREMENT, not this deployment's configured period. |
framework may be omitted for the four regulators that define exactly one. It
is required for ojk, usinsurance, usbanking and ussecurities - each
reports against several instruments (three Indonesian, three US insurance, five
US banking, three US securities), and selecting one for you would file the
report under the wrong law.
The usbanking framework also selects the report PROFILE
usbanking renders the same evidence in two supervisory vocabularies, and the
one you get is decided by the framework you ask for. There is no separate
profile field, so a request cannot contradict itself:
framework | Profile | What changes |
|---|---|---|
FCA_EM31 | Farm Credit | Human-oversight register in FCA Exam Manual EM-31.1's when/what/who/approver change-log form; quarterly board pack; the incident clock stated by reference to 12 CFR Part 609 and current FCA examination guidance |
US_MRM, US_TPRM, GLBA_SAFEGUARDS, BSA_AML | Federal | SR 26-2 / OCC Bulletin 2026-13 cited as current with SR 11-7 named as predecessor, including that the revised guidance excludes generative and agentic AI from its formal model definition while the underlying risk principles still apply; annual board pack |
GET /api/v1/usbanking/exam-readiness publishes this mapping, so a client
never has to keep its own copy.
What a usbanking report covers, and what it does not
The package is scoped to the requesting tenancy. An AxonFlow package scoped to the organization - the US insurance package is one - describes a different population over the same period on a multi-tenancy licence, rather than a larger or smaller one. The two measure different populations rather than disagreeing, and the artifact says so on its face. Its sources are platform
tables rather than a module's own, and audit_logs.org_id is nullable, so an
organization-wide report would silently omit records. The completeness section
states how many records in the period carry no organization attribution, which
is exactly the population an organization-wide report would have dropped. On a
single-tenancy organization the two are the same set of records.
Every usbanking artifact carries these disclosures, and they are worth
reading before the package reaches an examiner:
- Coverage. It reports activity that routed through AxonFlow's governed paths. It is not a discovery of AI systems elsewhere in the institution.
- Containment. AxonFlow does not automatically evaluate kill-switch thresholds, so any configured kill switch is triggered manually. The containment it evidences is policy denial and approval holding.
- Fairness testing. AxonFlow performs no statistical fairness, bias or disparate-impact testing. Where an instrument expects it, that remains the institution's own work.
- Legal determinations. Nothing classifies a system's risk tier, analyses any law's applicability, or asserts compliance with any instrument.
- Model validation. The package is evidence from the governance layer. It is not a model validation report and does not constitute effective challenge.
The cross-index appendix maps each section to the NIST AI RMF functions (Govern, Map, Measure, Manage). It does not reproduce the Treasury / Cyber Risk Institute FS AI RMF control-objective identifiers.
The ussecurities framework also selects the supervised population
ussecurities covers SEC-registered investment advisers and FINRA member
broker-dealers as one regulator, because the evidence set is identical and only
the instrument each clause is cited against differs. The supervised population
is derived from the framework you ask for, never requested: a separate
population field would make a request whose two halves contradict each other
expressible, so the contradiction is made unrepresentable instead of validated.
framework | Population | Vocabulary the artifact is cited against |
|---|---|---|
SEC_EXAM | SEC-registered investment adviser | Advisers Act rule 204-2 (books and records), rule 206(4)-1 (Marketing) and rule 206(4)-7 (Compliance), read against the SEC Division of Examinations FY2026 priorities |
FINRA_SUPERVISION | FINRA member broker-dealer | FINRA Rule 3110 (Supervision) with Regulatory Notice 24-09 and the 2026 Regulatory Oversight Report, and Exchange Act rules 17a-3 and 17a-4 for records |
REG_SP | Both populations | The amended Regulation S-P (17 CFR part 248) incident-response and service-provider oversight obligations, which reach advisers and broker-dealers alike |
GET /api/v1/ussecurities/exam-readiness publishes this mapping, so a client
never has to keep its own copy. Like the usbanking readiness route, it is
GET-only, scoped from the auth-stamped headers, gated on tenant-wide read
authority like the exports, and publishes counts, presence and disclosures
only - never evidence rows, which come from the report facade and only from
there.
The ussecurities package renders eight sections in the order the published
SEC/FINRA AI sweep letters ask for them (see the sections table below). Its
interaction archive carries the Ed25519 attribution chain in band in the
json and jsonl renderings: each archived interaction carries its per-record
signature, chain linkage and signing key id, so the export is independently
verifiable record by record. The pdf and csv renderings carry the
chain-head summary instead, and say so, naming the renderings that carry the
full proof. Three attribution states are kept apart on the artifact: an
interaction with no attribution record, one that is hash-chained but unsigned,
and one that is signed.
Two citation disciplines the package holds everywhere, worth knowing before the artifact reaches an examiner:
- Preservation is cited against the population's own rule. A broker-dealer preserves under Exchange Act rule 17a-4, satisfied on write-once read-many (WORM) media or under the audit-trail alternative the 2022 amendments to that rule added - the artifact never names WORM without the alternative beside it. An investment adviser preserves under Advisers Act rule 204-2, never 17a-4. AxonFlow provides neither form of preservation: the package is an export, and producing it preserves nothing.
- SAR confidentiality is cited to the statute. 31 U.S.C. 5318(g)(2) is the Bank Secrecy Act's own confidentiality bar and binds every filer; for a broker-dealer it is implemented by FinCEN at 31 CFR 1023.320(e). No FinCEN part number is cited on the adviser side, deliberately.
jsonl: offered to ussecurities alone
jsonl is line-delimited JSON: one self-describing record per line, no
enclosing array. It exists for one reason. A broker-dealer preserves records
under Exchange Act rule 17a-4 on write-once read-many media or under the
audit-trail alternative the 2022 amendments added, and the systems that ingest
into either are line-oriented: they take a stream of records and commit each
one, where a single JSON document has to be parsed whole first. Every line
carries its schema, record type and job id, and every row record additionally
carries the section key and the column headers its values are positional
against, because line-oriented ingestion routinely splits a stream across
batches.
It is offered to no other regulator, on the format matrix's own rule: a format is offered where the regulator's own practice wants it, not wherever it can be produced.
XLSX is offered only where the regulator's own submission practice is
spreadsheet-shaped. Requesting a format a regulator does not offer is a
400 with UNSUPPORTED_FORMAT and the supported list in the message.
What each report contains
| Regulator | Sections |
|---|---|
| EU AI Act | Conformity assessments (Art. 43), Article 43 summary, risk management (Arts. 9-17), accuracy and bias monitoring (Art. 15), human oversight (Art. 14), audit trail (Art. 12) |
| SEBI | Readiness checks, policy violations, LLM activity, decision-chain lineage, human oversight, PII redactions, retention posture |
| RBI FREE-AI | Board reports, AI incidents, kill switches, kill-switch activation history, model validations, AI system registry |
| MAS FEAT | FEAT assessments, four-pillar summary, AI system registry, kill-switch history |
| OJK / BI / UU PDP | AI governance summary, policy violations, LLM and decision activity, human oversight, PII redactions, cross-border transfers (UU PDP Pasal 56), 72-hour breach log (Art. 46), BI PJP, retention posture |
| US Banking Supervision | Scope, completeness and disclosures; AI and agent inventory; per-decision reconstruction; human oversight register; kill-switch and containment attestation; data-boundary report; third-party AI annex; monitoring summary; board pack; NIST AI RMF cross-index |
| US Securities Examination | Eight sections in the order the published SEC/FINRA AI sweep letters ask for them: AI-use inventory and observed responsible persons; interaction archive (prompts, outputs and agent actions, with the attribution chain in band on json/jsonl); consequential-output log (policy-flagged, with human disposition); supervision evidence in the population's own vocabulary; Regulation S-P annex (incident response and service-provider oversight); disclosure-vs-reality reconciliation (declared beside observed); financial-crime evidence (Fraud and Risk Add-on); scope, completeness and instruments |
| NAIC / NYDFS / Colorado (US insurance) | Exhibit A "Quantify Regulated Entity's Use of AI Systems", Exhibit B "AI Systems Governance Risk Assessment Framework" (the form offers a narrative and a checklist variant), Exhibit C "High Risk AI Systems Details" with exceptions and overrides, Exhibit D "AI Systems Model Data Details", a fairness-testing pointer section, the NYDFS CL7 annex, the Colorado 10-1-1 annex, scope, completeness and form version |
Sections are always emitted, even when empty, carrying a sentence saying so. A dropped section would make "we recorded no HITL oversight" indistinguishable from "this report does not cover HITL oversight", which on a regulatory artifact is a different claim.
The NAIC instrument this report renders is formally titled "Artificial Intelligence Systems Evaluation: Optional Supplemental Exhibits for State Regulators" and is known as the NAIC AI Systems Evaluation Tool. It comes from the NAIC Big Data and Artificial Intelligence (H) Working Group, and it is an examination information request that supplements existing market conduct, financial analysis and financial examination review procedures. It is not an annual-statement filing, so nothing here is something you submit on a statutory schedule.
The usinsurance report renders that exhibit structure over the governance data
AxonFlow holds. It is source evidence for your response to a regulator's
information request, never a claim of compliance with any instrument it names,
and several of the exhibits' fields are the carrier's own work rather than
AxonFlow's:
- The fairness section is a pointer, never a result. It names the instrument and records what AxonFlow holds that supports it. AxonFlow performs no statistical fairness or bias testing; the NYDFS CL7 three-step quantitative analysis remains the insurer's own actuarial and data-science work, and the section says so on the artifact.
- AxonFlow does not classify a system as high risk. That is the carrier's determination; Exhibit C, "High Risk AI Systems Details", renders the classification you supply.
- No shadow-AI discovery. Only traffic routed through the AxonFlow gateway is visible, so Exhibit A quantifies governed usage and says so.
- No line-of-business mapping and no ECDIS register. AxonFlow holds neither.
- No share-of-adverse-decisions figure. AxonFlow does not compute it.
- No model validation and no legal determinations.
The Tool is at version 4.0 and every page of it is marked DRAFT, with a multi-state pilot running. The artifact names the form revision it renders against; the adopted form may differ from it.
Access control
Two different authorities, deliberately:
| Action | Required |
|---|---|
| Poll report status | audit:read - any caller who may read the audit trail |
| Create a report | Administrator (owner, admin or policy admin) |
| Download an artifact | Administrator |
Generating and downloading produce a whole-tenant compliance artifact, so they
sit in the same authority class as
evidence export. Polling returns job metadata
only - id, status, progress, report_state, checksum - and no audit content, so
a compliance viewer can watch a report they requested reach completion.
Every by-id path is scoped to the caller's own organization and tenant. A
report id belonging to another tenancy returns 404, byte-identical to an
unknown id, so the endpoint cannot be used to discover which report ids exist.
Errors
| HTTP | error_code | Cause |
|---|---|---|
400 | UNKNOWN_REGULATOR | regulator is not one of the eight above |
400 | UNKNOWN_FRAMEWORK | Framework missing for ojk, usinsurance, usbanking or ussecurities, or not defined for the regulator |
400 | UNSUPPORTED_FORMAT | Format unknown, or not offered for that regulator |
400 | INVALID_PERIOD | Missing, inverted, zero-length, or longer than 1096 days |
400 | INVALID_BODY | Malformed JSON, or an unrecognised field |
401 | SCOPE_REQUIRED | No X-Org-ID / X-Tenant-ID - the request did not traverse an authenticating hop |
403 | COMPLIANCE_REPORT_REQUIRES_EVALUATION_LICENSE | Community tier |
404 | REPORT_NOT_FOUND | No such report in your tenancy |
409 | REGULATOR_NOT_AVAILABLE | That regulator's module is not enabled here |
409 | REPORT_NOT_COMPLETED | Download requested before the job finished; the message carries the failure cause when it failed |
409 | REPORT_ARTIFACT_UNAVAILABLE | The job completed but its stored artifact is no longer retrievable |
429 | COMPLIANCE_REPORT_LIMIT_EXCEEDED | Daily report budget for your tier |
503 | INTERNAL_ERROR | The service has no database connection |
Reports share the daily budget of the evidence-export tier: 3 per day on Evaluation, unlimited on Enterprise. A refused request - a malformed body, a tier refusal, an unavailable regulator - does not consume a slot.
Artifacts
Artifacts are stored in the object-storage backend the orchestrator is
configured with (AUDIT_EXPORT_STORAGE_TYPE and its bucket/credential
variables) under compliance-reports/{org}/{regulator}/{report-id}.{ext}. The
download endpoint mints a presigned URL valid for one hour; the orchestrator
never streams the bytes itself.
Each job records the SHA-256 of the artifact. Rendering is deterministic: the same job rendered twice produces byte-identical output, including the PDF's creation date, which is taken from the job record rather than the render clock. That is what makes the stored checksum a durable integrity claim rather than a one-time snapshot.
Known limitations
- PDF glyph coverage. PDFs use the standard 14 core fonts so nothing is
embedded and an air-gapped build produces the same bytes as any other. Those
fonts are cp1252-encoded, so a character outside that set - Devanagari, Han,
an emoji - renders as
?. Requestjsonorcsvwhen the data contains them; both carry full Unicode. - Row cap. Any single section is capped at 5,000 rows. When a section is truncated it says so, with the number of rows not shown. Narrow the reporting period for the full set.
- BI PJP. Selecting
BI_PJPorOJK_BI_COMBINEDscopes the export, but the Bank Indonesia framework contributes no payment-service-specific data class of its own yet. The report says so in that section rather than showing it empty. - Legacy per-module exports. The older per-regulator export endpoints remain
available and unchanged, with two corrections: SEBI's CSV export now returns
real CSV, and its XML format returns
501 Not Implementedinstead of JSON under an XML content type. RBI's PDF and XLSX exports are now real PDF and real XLSX. New integrations should use this API.
Related
- Compliance Reports (Customer Portal) - the same capability from the portal UI, for a compliance officer who is not calling the API directly
- Evidence export - the audit-bundle export this API shares an authority class and daily budget with
- Enterprise Compliance API Surface - the per-regulator endpoints this facade sits in front of
