Skip to main content

Bills, Worklist and Totals

Read the payables overview with totals and gaps, list posting-ready vendor bills filtered by status or hold reason, and read the worklist of held bills.

Three read routes cover the payables inbox. GET /v1/ap/overview returns the state of the inbox without the bills themselves: totals, one block per legal entity, the bill sources and the last posting run. GET /v1/ap/bills returns the bills, held bills first and then by dollars at stake. GET /v1/ap/issues returns only the held bills with why they are held, the dollars at stake and the evidence, largest first. All three need the read scope.

AP finds its invoices by itself: the Spec Money Found's invoice role names, else the workspace's pipeline holding the most documents classified as invoices. New invoices, purchase orders and delivery notes are added to that pipeline once classified, when no run holds them yet and they come from a source the pipeline already reads, or a new source no other Spec reads; POST /v1/ap/intake (scope write, dry_run to only list) adds the ones that arrived before. Payment rules come from files: POST /v1/ap/rules/batches turns uploaded documents (policies, validation rules) into rules, GET /v1/ap/rules lists them, and every invoice is checked against them with the documents it links to; a failed rule holds it with the reason policy_rule and the words it rests on. The overview's gaps array lists what is missing for a complete read: no_invoice_pipeline, contracts_not_set_up / contracts_not_bound (Money Found not set up, or not reading these invoices: prices are not checked against contracts, every other check runs), processing:<role> (invoices still being read), rules_pending (invoices still being checked against the payment rules), no_binding:<role>, unreadable:<role>, ledger_unavailable and contracts_pending. configured is false only when no pipeline holds an invoice, and gaps then holds no_invoice_pipeline. totals.held.at_stake counts the dollars the holds put at stake, never more than the bill itself, while totals.held.amount is the full amount of the held bills.

GET/v1/ap/overview

Response fields

as_of / currencydate / stringThe date the figures are as of (the date set in the Money Found configuration, else today) and the ISO 4217 ledger currency.
configuredbooleanFalse when the workspace has no Money Found configuration; the totals are then empty.
gapsstring[]What is missing for a complete read.
totalsobjectbills, ready { count, amount }, held { count, amount, at_stake, above_contract, duplicates, missing_po, vendor_unknown } and unconverted.
entities[]arrayPer legal entity: code, name, system, netsuite, ready and held counts and amounts.
sources[]arrayPer Money Found role read: role, rows, bills.
last_runobject | nullSummary of the latest posting run, or null.
GET/v1/ap/bills

Query parameters

statusstringready, needs_info, evaluating or held. Any other value is a 400.
entitystringEntity code.
reasonstringBills with a hold of this reason: above_contract, duplicate, missing_po or vendor_unknown.
qstringCase-insensitive substring over vendor, invoice number, file name and contract reference.
limitintegerBills returned, 1 to 5000. Default: 500

Response fields

currencystringISO 4217 code of the ledger currency.
totalintegerBills matching the filters, before limit.
data[]arrayThe bills.
data[].key / document_id / filenamestringThe bill key and the document it was read from.
data[].vendor / invoice_numberstringinvoice_number is the document number the bill posts under; captured_number is the number as captured when it differs.
data[].amount / currency / amount_basenumber / stringThe bill's own amount and currency, and the amount in the ledger currency (null when no rate is known).
data[].statusstringready, needs_info, evaluating (the contract price check is still running) or held.
data[].holds[]arrayWhy the bill is held: reason, label, amount, explanation, duplicate_of, evidence.
data[].notes[]arrayFindings that do not hold the bill.
data[].lines[]arrayLines with account, department, class (klass), sublist (item or expense) and tax.
data[].provenanceobjectSource page (1-based) and verbatim text per bill field.
data[].netsuiteobject | nullSubsidiary, vendor, terms and currency references; null when the bill's entity is not a NetSuite subsidiary.
data[].sandbox_idstring | nullInternal id the simulated sandbox gave the bill on the latest run.

cURL: Held bills without a purchase order

curl "https://api.talonic.com/v1/ap/bills?status=held&reason=missing_po&limit=50" \
  -H "Authorization: Bearer $TALONIC_API_KEY"

Response: One held bill (abridged)

{
  "currency": "USD",
  "total": 1,
  "data": [
    {
      "key": "bill-0007",
      "document_id": "7c1e2b94-3a5d-4f08-9b6a-52d8c0e1a4f3",
      "filename": "northwind-inv-20411.pdf",
      "vendor": "Northwind Logistics",
      "invoice_number": "20411",
      "currency": "USD",
      "amount": 18450,
      "amount_base": 18450,
      "status": "held",
      "holds": [
        { "reason": "missing_po", "label": "Purchase order required", "amount": 18450, "explanation": "Freight bills must carry a PO number and this one has none." }
      ],
      "lines": [
        { "description": "Linehaul October", "amount": 18450, "sublist": "expense", "tax": false }
      ]
    }
  ]
}
GET/v1/ap/issues

Response fields

currencystringLedger currency.
data[].key / vendor / invoice_number / entitystringThe held bill.
data[].amountnumber | nullBill amount in the ledger currency.
data[].at_stakenumberDollars the holds put at stake, never more than the bill.
data[].holds[]arrayreason, label, amount, explanation, lever_id, duplicate_of.
A ledger row attaches to the bill its evidence cites. A row that cites no bill, such as a royalty finding on a sales report, attaches to the bills of the same agreement and date. A bill whose amount could not be converted to the ledger currency has amount_base: null and counts in totals.unconverted.

Frequently asked questions

What is the difference between amount and at_stake?+
amount is the full value of the bill. at_stake is the dollars the holds put at risk, for example the part above the contract price, and is never more than the bill. The worklist sorts by at_stake, largest first.
What is the risk of a held bill?+
Each held bill gets a risk from a risk matrix: how likely its kind of hold loses money (duplicate, already paid and a changed bank account are high; above contract, above PO, not received and a failed payment rule medium; the rest low) against the money at stake (high from 10,000, medium from 1,000 in the ledger currency). A duplicate of 100 is a medium risk, one of 15,000 high. Both tables can be changed per workspace in the Risk matrix dialog on the AP page or with PUT /v1/ap/risk; only what differs from the defaults is stored. Filter with GET /v1/ap/bills?risk=high.
Why does a bill have notes but no holds?+
Estimated and potential findings, such as an estimated exposure or a discount to take, are notes on the bill and never holds. Only owed ledger rows and the AP controls (duplicate, missing_po, vendor_unknown) hold a bill.
How is invoice_number chosen?+
It is the posting reference: the printed number when it reads like one, else agreement and period for statements, else vendor, date and a document hash. The raw capture is kept as captured_number when it differs.