| API | What it does | Auth |
|---|---|---|
| Payments API | Card payments — charge, pre-auth, capture, void, refund, and more | HMAC-SHA256 (Business-Code) |
| Transaction Search | Query transactions from the backend (online) or from terminal storage (offline) | HMAC-SHA256 (Business-Code) |
| Print API | Send structured receipt jobs to the terminal's thermal printer | None |
| Setting | Description |
|---|---|
| Static IP / DHCP reservation | Assign a fixed IP to the terminal on your local network |
| Port | Default 6868 — configurable in DMS |
| Currency | Set at terminal level — not sent in the request body |
| Tips & cashback | Configured in DMS (v1.2.0+) — not sent in the request body |
http://{terminalIp}:{port}http://192.168.1.50:6868transaction_reference from the original charge or authorization response.transaction_type and transaction_mode determine the operation:{
"transaction_type": "charge",
"transaction_mode": "Authorization",
"client_transaction_id": "550e8400-e29b-41d4-a716-446655440000",
"amount": {
"iva": 19000,
"subtotal_iva": 100000,
"subtotal_iva0": 0
}
}amount object does not include a currency field — currency is configured at the terminal level in DMS.transaction_reference — save it alwaysrawResponse.transaction_reference. Persist this value — it is required to void, refund, capture, or re-authorize that transaction.| Country | Cutoff |
|---|---|
| Colombia 🇨🇴 | 23:59 local time |
| Peru | 20:59 local time |
| Chile | 23:59 local time |
| Card type | Maximum hold | Capture limit |
|---|---|---|
| Debit | 7 days | 110% of total authorized |
| Credit | 28 days | 110% of total authorized |
client_transaction_id (UUID v4). Reusing the same ID on a retry returns the original result without creating a duplicate.| Online | Local | |
|---|---|---|
| Source | Kushki acquirer backend | Terminal storage |
| Works offline | ❌ | ✅ |
| Full history | ✅ | Limited to terminal storage window |
| Use case | Reconciliation, reporting, end-of-day | Same-day recovery, offline fallback |
{
"from": "2026-01-01T00:00:00",
"to": "2026-01-31T23:59:59",
"page": 1,
"page_size": 50
}{
"from": "2026-01-01T00:00:00",
"to": "2026-01-01T23:59:59",
"page": 1,
"page_size": 50
}202 Accepted immediately and delivers the final status via webhook or polling.commands array to the terminal's thermal printer. Returns 202 immediately — printing executes asynchronously.{
"printJobId": "RECEIPT-20260101-001",
"webhookUrl": "https://pos.micomercio.co/webhooks/print",
"skipIfBusy": false,
"commands": [
{ "type": "text", "text": "MI COMERCIO COLOMBIA\n", "align": "CENTER", "size": 32, "bold": true },
{ "type": "text", "text": "NIT: 900.123.456-7\n", "align": "CENTER", "size": 20 },
{ "type": "divider", "dividerType": "SOLID" },
{ "type": "columns", "columns": [
{ "text": "Producto A", "weight": 2, "align": "LEFT" },
{ "text": "$ 30.000", "weight": 1, "align": "RIGHT" }
]},
{ "type": "divider", "dividerType": "DOTTED" },
{ "type": "columns", "columns": [
{ "text": "TOTAL", "weight": 2, "align": "LEFT" },
{ "text": "$ 30.000", "weight": 1, "align": "RIGHT" }
]},
{ "type": "text", "text": "APROBADO\n", "align": "CENTER", "size": 28, "bold": true },
{ "type": "qr", "content": "https://micomercio.co/factura/001", "dotSize": 6, "align": "CENTER" },
{ "type": "feed", "lines": 4 },
{ "type": "cut" }
]
}type | Description |
|---|---|
text | Text line — size, alignment, bold, italic, underline |
columns | Multi-column row with proportional widths — ideal for item/price lines |
divider | Full-width separator: SOLID, DOTTED, or EMPTY |
feed | Advance paper N blank lines |
space | Insert pixel-precise vertical whitespace |
cut | Trigger the auto-cutter (silently ignored on cutterless terminals) |
image | Print a Base64-encoded PNG/JPG — typically for merchant logos (max 384 px wide) |
qr | Generate a QR code natively in hardware |
barcode | Generate a CODE128 barcode natively in hardware |
| Practice | Reason |
|---|---|
Always end with feed (≥ 3 lines) + cut | Ensures content clears the tear edge before cutting |
Always set printJobId | Enables idempotent retries — terminal deduplicates by this ID |
Set skipIfBusy: false for payment receipts | Prevents a busy queue from silently discarding a receipt |
Use BINARIZATION algorithm for logos | Sharper edges on monochrome thermal paper |
Use qr / barcode over image for codes | Native hardware generation is faster and higher density |
webhookUrl:{
"printJobId": "RECEIPT-20260101-001",
"status": "COMPLETED",
"externalReference": "Order-4421"
}{
"printJobId": "RECEIPT-20260101-001",
"status": "FAILED",
"externalReference": "Order-4421",
"errorCode": "OUT_OF_PAPER",
"errorMessage": "The printer is out of paper. Insert a roll and try again."
}HTTP 2xx. If the webhook does not arrive within ~60 seconds, use GET /terminal/v1/print_job?print_job_id={id} as fallback.| API | Header | Key |
|---|---|---|
| Payments API | Authorization + timestamp | Business-Code |
| Transaction Search | Authorization + timestamp | Business-Code |
| Print API | — | No authentication required |
Business-Code.timestamp must be in milliseconds (13 digits). A 10-digit seconds value will be rejected.Business-Code — different from Cloud mode, which uses Private-Credential-Id.http://{terminalIp}:6868Got a suggestion on this documentation? Contact us.