Infrastructure for document workflows
Customs API for AI Agents: Aviation Document Extraction

In this product a customs API extracts and prepares aviation certificate data. It does not file an entry. If you connect an internal agent hoping it will submit a declaration, the catalog will not do that job.
Doana’s public interface supplies EASA Form 1 extraction for customs preparation. Bring reviewed fields back into the broker or forwarder system you already trust. The scope below is that extraction contract, not a filing API, tariff engine, or duty-payment rail.
Public catalog as of 12 September 2026: extract_easa_form1 only.
Customs API here means extraction
An agent can pull structured EASA Form 1 fields, list exceptions, and wait for a human. It is not a customs entry API, not a classification engine, and not a payment rail. Say that in the first design review or operators will assume filing.
EASA Form 1 remains a release certificate. Origin, valuation and procedure still come from other evidence in the packet. The agent’s job is to make certificate data reviewable, not to invent missing customs facts from general aviation knowledge. Keep serial numbers as arrays in every export.
What the catalog does not file
The public catalog does not expose customs declaration submission, binding tariff rulings, duty payment or freight booking. An agent preparing a shipment may still need those capabilities from other systems, wired as separate tools with separate permissions, owners, and audit logs.
If the packet contains an FAA-only 8130-3, an invoice or an air waybill, keep those documents off extract_easa_form1. Classify the packet first. documentType unknown is an unresolved input on a usually succeeded job, not a draft customs entry line.
Call extract_easa_form1 from an internal agent
Create a personal account, add https://doana.ca/api/mcp, complete OAuth, and list tools. For a file up to 64 KiB, pass lossless content_base64. Otherwise call create_mcp_upload, PUT the bytes or use browser_upload_url, then extract with upload_id. ChatGPT workspaces use the signed file object instead.
Poll get_extraction_result with the returned job_id while status is dispatch_pending, queued, running or outcome_unknown. Accept the payload only when status is succeeded, documentType is easa_form_1 and result is present. Keep serial numbers as arrays. Compare uncertainFields with the certificate before any customs mapping spreadsheet is filled.
Keep filing authorization outside the tool
Store the job identifier with your internal document reference. Preserve original extracted values and uncertainty indicators. Route exceptions to an operator. Pass only reviewed data into the application that is allowed to file. A transport-level MCP success is not an accepted customs fact.
Handle expired uploads by obtaining a new upload slot. After a timeout, poll the known job rather than extracting again. Treat failed_refundable or failed_charged jobs as unresolved and show lastError. Keep downstream filing authorization in your own roles, not in certificate remarks the model might quote.