NativePort
← All use cases

Turn document images into structured JSON

Extract the fields and table rows your application needs from a document image.

The problem

Reading text is only the first step. Your application needs named fields and rows, while an agent may return an explanation with inconsistent labels or omit a column. An image also has no existing JSON structure to copy.

How NativePort helps

NativePort lets you tell a document reader which fields matter. It reads the image and returns those fields in a predictable structure, so your agent can pass them to the next step without manually rearranging a paragraph.

Technical implementation

Use Python 3 with requests installed (python -m pip install requests). Set NATIVEPORT_API_KEY in your environment to your NativePort key. Run the snippets on your server, where your key stays private.

Set DOCUMENT_URL to an HTTPS URL the document service can fetch, such as a time-limited file link. The example reads page 0 (the first page). Select only pages you need, up to 100 per request; split longer documents into batches. Send the URL, not inline file bytes.

This schema extracts line items with a description, quantity, and amount. Adapt the fields to your document.

python
import os
import requests

BASE = "https://api.nativeport.ai"
HEADERS = {"Authorization": f"Bearer {os.environ['NATIVEPORT_API_KEY']}"}

payload = {
    "document": {"type": "image_url", "image_url": os.environ["DOCUMENT_URL"]},
    "pages": [0],
}
schema = {'type': 'object',
 'properties': {'rows': {'type': 'array',
                         'items': {'type': 'object',
                                   'properties': {'description': {'type': ['string',
                                                                           'null']},
                                                  'quantity': {'type': ['string',
                                                                        'null']},
                                                  'amount': {'type': ['string',
                                                                      'null']}},
                                   'required': ['description',
                                                'quantity',
                                                'amount'],
                                   'additionalProperties': False}}},
 'required': ['rows'],
 'additionalProperties': False}
payload["document_annotation_format"] = {
    "type": "json_schema",
    "json_schema": {"name": "extraction", "strict": True, "schema": schema},
}
payload["document_annotation_prompt"] = (
    'Extract only what is visible. Use null for missing or unreadable values.'
)
response = requests.post(BASE + "/mistral/v1/ocr", headers=HEADERS,
                         json=payload, timeout=120)
response.raise_for_status()
result = response.json()
import json
fields = result.get("document_annotation")
if isinstance(fields, str):
    fields = json.loads(fields)
if fields is None:
    raise ValueError("No document annotation returned; inspect the OCR response")
print(fields)

Values stay as strings to preserve printed currency and decimal formatting. Normalize and validate them before arithmetic. A schema controls the output shape; it does not guarantee that every recognized value is correct. An annotation request uses the Document AI rate. See the Mistral request policy for document URLs, page selection, and accepted options. OCR returns recognized content; check unclear scans against the source.

Tool costs

Tool used in the examplePrice per call
Mistral — structured extraction $0.005275 / call (1 page)

Prices in USD. Usage-based tools have no fixed per-call price. View pricing.

Let your agent build it

You don’t need to write this code yourself. Copy this page’s link and paste it into your agent. Ask it to follow the guide and implement the feature for you.