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:
| Parameter | Type | Notes |
|---|---|---|
from, to | ISO 8601 | mandatory |
businessLine | vending | eas | — |
isDelivered | boolean | true successful, false failed |
method | string | CASH, CASHLESS, CARD, WALLET, BRE_B, REMOTE |
operationId, deviceId, deviceSerial, controllerSerial | string | — |
productId, consumerIdentification | string | — |
isReturnable | boolean | EAS only |
fields | string | comma-separated field list, to trim the response |
cursor | string | pagination |
limit | integer | max 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:
| Field | Type | Required | Notes |
|---|---|---|---|
from, to | ISO 8601 | yes | range |
columns | string[] | yes | at least one; the report columns |
businessLine, method, deviceId, productId, consumerIdentification | string | no | same filters as the list |
isDelivered, isReturnable | boolean | no | — |
timeZone | string | no | IANA zone used to render dates (America/Bogota) |
locale | string | no | header language |
States: pending → running → ready | 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.