SConnect

Available now

Sage 100, over HTTP.

An API for Sage 100 that does not require your code to run anywhere near Sage. 39 readable entities across A/R, A/P, G/L, I/M, S/O and P/O, writes that survive a dropped connection, and an OpenAPI spec with a playground behind it.

curl https://api.sage.sconnect.io/v2/records/AR_Customer/01-ABF \
  -H "Authorization: Bearer mk_live_..."

Read the docs Talk to us about access

Nothing opens in the customer’s firewall

There is no copy of the Sage database behind this API. A small Windows connector runs on the customer’s own Sage box and holds an outbound WebSocket to the cloud. Requests are dispatched down that connection and executed through the Sage business objects — the same ones the Sage UI uses. No inbound rule to request, no VPN to stand up.

  1. your code
  2. cloud API
  3. connector on the customer's Sage box
  4. Sage 100

What it does

Reads that do not always touch Sage

Single-record reads are read-through cached for ten minutes — X-Cache tells you which you got, and ?fresh=true forces a round trip when you need certainty. Pagination is keyset only: follow nextCursor until it is null. Document lines come back embedded with ?expand=lines, or read the detail tables directly when that is cheaper.

Writes that survive a dropped connector

Every create, update and delete is persisted as a job before dispatch. Most answer inline with 201; when a connector is offline you get 202 and a job id, and the queue drains when it reconnects. Idempotency-Key is honoured on every write, so a retry loop cannot double-post a sales order.

Callbacks, and files off the Sage box

Register a webhook once and stop polling — job results arrive signed with HMAC-SHA256. Separately, the connector watches drop folders on the Sage box and queues each file for your workers to claim and ack, which is the answer for the file-based integrations Sage shops still run.

Fields as your install actually has them

Record fields are the live column list resolved from Sage at runtime, including user-defined fields the customer added. There is no fixed schema per entity, because there is no schema that is right for every install.

The limits, before you find them

An ERP API has edges, and you will meet them in week two whatever a marketing page says. So here they are.

Your Sage licence is the ceiling
Concurrency is the customer’s Sage user-license count, and it is often 2. Not a soft limit and not a tier you can upgrade here — it is how many Sage sessions they are licensed for. This is not an API to point fifty parallel workers at.
Sage is the only validator
Record bodies go to the business object untouched. Field errors are Sage’s own words, and nothing is written if any field or line fails — there are no partial documents.
The connector has to be online
If it is not, reads return 503 and writes queue as jobs. There is no cached-everything fallback, and you can check a connector’s state before starting something expensive.
Three entities cannot be read back
Inventory transactions and both purchase-order receipts are create-only with no read mapping. Capture the key from the create response, because nothing else will give it to you.
Batch documents are create-only
Invoices, inventory transactions and receipts enter a batch, but update and delete return 501 — the existing-batch select is not built. Posting through the API is not available either.

The docs carry the rest, including the ones that will irritate you — which status codes are safe to retry, and the one outcome you must never retry at all.

Try it against the demo tenant

The reference has a playground on every endpoint, and there is a Bruno collection to download if you would rather drive it from your own machine. Neither needs a Sage install in front of you.

Read the docs Talk to us about access