Skip to main content

API: movements and reports

General contract in How the API works. All of these require reports:read, which the key has, and are bound to its account.

from and to are mandatory (ISO 8601) and pagination is cursor-based: ask for the next page with cursor=<nextCursor> until it comes back null.

Deliveries

GET /transactions
GET /transactions/summary
GET /transactions/:id/delivery-evidence

Query for GET /transactions:

ParameterTypeNotes
from, toISO 8601mandatory
businessLinevending | eas
isDeliveredbooleantrue successful, false failed
methodstringCASH, CASHLESS, CARD, WALLET, BRE_B, REMOTE
operationId, deviceId, deviceSerial, controllerSerialstring
productId, consumerIdentificationstring
isReturnablebooleanEAS only
fieldsstringcomma-separated field list, to trim the response
cursorstringpagination
limitintegermax 1000
curl -G https://api.inssacs.com/transactions \
-H 'x-api-key: ics_…' \
--data-urlencode 'from=2026-08-01T00:00:00.000Z' \
--data-urlencode 'to=2026-08-31T23:59:59.999Z' \
--data-urlencode 'businessLine=vending' \
--data-urlencode 'isDelivered=true' \
--data-urlencode 'limit=500'

Response:

{
"items": [
{
"id": "019fecb9-43e9-7969-aa90-eaf1aaf1f1db",
"date": "2026-08-11T12:41:03.000Z",
"businessLine": "vending",
"isDelivered": true,
"method": "CASHLESS",
"failureReason": null,
"currency": "COP",
"device": { "serial": "ICS595DDE99B", "name": "Vending Corferias 1" },
"consumer": { "name": "Juan Pérez", "identification": "1023456789", "codeId": "1023456789" },
"product": {
"name": "Chocoramo", "selection": "26", "cost": 2800, "sellValue": 4000,
"priceWithoutTax": 3361, "tax": 19, "taxValue": 639, "profit": 1200,
"balancePaid": 4000, "rechargePaid": 0
}
}
],
"nextCursor": "eyJkYXRlIjoiMjAyNi0wOC0xMVQxMjo0MTowMy4wMDBaIn0"
}

GET /transactions/summary takes the same filters and returns count, total value and the per-type breakdown. GET /transactions/:id/delivery-evidence returns a temporary URL for the delivery video (EAS), with its expiry.

Top-ups

GET /transactions/recharges

Query: from, to (mandatory), operationId, deviceId, consumerIdentification, consumerCode, cursor, limit. Each item carries amount, balanceAfter, the code and the device.

Returns

GET /transactions/returns
GET /transactions/returns/:id/evidence

Returns the delivery ↔ return pairs for returnable products, with status, delivery and return dates, and the keys of both videos. The evidence endpoint hands back the temporary URL.

Available credit

GET /consumers/report
POST /consumers/report/exports
GET /consumers/report/exports/:id

GET /consumers/report gives the balance per code: subsidy, top-up, profile, cumulative flag, and last-subsidy and last-top-up dates. Query: operationId, search, cursor, limit.

Dashboard

GET /dashboard/summary
GET /dashboard/timeseries
GET /dashboard/products
GET /dashboard/devices
GET /dashboard/heatmap
GET /dashboard/payment-methods

Shared query: from, to, accountId (the key's), optional operationId and, on timeseries, granularity (hour, day, week). They aggregate vending sales only.

Excel exports

An asynchronous two-step process.

POST /transactions/exports → 202 { "id": "…", "status": "pending" }
GET /transactions/exports/:id → 200 { "status": "ready", "url": "https://…", "expiresAt": "…" }

POST body:

FieldTypeRequiredNotes
from, toISO 8601yesrange
columnsstring[]yesat least one; the report columns
businessLine, method, deviceId, productId, consumerIdentificationstringnosame filters as the list
isDelivered, isReturnablebooleanno
timeZonestringnoIANA zone used to render dates (America/Bogota)
localestringnoheader language

States: pendingrunningready | failed. Poll the GET until ready and download the (temporary) url. One export at a time per actor: with another running, 409 transactions.export.already_running.

The same pattern applies to POST /consumers/report/exports.

Audit

GET /audit-logs

Query: resourceType, action, search, from, to, page, pageSize. Returns who did what, with previous and new values. Useful to mirror traceability in your own system: actions performed by the key appear with its label as the author.

Selectors and receipts

GET /selectors/:key # static catalogues: currencies, product_types, code_types…
GET /receipts/:frameUuid # public receipt of a delivery (no authentication required)

GET /selectors/product_types is what gives the valid values for a product's type field.