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
$ curl https://al3.nativebase.ai/v1/parse \
-H "Authorization: Bearer al3_live_••••" \
-H "X-Agency-Id: 7d1e…c42a" \
--data-binary @daily-download.al3{
"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 }
}typical response for a daily download
files or parsed results stored by default
of groups returned, known or not. Nothing is dropped.
per request, with gzip for larger loads
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.
1MHG148IVANS A0010001 ????????
2TRG212PCH AUTOB 261101 12345 ??????
5BIS172RIDGELINE FREIGHT LLC?????????
5BPI298CA2049117 261101271101 0001842000
6CAR064BI 0100000000??????????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.
Normalize
Line endings and wrapped lines are cleaned up, so files from any carrier read the same way.
Split into groups
We walk the file by group code and declared length, recording the byte offset of every group.
Build the tree
Messages and transactions are separated. Each transaction becomes one object in the response.
Extract fields
Versioned layouts define every field position and type, and code tables translate codes such as NBS, PCH, RWL, XLN and REI.
Map
Fields land in one normalized schema: the same JSON shape whatever the carrier.
Validate
Structure is checked, and anything unusual is reported in meta.warnings with its location in the file.
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.
Clean REST. Production-ready from day one.
Versioned endpoints under /v1, scoped API keys, per-agency usage and one consistent error shape. Integrate in an afternoon.
Convert an AL3 file into normalized JSON.
Check a file’s structure and get warnings, without the JSON output.
The JSON Schema of the output.
Usage for a date range, broken down by agency.
The OpenAPI 3.1 spec for every endpoint.
Liveness and database connectivity.
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.
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.
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
Start with free test keys
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.