Make your first API call

Download a complete invoice request, send it with your API key and inspect the missing-PO finding. Use cURL, Python, Node.js or Postman. The expected response is HTTP 200 with a false verdict.

Prefer to try it without code? Create an account and open the console. For an integration, start with an API key below.

Get a key

Create an account, confirm the email code, then create a named API key on your account page. Copy the key when it is shown. In your terminal, replace the placeholder and set the environment variable:

Terminal environment

export OPENAUDITOR_API_KEY='paste_your_key_here'

Keep the key in your terminal environment or server's secret store. The commands below use it as a Bearer token; no key is entered into this page. See authentication for rotation and revocation.

Run with cURL

Paste these commands into the same terminal. They download invoice.json, then send it to the versioned API. The full response prints in your terminal.

Download and verify

curl --fail --silent --show-error \
  https://openauditor.ai/examples/invoice.json --output invoice.json && \
curl --silent --show-error --fail-with-body \
  https://openauditor.ai/api/v1/verify \
  -H "Authorization: Bearer $OPENAUDITOR_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @invoice.json

Recognize the expected result

In the synthetic request, Northstar IT Supply bills 20 business laptops at $1,240.00 each: $24,800.00 on invoice INV-2026-0841. It supplies an active vendor and an explicitly empty invoice comparison history. The invoice has no PO reference, so it fails the default rule requiring one above $1,000.00.

Look forExpected finding
verdict"false". Verification completed and found a failed requirement.
po_presentfails, with evidence pointing to the amount and missing PO reference.
arithmetic, vendor_activeholds for the supplied values and vendor record.
not_duplicateholds within the explicitly empty comparison scope; no other invoice history was checked.
goods_specificnot_asked in the saved local run because the direct PO failure already decides the verdict.

The recorded walkthrough was produced by the local engine in the production configuration. Read your response's assertions, configuration and certainty basis. A false verdict is a successful API response, not a failed connection; an empty undecided list does not mean every assertion was resolved.

For a real invoice, the next action is to obtain the purchasing record or document the control exception. This result does not establish that goods arrived or authorize payment. The results guide covers true, false and uncertain, including missing evidence and unqualified questions.

Use Python or Node.js

These small clients fetch the same public invoice request, send one verification and print the complete JSON response. They need no SDK or package installation. Set OPENAUDITOR_API_KEY first, then choose one command pair.

Python 3 · standard library

curl --fail --silent --show-error \
  https://openauditor.ai/examples/verify-invoice.py --output verify-invoice.py && \
python3 verify-invoice.py

Inspect or download the Python client.

Node.js 22 or later · built-in fetch

curl --fail --silent --show-error \
  https://openauditor.ai/examples/verify-invoice.mjs --output verify-invoice.mjs && \
node verify-invoice.mjs

Inspect or download the Node.js client. Both clients report HTTP failures and the response's Request-Id when available. Neither retries verification automatically.

Import into Postman

Download the Postman collection and import the JSON file. It includes the complete invoice body and https://openauditor.ai/api/v1 as base_url. Set the collection's empty api_key variable to a local, unshared value, then send Verify the supplier invoice. Do not share or export your real key; Postman's variable guide explains local and shared values.

Adapt the working request

Replace the synthetic invoice and vendor with your own records, keeping money as decimal strings such as "24800.00". Supply the related history required by your checks: an empty comparison list is a statement about the submitted scope, not proof that no other records exist.