Requests and responses
Learn the asicapi request headers, JSON conventions for ASIC data, the extract reference on section reads, the meta billing object and the versioning policy.
asicapi returns the ASIC register as consistent JSON. Whether you purchase a company extract, read a director's history from it or look up a document, the same rules apply: camelCase property names, coded values that carry both the ASIC code and a plain-English label, ISO dates, money as decimal strings, an extract reference on every response that reads from a purchased extract, and a meta object that tells you whether the call incurred an ASIC statutory fee. Learning these conventions once means every endpoint behaves the way you expect.
Request headers
| Header | Direction | Purpose |
|---|---|---|
Authorization | Request | Bearer asicapi_live_... or Bearer asicapi_test_.... Required. See authentication |
Content-Type | Request | application/json on POST bodies |
X-Request-Id | Both | Your own trace id for the request. Echoed back verbatim on the response and recorded against the ASIC query. If you omit it asicapi generates one of the form req_01J... |
X-Client-Reference | Both | Up to 30 characters of your own reference (a matter number, customer id or job id). Echoed back and printed on your invoice next to each purchase and order |
Idempotency-Key | Request | A unique string (a UUID works well) on POST requests. Replays with the same key and body return the original response instead of buying a second extract or placing a second order. Keys are kept for 24 hours; the same key with a different body returns 409 idempotency_conflict |
RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, Retry-After | Response | See rate limits |
curl https://api.asicapi.dev/v1/companies/004085616/officeholders \
-H "Authorization: Bearer $ASICAPI_KEY" \
-H "X-Request-Id: 3f9c1c62-0e6d-4b3a-8f4e-2c1a9d7e5b10" \
-H "X-Client-Reference: MATTER-2026-0412"Responses are always Content-Type: application/json; charset=utf-8, including errors. The download endpoint for ready orders is the one exception and returns application/pdf.
JSON conventions
Property names and nulls
Property names are camelCase. Every documented field is present on every response; a value ASIC does not hold is null, never omitted. Empty collections are []. This lets you write company.deregistration?.date without also guarding against missing keys.
Object types
Every resource carries an "object" discriminator: company, extract, officeholder, address, shareClass, shareholding, charge, document, person, personMatch, companyMatch, registerEntry, weeklySummaryItem, order, offlineSearch, identifier, list.
Coded values
ASIC stores most attributes as short codes. asicapi returns each as an object with the ASIC code verbatim and a label from the matching code table.
"role": { "code": "DR", "label": "Director" },
"status": { "code": "C", "label": "Current" },
"type": { "code": "APTY", "label": "Australian Proprietary Company" }Store and compare on code. Display label. ASIC adds new codes to its tables without a specification change, and records converted from pre-1991 state systems sometimes carry codes that are not in the published tables at all. When asicapi does not recognise a code the label equals the code, so your UI always has something to show. Never treat an unknown code as an error, and never build an exhaustive switch that throws on an unexpected value.
The full code tables are available on the reference pages and through GET /v1/reference/code-tables/{tableId}.
Dates and timestamps
Dates are ISO 8601 YYYY-MM-DD. Timestamps are RFC 3339 in UTC, for example "2026-09-04T01:12:08Z". Where ASIC records a date as unknown (common on records taken over from state registries on 1 January 1991) the value is null. ASIC notes that the precise date may exist in paper or microfiche records it holds; the API cannot supply it.
Money
Monetary amounts are decimal strings in Australian dollars with two decimal places, for example "amountPaid": "1000.00". They are strings so that no precision is lost; parse them with a decimal library, not parseFloat.
Booleans
ASIC Y/N flags become JSON booleans: "beneficiallyOwned": true, "imaged": false.
Identifiers and formatting
| Identifier | Shape | Example | Notes |
|---|---|---|---|
| ACN, ARBN, ARSN | 9-digit string | "004085616" | A companion formatted field carries ASIC's display format "004 085 616". Path parameters accept either form; spaces are stripped |
| ABN | 11-digit string | "53004085616" | For companies the ABN embeds the ACN in its last nine digits |
| ASIC document number | 9-character string, first character numeric | "0E5123456" | Case-insensitive on input, returned uppercase |
| Charge number, ASIC identifier | Numeric string up to 9 digits | "1234567" | ASIC identifiers appear on people, name reservations and register entries |
| Person id | prs_ prefixed | "prs_8f3k2m9q" | Valid for 30 days after the search that produced it |
| Extract id | ext_ prefixed | "ext_01J9AB3K7Q2XM4" | Returned by every purchase; readable for 12 months |
| Order id, event id, request id | ord_, evt_, req_ prefixed | "ord_01J8ZK6M4R9S2T" | Opaque; do not parse |
Use GET /v1/identifiers/{value} to detect and validate any of the first two rows before purchasing an extract.
Names
Company and person names are returned exactly as ASIC stores them, in uppercase. Person names are structured:
{ "familyName": "SMITH", "givenNames": ["JANE", "LOUISE"], "formatted": "JANE LOUISE SMITH" }The same structure is used for office holders, members, register entries and people search. Organisations acting in a role (a corporate trustee, a chargee bank) use the party wrapper with "type": "organisation".
Extracts and section endpoints
GET /v1/companies/{id} returns a company's identity and status for free. Everything else about a company (office holders, addresses, share capital, members, external administration, charges, annual returns, financial reports, the embedded document list) is part of a company extract that you purchase once with POST /v1/companies/{id}/extracts. The 201 response is the whole extract, and the same data is then readable for free at GET /v1/extracts/{id} and through the section endpoints (/v1/companies/{id}/officeholders and so on), which serve one section of the most recent extract you hold with pagination on long lists. People, register entries and weekly summaries follow the same pattern. The full model is on free lookups, extracts and orders; the conventions that touch every response are below.
Current versus historical
Current versus historical extracts are chosen at purchase time with type on POST /v1/companies/{id}/extracts. A historical extract adds ceased office holders, former addresses, former share classes and members, satisfied charges, annual return history and financial report history; each ceased record carries "status": { "code": "E", "label": "Ceased" } and a ceasedAt or to date. There is no flag on a section endpoint that changes which extract ASIC produces. Section endpoints reject requests for ceased records (status=former, status=all, /charges, /annual-returns, /financial-reports) with 402 extract_required unless you hold a historical extract, and the error's details.purchase carries "body": { "type": "historical" } so you know what to buy.
The extract reference
Every response that reads from a purchased extract carries an extract object naming the purchase it came from. It appears on section lists and on single resources such as GET /v1/people/{personId}.
"extract": {
"id": "ext_01J9AB3K7Q2XM4",
"type": "current",
"purchasedAt": "2026-09-04T03:12:44Z",
"asOf": "2026-09-04T03:12:41Z"
}| Field | Type | Description |
|---|---|---|
id | string | The extract the data was read from. GET /v1/extracts/{id} returns it in full |
type | string | current, historical or relational for company extracts; current or historical for person and register extracts; current for weekly summaries |
purchasedAt | string | When the purchase was made |
asOf | string | ASIC's timestamp for the data. Records lodged after this moment are not in the extract; purchase again to see them |
The extract query parameter
By default a section endpoint reads from the most recent extract you hold that contains the requested section. Pass extract=ext_... to read from a specific purchase instead, for example to compare two snapshots or pin a report to the extract that was current when it was produced. The id must belong to your account and environment (403 extract_owner_mismatch otherwise), must be an extract of the right kind for the endpoint (400 extract_type_invalid), and must not have expired (410 extract_expired).
curl "https://api.asicapi.dev/v1/companies/004085616/officeholders?extract=ext_01J9AB3K7Q2XM4" \
-H "Authorization: Bearer $ASICAPI_KEY"The meta object
Every top-level response includes meta.
"meta": {
"billable": true,
"product": "company_extract_current",
"requestId": "req_01J8ZK4H2N8P5W"
}| Field | Type | Description |
|---|---|---|
billable | boolean | Whether this call incurred an ASIC statutory fee. true only on the 201 response to a purchase POST and the 202 response to an order POST with a live key. Always false on every GET, on error responses and on test keys |
product | string or null | Which product was consumed. null when billable is false |
requestId | string | The request id, identical to the X-Request-Id response header. Quote it when contacting support |
A section endpoint therefore always returns "meta": { "billable": false, "product": null, "requestId": "..." } alongside its extract reference. Products:
| Product | Charged by |
|---|---|
company_extract_current | POST /v1/companies/{id}/extracts with type: "current" |
company_extract_historical | POST /v1/companies/{id}/extracts with type: "historical" |
company_relationships | POST /v1/companies/{id}/extracts with type: "relational" |
person_extract | POST /v1/people/extracts, per person |
register_extract | POST /v1/registers/{register}/entries/{number}/extracts |
weekly_summary | POST /v1/weekly-summaries, per type per week, first purchase only |
document_image | Document image orders, per document |
charges_extract | Image based charges extract orders |
name_search | Offline name searches, and company or business name searches in state jurisdictions that charge for searching; free for jurisdiction ASIC |
Fees are the statutory amounts set under the Corporations Act 2001 and are itemised on your monthly invoice with the X-Client-Reference you supplied. State business name searches that attract a fee have that fee waived if you go on to buy the extract of a name from the results, matching ASIC's own rule; the search response includes a waiverToken that you pass in the body of the purchase.
Lists
Collections share one shape. See pagination for the cursor rules.
{
"object": "list",
"data": [],
"hasMore": false,
"nextCursor": null,
"totalCount": 0,
"meta": { "billable": false, "product": null, "requestId": "req_01J8ZKB1C6D0E4" }
}Errors
Errors use one envelope with an error object containing type, code, message, param, asicCode, requestId and docUrl. The errors reference lists every code.
Versioning
The version is in the path: /v1. Within a version asicapi only makes backwards-compatible changes:
- new response fields may appear at any time;
- new values may appear in coded fields, because ASIC adds codes to its tables without notice;
- new optional query parameters and new endpoints may be added;
- new event types may be added to webhooks.
Removing or renaming a field, changing a type, or changing the meaning of an existing value would only happen under a new path version, announced at least six months in advance. Write clients that ignore unknown fields and tolerate unknown codes and you will never need to change for a /v1 release.
Related
Free lookups, extracts and orders
How asicapi charges for ASIC data: free company and people lookups, purchased company and person extracts you read for free, and asynchronous document orders.
Pagination and result limits
How asicapi paginates ASIC search results and document lists with cursors, the 100-name cap on online company name searches, and document list date windows.