API

POST an air waybill. Get one clean record back.

Send air waybills straight from your TMS/WMS — no portal, no manual upload. AWBGuru queues the file, runs the OCR / extract / validate pipeline, and hands back a clean, structured record over a REST API.

A single record backs every output format, and per-field confidence plus validation findings ride along on the status response — so your integration can auto-clear a clean record and route the exceptions to a person.

30 free scans to start · no card required · US-based service

Submit a document

POST a file. Get a document id back.

Send the air waybill from your TMS/WMS with a single request. AWBGuru accepts it, returns 202 with one entry per document, and starts the pipeline — your systems never touch a UI.

POST/api/v1/documentsmultipart file upload · returns a document id you poll or receive by webhook
POST /api/v1/documents · request + responseAccepted
# request — multipart, one air waybill file
POST /api/v1/documents
Authorization: Bearer awbg_3aP9x7t…
Content-Type: multipart/form-data

file: mawb_020.pdf

# response
202 Accepted
{
  "documents": [
    {
      "id": "a1f3c8e2-9b04-4d17-8e5a-1c2d3e4f5a6b",
      "fileName": "mawb_020.pdf",
      "status": "processing",
      "reason": null
    }
  ]
}

The response returns immediately with one entry per document — a multi-page PDF splits into one document per page. Extraction runs asynchronously, so your caller isn't blocked while the pipeline works.

Authentication

Bearer-authenticated with your own keys.

Every request carries an Authorization: Bearer header with an Owner-issued key. Keys are prefixed awbg_… so they're easy to spot in logs and rotate independently of a user login.

Owner-issued keys

An account Owner generates and revokes awbg_… keys from the dashboard. Scope one per integration so you can rotate a single system without disturbing the rest.

Bearer on every call

Attach the key as a Bearer token on both submit and retrieve. No key, no queue — an unauthenticated request never reaches the pipeline.

Retrieve the result

Poll for the finished record.

Poll GET /api/v1/documents/{id} about every 5 seconds until status is no longer processing. A document typically extracts in 10–40s; the response carries the structured record — every field with its per-field confidence, plus a findings array of any validation hits.

GET/api/v1/documents/{id}poll ~every 5s · typically ready in 10–40s
GET /api/v1/documents/a1f3c8e2-… · response (abridged)status: pass
{
  "id": "a1f3c8e2-9b04-4d17-8e5a-1c2d3e4f5a6b",
  "fileName": "mawb_020.pdf",
  "status": "pass",          // processing | pass | review | reject | skipped | error
  "docType": "MAWB", "reviewStatus": "Approved",
  "fields": {
    "AWB2":          { "value": "999-12345675", "confidence": 0.999 },
    "Departure":     { "value": "SEOUL",        "confidence": 0.994 },
    "To":            { "value": "FRA",          "confidence": 0.991 },
    "Pcs":           { "value": "4",            "confidence": 0.98 },
    "Weight":        { "value": "618.0K",       "confidence": 0.97 },
    "Charge_Weight": { "value": "760.0",        "confidence": 0.96 }
  },
  "findings": []          // empty when every check passes
}

Every field comes back with its confidence, so your integration can gate directly — auto-clear a status: "pass" record, or route a review/reject to a person. When a check fails, findings lists each hit with a code, severity, message, and the affected fields. Payload abridged.

The findings codes — E-MOD7 (check digit), W-RTE (routing), W-CONF (low confidence) — are explained on the validation page.

Webhooks

Or skip polling entirely.

Register a webhook and AWBGuru posts to your endpoint the moment a document is ready — the same structured record you'd have polled for, pushed to you instead. Poll when it's simpler to; subscribe a webhook when you'd rather not.

POSTyour endpointfired once per document, the moment it finishes the pipeline
webhook delivery · document.processedDelivered
{
  "event": "document.processed",
  "occurredAt": "2026-08-27T09:41:12Z",
  "documentId": "a1f3c8e2-9b04-4d17-8e5a-1c2d3e4f5a6b",
  "fileName": "mawb_020.pdf",
  "awb": "999-12345675",
  "outcome": "Pass"  // fetch the full record from GET /api/v1/documents/{documentId}
}

Each delivery is HMAC-signed. A webhook is an alternative to polling, not a replacement for the record — the notification tells you the id is ready; fetch the full document from the retrieve endpoint. Subscribe document.processed, document.exception, and document.exported independently.

Output formats

One clean record. Every format reads from it.

Extraction lands in a single clean record — parties, routing, weights, charges, line items. JSON, XML, EDI, and spreadsheets are all built from that same record, so they can't disagree with each other.

JSON & XML

The extracted record, downloaded from the file endpoint — GET …/{id}/file.json or file.xml. Per-field confidence and findings come back on the status response.

EDI · FWB/16 + FWB/17

A Cargo-IMP air waybill message generated straight from the record. AWBGuru generates and returns the FWB message; you transmit it through your own rails. We hold no airline credentials.

CSV & XLSX

One row per line item, dropping straight into the workbook your team already runs — same figures as the JSON, built from the same record.

Built from one record

Because every format reads from the same extracted record, the JSON, the EDI message, and the spreadsheet can't drift apart.

Cargo-IMP air waybill message · FWB/17 (excerpt)Generated
FWB/17
999-12345675ICNFRA/T4K618.0
FLT/MZ713/04
RTG/FRAMZ
SHP
/NORTHWIND TRADERS CO LTD
/1 SAMPLE-RO/SEOUL/KR
CNE
/CONTOSO FREIGHT GMBH
/HAFENSTRASSE 8/FRANKFURT/DE
…

FWB v16 and v17 supported today. AWBGuru generates and returns the message — you transmit it through your own rails. We hold no airline credentials.

Today
JSONXMLFWB/16FWB/17CSVXLSX
How it flows

Submit, poll or subscribe, read.

Four steps from a file in your TMS to a validated record in your systems.

01

Submit

POST /api/v1/documents with the file. You get 202 and a document id back.

02

Wait

The pipeline extracts and validates — typically 10–40s per document, asynchronously.

03

Poll or subscribe

Poll GET …/{id} ~every 5s, or let a webhook tell you the moment it's ready.

04

Read

Pull the record in JSON, XML, EDI, CSV, or XLSX — with confidence and validation attached.

FAQ

The API, answered.

How do I authenticate?

Attach an Owner-issued awbg_… key as a Bearer token on every request. Keys are generated and revoked from the dashboard, so you can scope one per integration and rotate it on its own.

Poll or webhook — which should I use?

Either. Poll GET /api/v1/documents/{id} about every 5 seconds if that's simpler for your integration; register a webhook if you'd rather be pushed a notification the moment a document is ready. The webhook tells you the id is ready — you still fetch the full record from the retrieve endpoint.

How long does a document take?

A document typically extracts in 10–40 seconds. Submission returns immediately with a queued job, so your caller isn't blocked while the pipeline runs.

Can AWBGuru transmit the FWB message to a carrier?

No. AWBGuru generates and returns the FWB/16 or FWB/17 message from the extracted record; you transmit it through your own rails. We hold no airline credentials.

Wire it into your systems.

Start with 30 free scans — no card. Get a key, POST a document, and read the record back.