Simulated NetSuite Posting
Post the previewed records to the simulated NetSuite sandbox, keep the run in a posting log, and read the 20 latest runs or one run with per-record results.
POST /v1/ap/netsuite/post writes to a simulated sandbox log only. It does not call NetSuite, creates no bill in any NetSuite account, and nothing leaves the platform. The sandbox answers each record the way NetSuite's REST API answers a created record, so the result shows what a real posting would return.Posting takes the records of the preview, posts them to the sandbox and keeps the run in the posting log. The sandbox answers each record with status 204 and a Location. Internal ids derive from the external id, so a repeated posting of the same bill gets the same internal id. Duplicate bills are never posted, not even with include_held; other held bills post only with include_held, flagged as on payment hold with approval pending.
With dry_run the run is computed and not stored, and its id is dry-run. The body is optional. The call needs the write scope and a key whose person is a member or above; the run is recorded with the key as its actor. It returns 201 with the run.
/v1/ap/netsuite/postBody fields (all optional)
Response fields (the run)
cURL: Post held and ready bills of one entity
curl -X POST "https://api.talonic.com/v1/ap/netsuite/post" \
-H "Authorization: Bearer $TALONIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"include_held": true, "entity": "US01", "limit": 100}'Response: 201 The run (abridged)
{
"id": "e1b47c0a-5f20-4c7e-8a9d-0b6d3c72f518",
"adapter": "netsuite",
"created_at": "2026-10-21T09:30:12.000Z",
"records": 1,
"amount": 18450,
"include_held": true,
"actor": "app:api:2f7a",
"results": [
{ "bill_key": "bill-0001", "external_id": "bill-0001", "internal_id": "100231", "status": 204, "location": "/services/rest/record/v1/vendorBill/100231", "payment_hold": true }
],
"skipped": [],
"log": ["POST /services/rest/record/v1/vendorBill bill-0001 -> 204"]
}The Posting Log
GET /v1/ap/netsuite/runs returns the 20 most recent runs of the simulated sandbox, newest first, as summaries without the per-record results. GET /v1/ap/netsuite/runs/{id} returns one run with its per-record results, the bills it skipped and its log; the id must be a UUID, and an unknown run is 404. Dry runs are not stored and therefore not in the log. Both routes need the read scope.
/v1/ap/netsuite/runsResponse fields (data[])
/v1/ap/netsuite/runs/{id}Path parameters
After a real run, sandbox_id on a bill from GET /v1/ap/bills carries the internal id the sandbox gave it on the latest run, and last_run on the overview summarizes the run.