apyhub
DATA EXTRACTION · FINANCE

Invoice Parsing API

What it does

Invoice Parser extracts structured invoice data from a file you upload and gives you a job-based result you can poll for status and output.

Send a PDF, DOC, DOCX, PNG, JPG, JPEG, TIFF, or TIF invoice in the request body. You can also set language; if you omit it, the service defaults to English. The submit response returns a job_id and a status_url, so you can track the asynchronous parse without holding the connection open.

When the job finishes, the status endpoint returns the job status along with parsed result data. That result can include buyer details with billing address fields, seller details with VAT ID and address fields, invoice metadata such as currency, issue date, and invoice number, a document.is_invoice flag, financial totals, and line items with quantity, subtotal, unit price, and description.

Use Invoice Parser when you need to capture invoice data for accounts payable workflows, receipt reconciliation, expense systems, or downstream validation. It is suited to document ingestion pipelines where you want to turn invoice files into structured records instead of handling OCR output yourself.

▣ ENDPOINT 01 / 02
POST
Submit Invoice Parse Job
https://api.eu.apyverse.com/sharpapi/parse-invoice

QUICKSTART

GUIDE

Quickstart

Upload an invoice file to start a parse job.

curl -X POST "https://api.eu.apyverse.com/sharpapi/parse-invoice" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"file":"/path/to/invoice.pdf"}'

What you'll get back

Returns a JSON object with job_id and status_url string fields. job_id is the unique identifier for the submitted job, and status_url is the URL you can poll to check its status.

{
  "job_id": "job_12345",
  "status_url": "https://example.com/jobs/job_12345"
}
TRY ITLIVE · 50 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
Max 100MB total per request (all files combined). Larger? Use this API's URL-based endpoint instead, if it has one.
body*
Provide the Invoice file in PDF, DOC, DOCX, PNG, JPG, JPEG, TIFF, or TIF formats.
Specify the language of the Invoice. Defaults to English.

About this endpoint

What it does

Submits an invoice parsing job using an uploaded invoice file and optional language setting. The response returns a JSON object containing the submitted job’s identifier and the URL to poll for its status.

Request Body

ParameterTypeMandatoryDescription
fileStringYesProvide the Invoice file in PDF, DOC, DOCX, PNG, JPG, JPEG, TIFF, or TIF formats.
languageStringNoSpecify the language of the Invoice. Defaults to English.

Response

Returns a JSON object with job_id and status_url string fields. job_id is the unique identifier for the submitted job, and status_url is the URL to poll for job status.

ParameterTypeMandatoryDescription
job_idStringNoThe unique identifier for the submitted job.
status_urlStringNoThe URL to poll for job status.

Notes

This endpoint kicks off an async job and returns immediately with a job identifier; the actual work runs in the background. Pair this call with the corresponding job_check endpoint — poll that until the status reaches a terminal state to retrieve the result. Use job_id to identify the submitted job, and status_url as the polling URL returned by this call.

Body

Name
Type
Description
bodyREQUIRED
object

Max 100MB total per request (all files combined). Larger? Use this API's URL-based endpoint instead, if it has one.

▣ ENDPOINT 02 / 02
GET
Check Invoice Parse Status
https://api.eu.apyverse.com/sharpapi/parse-invoice/job/status/:job_id

QUICKSTART

GUIDE

Quickstart

Check the status of a parsed invoice job by replacing :job_id with the job UUID.

curl -X GET "https://api.eu.apyverse.com/sharpapi/parse-invoice/job/status/:job_id" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with a data object. Inside data, id is the job UUID string, type is the job resource type, and attributes.status is the current job status (running, failed, queued, or success). If the job has completed successfully, data.attributes.result is an array of parsed invoice objects.

{
  "data": {
    "id": "2f1c7d2e-3f9a-4d2d-9f4e-8e2b7d1a6c10",
    "type": "api_job_result",
    "attributes": {
      "status": "success"
    }
  }
}
TRY ITLIVE · 1 ATOM
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Checks the processing status of an asynchronous invoice parsing job using the job_id path parameter. The response returns the job object and, once the job succeeds, the parsed invoice result data.

Path Parameter(s)

AttributeTypeMandatoryDescription
job_idStringYesThe job's unique UUID.

Response

Returns a JSON object with a data object field. data contains the job id as a string, the job type as a string, and an attributes object with status and, when the job is successful, the parsed result array.

AttributeTypeMandatoryDescription
dataObjectYesJob object containing id, type, and attributes.
data.idStringYesThe job's unique UUID.
data.typeStringYesThe job type (api_job_result).
data.attributesObjectYesJob attributes, including status and result.
data.attributes.statusENUMYesCurrent status of the asynchronous job. Allowed values: running, failed, queued, success.
data.attributes.resultObject ArrayNoParsed invoice results. Present when the job status is success.
data.attributes.result[].buyerObjectNoBuyer details extracted from the invoice.
data.attributes.result[].buyer.nameStringNoBuyer name.
data.attributes.result[].buyer.billing_addressObjectNoBuyer billing address.
data.attributes.result[].buyer.billing_address.cityStringNoCity.
data.attributes.result[].buyer.billing_address.stateStringNoState.
data.attributes.result[].buyer.billing_address.countryStringNoCountry.
data.attributes.result[].buyer.billing_address.postcodeStringNoPostcode.
data.attributes.result[].buyer.billing_address.street_line_1StringNoStreet address line 1.
data.attributes.result[].sellerObjectNoSeller details extracted from the invoice.
data.attributes.result[].seller.nameStringNoSeller name.
data.attributes.result[].seller.vat_idStringNoSeller VAT ID.
data.attributes.result[].seller.addressObjectNoSeller address.
data.attributes.result[].seller.address.cityStringNoCity.
data.attributes.result[].seller.address.stateStringNoState.
data.attributes.result[].seller.address.countryStringNoCountry.
data.attributes.result[].seller.address.postcodeStringNoPostcode.
data.attributes.result[].seller.address.street_line_1StringNoStreet address line 1.
data.attributes.result[].invoiceObjectNoInvoice metadata.
data.attributes.result[].invoice.currencyStringNoInvoice currency.
data.attributes.result[].invoice.issue_dateStringNoInvoice issue date.
data.attributes.result[].invoice.invoice_numberStringNoInvoice number.
data.attributes.result[].documentObjectNoDocument classification data.
data.attributes.result[].document.is_invoiceBooleanNoWhether the document was identified as an invoice.
data.attributes.result[].financialsObjectNoInvoice totals.
data.attributes.result[].financials.subtotalNumberNoSubtotal amount.
data.attributes.result[].financials.total_payableNumberNoTotal payable amount.
data.attributes.result[].financials.total_tax_amountNumberNoTotal tax amount.
data.attributes.result[].line_itemsObject ArrayNoLine items extracted from the invoice.
data.attributes.result[].line_items[].quantityNumberNoQuantity.
data.attributes.result[].line_items[].subtotalNumberNoLine item subtotal.
data.attributes.result[].line_items[].unit_priceNumberNoUnit price.
data.attributes.result[].line_items[].descriptionStringNoLine item description.

Notes

Poll this endpoint with the job_id returned by the submit call. The data.attributes.status field cycles through queued and running before reaching a terminal state of success or failed. The parsed invoice fields are only populated in data.attributes.result once status is success; treat them as absent otherwise.

Path parameters

Name
Type
Description
job_idREQUIRED
string
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.