Skip to main content

Accounts Payable Overview

Read captured supplier bills as posting-ready vendor bills split into ready and held, and preview or post them to a simulated NetSuite sandbox with /v1/ap.

Every endpoint on this page answers 404 in a workspace that has not added the Accounts Payable app (catalog slug payables). Add it from the Apps catalog or with POST /v1/apps and slug payables; GET /v1/apps lists the apps a workspace has added.

The Accounts Payable app reads the supplier bills a workspace has already captured and turns each into a posting-ready vendor bill: vendor, entity, payment terms, due date, and lines carrying account, department and class. It splits the bills into ready and held, and states the dollars at stake in the held ones. The work is deterministic. Nothing in this app calls a model or extracts a document; it reads documents that were captured before and checks them against the Money Found ledger and a few AP controls.

These endpoints belong to the Accounts Payable app (catalog slug payables). A workspace uses them after adding the app; GET /v1/apps lists the workspace's apps by slug. Where the bills come from is part of the app's configuration (bill_sources), and by default AP reads the ap_invoices role of the workspace's Money Found configuration. Amounts are in the ledger currency of that configuration; every bill also keeps its own currency and amount.

A bill is held when something stops it from being paid as printed. There are four hold reasons: above_contract (the invoice bills more than the contract allows, from an owed row of the ledger), duplicate (the same vendor, amount and date appears twice; the captured original is never the copy), missing_po (a bill of a kind that must carry a purchase order number has none) and vendor_unknown (the vendor has no NetSuite record, which applies only when vendor records are configured). Estimated and potential findings are notes on a bill and never holds.

The NetSuite integration is simulated. POST /v1/ap/netsuite/post writes to a sandbox log inside the platform and never calls NetSuite. Nothing leaves the platform, no bill is created in any NetSuite account, and the REST field names have not been posted to a real account. Use the preview and the CSV export to see exactly what a real posting would send.

Authentication uses a tlnc_ API key or an OAuth token in the Authorization: Bearer header. Reads need the read scope. The two writes, PUT /v1/ap/config and POST /v1/ap/netsuite/post, need the write scope and the key's person to be a member or above in the workspace. All routes act on the workspace of the key; the cross-workspace master view is rejected.

Worked Example: Review Held Bills, Then Post

Start with the overview for totals and gaps, read the worklist of held bills, then dry-run the posting to see which records would go to the sandbox.

cURL: 1. Totals, worklist, dry-run posting

curl "https://api.talonic.com/v1/ap/overview" \
  -H "Authorization: Bearer $TALONIC_API_KEY"

curl "https://api.talonic.com/v1/ap/issues" \
  -H "Authorization: Bearer $TALONIC_API_KEY"

curl -X POST "https://api.talonic.com/v1/ap/netsuite/post" \
  -H "Authorization: Bearer $TALONIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dry_run": true}'

When the dry run looks right, post for real. The run is kept in the posting log and can be read back by id.

cURL: 2. Post to the simulated sandbox and read the log

curl -X POST "https://api.talonic.com/v1/ap/netsuite/post" \
  -H "Authorization: Bearer $TALONIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

curl "https://api.talonic.com/v1/ap/netsuite/runs" \
  -H "Authorization: Bearer $TALONIC_API_KEY"

Frequently asked questions

Does posting create bills in NetSuite?+
No. The adapter is a simulated sandbox. Posting stores a run in the posting log inside the platform and answers each record the way NetSuite's REST API answers a created record, but nothing is sent to NetSuite. The preview and the CSV export show what a real posting would send.
What currency are the amounts in?+
Totals and at-stake amounts are in the ledger currency of the workspace's Money Found configuration. Each bill also carries its own currency and amount, and amount_base in the ledger currency when a rate is known. Bills that cannot be converted are counted in totals.unconverted and left out of the dollar totals.
Why does the app say the configuration is missing something?+
The overview lists gaps, each naming what is missing for a complete read: no_invoice_pipeline (no run holds an invoice yet), contracts_not_set_up or contracts_not_bound (Money Found is not set up, or does not read these invoices, so prices are not checked against contracts while every other check runs), processing:<role> (invoices still being read), no_binding:<role>, unreadable:<role>, ledger_unavailable and contracts_pending.