Skip to main content

Readers and antennas

MethodPathDoes
GET/readersList readers and their health
PATCH/readers/{id}Start or stop a reader
DELETE/readers/{id}Remove a reader from your account
GET/readers/{id}/antennasA reader's four antenna ports
PUT/readers/{id}/antennasMap ports to zones and change RF settings
POST/devices/claimClaim a reader using the code on its box
GET/devicesReaders your account has claimed

List readers​

GET /readers
[
{
"id": "3c9a2f61-0e4b-4d7a-8f15-2b6c9d0e1a73",
"name": "Goods In 1",
"serial": "37025502846",
"model": "R700",
"firmware": "8.4.1",
"status": "online",
"enabled": true,
"temperatureC": 48,
"cpuPercent": 12,
"memoryPercent": 41,
"healthAt": "2026-10-10T14:02:50.000Z",
"brokerStatus": "connected",
"brokerStatusAt": "2026-10-10T06:30:12.000Z",
"lastEventAt": "2026-10-10T14:03:21.000Z",
"lastSeenAt": "2026-10-10T14:03:21.000Z",
"commandsSupported": true,
"lastCommand": {
"id": "c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f",
"kind": "start",
"state": "applied",
"createdAt": "2026-10-10T06:31:00.000Z",
"settledAt": "2026-10-10T06:31:01.000Z"
}
}
]
Field
statusonline, degraded, offline, disabled (stopped by someone), or unknown (never reported). See Readers.
enabledfalse when someone has stopped the reader.
offlineReasonPresent when the reader isn't online: never-connected, broker-disconnected, no-data, radio-idle or stopped.
brokerStatusnever, connected or disconnected: whether the reader's connection to Titan is open right now.
lastSeenAtThe latest sign of life of any kind.
lastEventAtWhen tag data last arrived.
temperatureC, cpuPercent, memoryPercent, powerMilliwattsHealth figures, present when the reader reports them.
commandsSupportedWhether the reader has confirmed it can take Start/Stop commands.
lastCommandThe latest Start/Stop sent. state is pending, published, applied, failed or superseded.

The response also contains fields Titan uses internally to manage the reader (for example desiredConfig, controlPath and hostname). Don't rely on them, because they may change.

Start or stop a reader​

PATCH /readers/{id}
{ "enabled": false }

false stops the radio and true starts it. Returns the updated reader. The command goes to the reader over its existing connection. Watch lastCommand.state change to applied to confirm the reader acted on it.

Remove a reader​

DELETE /readers/{id}

Removes the reader from your account, with any open alerts about it. Tags it has read keep their data and history. Returns 204. Contact support before removing a reader you plan to keep using (see Readers).

Antennas​

GET /readers/{id}/antennas
[
{
"id": "5e8b1a2c-3d4f-4a6b-8c9d-0e1f2a3b4c5d",
"readerId": "3c9a2f61-0e4b-4d7a-8f15-2b6c9d0e1a73",
"port": 1,
"zoneId": "9d2e4f60-1a3b-4c5d-8e7f-6a5b4c3d2e10",
"zoneName": "Receiving",
"role": "coverage",
"transmitPowerCdbm": 2700,
"inventorySession": 2,
"searchMode": "dual-target",
"tagPopulation": 128,
"enabled": true
}
]

There's one entry per port, 1 to 4.

PUT /readers/{id}/antennas

Send an array with one object per port you want to change. Settings you leave out of an object are left unchanged, except zoneId and role: these are always set from what you send. Leave zoneId out (or send null) and the port becomes unmapped. Leave role out and it becomes coverage.

[
{ "port": 1, "zoneId": "9d2e4f60-1a3b-4c5d-8e7f-6a5b4c3d2e10", "transmitPowerCdbm": 2400 },
{ "port": 2, "zoneId": "9d2e4f60-1a3b-4c5d-8e7f-6a5b4c3d2e10" },
{ "port": 3, "zoneId": null, "enabled": false }
]
FieldValues
port1 to 4. Required.
zoneIdA zone's id, or null to unmap.
rolecoverage. The default, and the only role in use today.
transmitPowerCdbmTransmit power in hundredths of a dBm, 1000 to 3300 (10.00 to 33.00 dBm). The default is 3000.
inventorySession0 to 3. The default is 2.
searchModedual-target (default), single-target or single-target-with-tagfocus.
tagPopulationExpected number of tags in view. The default is 128.
enabledWhether the port is used.

The new settings are sent to the reader straight away. Returns the full antenna list. An unknown port or an out-of-range value returns 400, and nothing is changed.

Claim a reader​

POST /devices/claim
{ "code": "TTN-7KQM-R4XW", "readerName": "Goods In 1" }

Adds a reader that shipped with a claim code to your account. Both fields are required. Returns 201 with the claimed device. Its readerId is the id you'll see in /readers.

ResponseMeaning
201Claimed. The reader appears in /readers.
404The code isn't valid. That's also the answer for a code that has already been used, so codes can't be guessed.
409That reader has been withdrawn. Contact support.

Claimed devices​

GET /devices

Lists the readers your account has claimed, with serial, model, firmware, readerId, claimedAt and firstSeenAt. It's useful for confirming a claim went through.