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
| Field | Why it matters |
|---|---|
ticketBarcode | The 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 |
dataTimeStamp | When the transaction happened, in UTC |
ticketAmount | The value on the ticket |
transactionTypeDesc | Issue, redeem, void — what happened to it |
transactionStatusId | The outcome, as a status code (see below) |
deviceId | The machine or kiosk, matched to an eConnect entity so the ticket reaches its camera |
employeeId | Who handled it, where a person was involved |
playerId | The 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.
Related endpoints
| Method | Path | What it does |
|---|---|---|
POST | casino-connect/plugins/{id}/tito-tickets | One transaction |
POST | casino-connect/plugins/{id}/tito-tickets/batch | Many |
GET | casino-connect/plugins/{id}/tito-tickets | Query what is stored |
GET | casino-connect/plugins/{id}/entities | Devices 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.