Skip to main content

Pushing TITO tickets

TITO — ticket in, ticket out — is the paper that carries value around a floor. eConnect follows a ticket from where it was issued to where it was redeemed, which is what makes "where did this value go?" answerable.

If your slot system or kiosk is the system of record, push the transactions here.

POST /api/v2/casino-connect/plugins/{pluginInstalledId}/tito-tickets single
POST /api/v2/casino-connect/plugins/{pluginInstalledId}/tito-tickets/batch array

Use the batch form for anything other than live, one-at-a-time events: it takes the same object in an array and costs one round trip.

The payload​

{
"dataTimeStamp": "2026-10-02T21:14:05Z",
"ticketId": "00412887",
"ticketBarcode": "TKT-00412887",
"ticketAmount": 125.50,
"ticketTypeDesc": "Cashable",
"ticketExpireDate": "2026-11-01T06:59:59Z",
"transactionTypeId": 2,
"transactionTypeDesc": "Redeem",
"transactionStatusId": 200,
"transactionStatusDesc": "Completed",
"deviceId": "EGM-1042",
"deviceName": "Bank 12 / Seat 3",
"locationId": "FLOOR-2",
"locationName": "Main Floor",
"employeeId": "E-4471",
"employeeName": "A. Attendant",
"playerId": "P-99120",
"playerName": "Example Patron"
}

Fields that carry the weight​

FieldWhy it matters
ticketBarcodeThe identity of the ticket. It is what joins an issue to its redemption — get it right and the chain works, get it wrong and you have two unrelated records
dataTimeStampWhen the transaction happened, in UTC
ticketAmountThe value on the ticket
transactionTypeDescIssue, redeem, void — what happened to it
transactionStatusIdThe outcome, as a status code (see below)
deviceIdThe machine or kiosk, matched to an eConnect entity so the ticket reaches its camera
employeeIdWho handled it, where a person was involved
playerIdThe patron, if your system knows them

Transaction status​

transactionStatusId is a code between 200 and 207. The values and their meanings are specific to your slot system's vocabulary as eConnect was configured for it — confirm the mapping with your eConnect contact rather than guessing, and send transactionStatusDesc alongside so an operator reading the grid sees words rather than a number.

Devices have to match​

deviceId must correspond to a gaming device eConnect knows, or the ticket lands with no camera and no location. List them first and map once:

GET /api/v2/casino-connect/plugins/{pluginInstalledId}/entities

Sending it​

# One transaction, as it happens
curl -X POST \
"https://your-server/api/v2/casino-connect/plugins/$CASINO_ID/tito-tickets" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"dataTimeStamp": "2026-10-02T21:14:05Z",
"ticketBarcode": "TKT-00412887",
"ticketAmount": 125.50,
"transactionTypeDesc": "Redeem",
"transactionStatusId": 200,
"deviceId": "EGM-1042"
}'
// A backlog, batched
var batch = pending.Select(t => new
{
dataTimeStamp = t.OccurredUtc,
ticketBarcode = t.Barcode,
ticketAmount = t.Amount,
ticketTypeDesc = t.Type,
transactionTypeDesc = t.Action, // Issue | Redeem | Void
transactionStatusId = t.StatusCode, // 200..207
deviceId = t.MachineId,
employeeId = t.AttendantId,
}).ToArray();

var response = await http.PostAsJsonAsync(
$"casino-connect/plugins/{casinoId}/tito-tickets/batch", batch);
response.EnsureSuccessStatusCode();
# Keep batches to a few hundred; the server takes more, but a failed
# 10,000-row batch tells you far less than a failed 200-row one.
for chunk in chunked(transactions, 200):
resp = requests.post(
f"{BASE}/casino-connect/plugins/{casino_id}/tito-tickets/batch",
headers={"Authorization": f"Bearer {token}"},
json=[to_tito(t) for t in chunk],
timeout=60,
)
resp.raise_for_status()
mark_sent(chunk) # only after the server has it

The single endpoint returns the record id it assigned; the batch endpoint returns true. Record your own ticketBarcode against what you sent — that is what makes a retry safe to reason about.

MethodPathWhat it does
POSTcasino-connect/plugins/{id}/tito-ticketsOne transaction
POSTcasino-connect/plugins/{id}/tito-tickets/batchMany
GETcasino-connect/plugins/{id}/tito-ticketsQuery what is stored
GETcasino-connect/plugins/{id}/entitiesDevices to map against

The full list is on the Casino reference page.

Permissions​

The service account needs the CasinoConnect* keys for the operations it performs, and the casino plugin instance must be within its logical group. An account that only pushes tickets needs the add key and nothing else. See the Permission Keys reference.

What operators see​

Pushed tickets appear in TITO with the chain intact: a ticket's origin, previous, next and destination can be walked in either direction, and where the device is associated with a camera the row opens the footage of the issue or the redemption. A TITO tile is also available on DVR playback, in step with the video.