ACORD AL3 · IVANS downloads · REST API

AL3 files in. Clean JSON out.

Send the AL3 files your agencies download from IVANS and get back normalized policy data: insured, policy, vehicles, drivers, coverages and more. One HTTP call, no fixed-width parsing on your side, and nothing stored on ours.

$350 / month · 5,000 transactions included · free test keys

Request
$ curl https://al3.nativebase.ai/v1/parse \
    -H "Authorization: Bearer al3_live_••••" \
    -H "X-Agency-Id: 7d1e…c42a" \
    --data-binary @daily-download.al3
Response200 OK · 84 ms
{
  "transactions": [{
    "transaction": {
      "type": "PCH",
      "effectiveDate": "2026-11-01",
      "lineOfBusiness": "AUTOB",
      "carrier": { "naic": "12345" }
    },
    "insured": { "name": "Ridgeline Freight LLC" },
    "policy": {
      "number": "CA2049117",
      "expirationDate": "2027-11-01",
      "termPremium": 18420.00
    },
    "vehicles": [{ "vin": "1FUJHHDR8KLKK1234" }],
    "coverages": [{ "code": "BI", "limit": 1000000 }]
  }],
  "meta": { "warnings": [], "fieldCoverage": 0.97 }
}
<200 ms

typical response for a daily download

0

files or parsed results stored by default

100%

of groups returned, known or not. Nothing is dropped.

4.5 MB

per request, with gzip for larger loads

Why AL3 is hard

Carriers still send policy data as fixed-width text.

AL3 is the ACORD format behind IVANS downloads. It is compact, positional and unforgiving, and every carrier fills it a little differently. Reading it yourself means byte offsets, code tables and a lot of edge cases.

daily-download.al3simplified for illustration
1MHG148IVANS  A0010001 ????????
2TRG212PCH AUTOB 261101 12345 ??????
5BIS172RIDGELINE FREIGHT LLC?????????
5BPI298CA2049117 261101271101 0001842000
6CAR064BI  0100000000??????????
5BPI
Group codesEvery block starts with a 4-character code and a declared length. No labels, no delimiters.
????
Question-mark paddingMissing values are padded with ?. We return them as null, never as text.
261101
Compact datesUsually YYMMDD. We return ISO dates, or keep the raw value with a warning if a date does not parse.
0001842000
Implied decimalsAmounts carry no decimal point. 0001842000 becomes 18420.00.
How it works

Six steps, in memory, in milliseconds.

Every request runs the same pipeline. The file is parsed in memory and the result goes straight back to you.

01

Normalize

Line endings and wrapped lines are cleaned up, so files from any carrier read the same way.

02

Split into groups

We walk the file by group code and declared length, recording the byte offset of every group.

03

Build the tree

Messages and transactions are separated. Each transaction becomes one object in the response.

04

Extract fields

Versioned layouts define every field position and type, and code tables translate codes such as NBS, PCH, RWL, XLN and REI.

05

Map

Fields land in one normalized schema: the same JSON shape whatever the carrier.

06

Validate

Structure is checked, and anything unusual is reported in meta.warnings with its location in the file.

The output

One schema, every carrier.

Each transaction comes back in the same shape, with commercial auto fully mapped. The schema is published as JSON Schema at GET /v1/schema, so you can generate types and validate on your side.

.transaction

Type (new business, change, renewal, cancellation, reinstatement), effective and processing dates, line of business, carrier name and NAIC, agency codes.

.insured

Named insureds, mailing address and contact details.

.policy

Policy number, prior number, effective and expiration dates, term premium, billing type.

.vehicles[]

VIN, year, make, model, garaging address and vehicle-level coverages.

.drivers[]

The drivers listed on the policy.

.coverages[]

Code, description, limits, deductibles and premium, each marked policy or vehicle level.

.additionalInterests[]

Loss payees, lienholders and others: type, name, address.

.forms[]

Forms and endorsements attached to the policy.

meta

Parser and layout versions, unmapped groups, warnings, and field coverage: the share of the file that was mapped.

raw.groups[]

With include=raw: every group's code, byte offset, length and raw text, for debugging against the source file.

Security and data handling

Policyholder data, handled like it.

AL3 files carry names, addresses and driver details. The API is built so that data passes through and does not pile up.

Nothing stored by default

Files are parsed in memory and the result is returned to you. We keep neither the file nor the JSON.

Optional retention, encrypted

If you want files kept for debugging, we turn it on for your account: encrypted at rest and purged automatically after 30 days.

No policy data in logs

Logs and usage records hold request IDs, sizes, counts and timings. Never AL3 content, names, addresses or keys.

Keys stored as hashes

API keys are hashed with a server-side secret. A leaked database does not leak working keys.

TLS everywhere

HTTPS only, with HSTS. Connections to our database are encrypted and verified too.

Least privilege

Every request is checked for a valid key, the right scope and an agency that belongs to you.

Pricing

One plan. Simple to forecast.

A flat monthly price that covers 5,000 transactions. A transaction is one policy transaction inside an AL3 file: a new business, change, renewal or cancellation. Validation-only calls and test keys do not count.

Processing more than 5,000 transactions a month, or onboarding a large book at once? Talk to us about volume pricing.

AL3 to JSON APIBilled monthly
$350/ month

Up to 5,000 transactions per month

  • Every endpoint: parse, validate, schema and usage
  • Full commercial auto mapping, plus raw groups on demand
  • Usage broken down per agency, for your own billing
  • Free al3_test_ keys to build against (never billed)
  • Key scopes, rotation and expiry
  • Layout fixes when a carrier sends something new
Get API access →

Start with free test keys

FAQ

Questions, answered.

How does it fit with IVANS?

It works alongside the IVANS downloads your agencies already receive. Send each AL3 file to the API and get normalized JSON back. No new connections or credentials to set up.

What counts as a transaction?

One policy transaction inside an AL3 file, such as a new business, policy change, renewal, cancellation or reinstatement. A file with 40 transactions counts as 40. The plan includes 5,000 a month. Calls to /v1/validate and requests made with test keys are not counted.

Which lines of business are supported?

Commercial auto is fully mapped into the normalized schema. For every other line, each group is returned with its raw text and byte offset, so you get the complete file from day one. Full mappings for more lines are added as layout files, with no change to the API.

What happens when a carrier sends something unusual?

The parser never guesses and never drops data. Unknown groups and codes come back raw, with a warning in meta that says where in the file they were. Field layouts are data files, so a new carrier variation is handled by adding a layout, not by rewriting code.

Do you keep our files?

Not by default. Files are parsed in memory and nothing is stored. If you want files kept for debugging, we can turn on encrypted retention for your account, with automatic deletion after 30 days.

Is the output stable?

Yes. Parsing is deterministic: the same file always produces the same JSON. Every response includes the parser and layout versions that produced it.

How big can a file be?

Up to 4.5 MB per request. Daily downloads are usually a few kilobytes. For large initial loads, send the file gzip-compressed.

Stop parsing AL3. Start using it.

Tell us about your agencies and carriers, and start building with free test keys.

Get API access →Explore the docs