TCP Monitors
Create and manage TCP monitors. Check port connectivity and get connection history.
TCP monitors verify that services are accepting connections on specific ports. Use them to monitor databases, mail servers, game servers, and any TCP-based service.
List All TCP Monitors
/api/v1/tcp-monitorsRetrieve your team's TCP monitors, newest first.
This endpoint is paginated. See Pagination for how to page through the full list.
Required scope: tcp-monitors:read
Query Parameters
perPageintegerResults per page, 1-200 (default: 50)
cursorstringPage to fetch, taken from a
Linkheader
Errors (3)
| Status | Type | Meaning |
|---|---|---|
| 400 | bad-request | The request is malformed |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
Response fields (200)
dataobjectRequiredShow nested fields
monitorsTcpMonitor[]RequiredShow nested fields
idstringRequirednamestringRequiredhoststringRequiredportintegerRequiredtimeoutMsintegerRequiredintervalSecondsintegerRequiredisEnabledbooleanRequiredlastCheckedAtinteger | nullRequiredEpoch milliseconds
lastStatusstring | nullRequiredOne of
up,down,timeout.lastResponseTimeMsinteger | nullRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
paginationobjectRequiredShow nested fields
nextstring | nullRequiredCursor of the following page
prevstring | nullRequiredCursor of the preceding page
perPageintegerRequiredtotalinteger
curl -i "https://uptime.sergiodxa.com/api/v1/tcp-monitors?perPage=25" \
-H "Authorization: Bearer uptime_your_api_key"Response
{
"data": {
"monitors": [
{
"id": "tcpm_abc123",
"name": "PostgreSQL Production",
"host": "db.example.com",
"port": 5432,
"timeoutMs": 5000,
"intervalSeconds": 60,
"isEnabled": true,
"lastCheckedAt": 1771070400000,
"lastStatus": "up",
"lastResponseTimeMs": 45,
"createdAt": 1768473000000,
"updatedAt": 1770733200000
}
]
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z",
"pagination": {
"next": "eyJkIjoiYWZ0ZXIi",
"prev": null,
"perPage": 25,
"total": 34
}
}
}Create a TCP Monitor
/api/v1/tcp-monitorsCreate a new TCP monitor to check port connectivity.
Required scope: tcp-monitors:write
Request Body
namestringRequiredMonitor name (1-255 characters)
hoststringRequiredHostname or IP address (1-255 characters)
portintegerRequiredTCP port number (1-65535)
timeoutMsintegerConnection timeout in milliseconds (100-60000, default: 5000)
intervalSecondsintegerCheck interval in seconds (60-86400, default: 60)
isEnabledbooleanWhether the monitor is active (default: true)
Errors (6)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 400 | idempotency-key-invalid | The Idempotency-Key header is not valid |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 409 | idempotency-key-in-use | A request with this idempotency key is still being processed |
| 422 | idempotency-key-reused | This idempotency key was already used for a different request |
Response fields (201)
dataobjectRequiredShow nested fields
monitorobjectRequiredShow nested fields
idstringRequirednamestringRequiredhoststringRequiredportintegerRequiredtimeoutMsintegerRequiredintervalSecondsintegerRequiredisEnabledbooleanRequiredlastCheckedAtinteger | nullRequiredEpoch milliseconds
lastStatusstring | nullRequiredOne of
up,down,timeout.lastResponseTimeMsinteger | nullRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
Response
{
"data": {
"monitor": {
"id": "tcpm_abc123",
"name": "PostgreSQL Production",
"host": "db.example.com",
"port": 5432,
"timeoutMs": 10000,
"intervalSeconds": 60,
"isEnabled": true,
"lastCheckedAt": null,
"lastStatus": null,
"lastResponseTimeMs": null,
"createdAt": 1771070400000,
"updatedAt": 1771070400000
}
}
}Get a TCP Monitor
/api/v1/tcp-monitors/:idRetrieve a single TCP monitor by ID.
Required scope: tcp-monitors:read
Errors (4)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
monitorobjectRequiredShow nested fields
idstringRequirednamestringRequiredhoststringRequiredportintegerRequiredtimeoutMsintegerRequiredintervalSecondsintegerRequiredisEnabledbooleanRequiredlastCheckedAtinteger | nullRequiredEpoch milliseconds
lastStatusstring | nullRequiredOne of
up,down,timeout.lastResponseTimeMsinteger | nullRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
Response
{
"data": {
"monitor": {
"id": "tcpm_abc123",
"name": "PostgreSQL Production",
"host": "db.example.com",
"port": 5432,
"timeoutMs": 5000,
"intervalSeconds": 60,
"isEnabled": true,
"lastCheckedAt": 1771070400000,
"lastStatus": "up",
"lastResponseTimeMs": 45,
"createdAt": 1768473000000,
"updatedAt": 1770733200000
}
}
}Update a TCP Monitor
/api/v1/tcp-monitors/:idUpdate an existing TCP monitor with a JSON merge patch. Only include fields you want to change.
Required scope: tcp-monitors:write
Request Body
namestringMonitor name (1-255 characters)
hoststringHostname or IP address (1-255 characters)
portintegerTCP port number (1-65535)
timeoutMsintegerConnection timeout in milliseconds (100-60000)
intervalSecondsintegerCheck interval in seconds (60-86400)
isEnabledbooleanWhether the monitor is active
The limits are the ones Create a TCP Monitor applies. null resets timeoutMs to 5000, intervalSeconds to 60 and isEnabled to true; name, host and port cannot be removed, so null on any of them is a 400 validation-error.
Update With PUT
PUT /api/v1/tcp-monitors/:id takes the same fields, for integrations written before PATCH existed. A field you leave out keeps its value, null is refused, and sending isEnabled schedules the next check again on every request, even when the value is unchanged.
Required scope: tcp-monitors:write
Errors (4)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
monitorobjectRequiredShow nested fields
idstringRequirednamestringRequiredhoststringRequiredportintegerRequiredtimeoutMsintegerRequiredintervalSecondsintegerRequiredisEnabledbooleanRequiredlastCheckedAtinteger | nullRequiredEpoch milliseconds
lastStatusstring | nullRequiredOne of
up,down,timeout.lastResponseTimeMsinteger | nullRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
Response
{
"data": {
"monitor": {
"id": "tcpm_abc123",
"name": "PostgreSQL Production",
"host": "db.example.com",
"port": 5432,
"timeoutMs": 15000,
"intervalSeconds": 60,
"isEnabled": false,
"lastCheckedAt": 1771070400000,
"lastStatus": "up",
"lastResponseTimeMs": 45,
"createdAt": 1768473000000,
"updatedAt": 1771072200000
}
}
}Delete a TCP Monitor
/api/v1/tcp-monitors/:idPermanently delete a TCP monitor and all its check history.
Required scope: tcp-monitors:delete
Errors (4)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
deletedtrueRequired
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
Response
{ "data": { "deleted": true } }Get Check Results
/api/v1/tcp-monitors/:id/resultsRetrieve the connection check history for a TCP monitor.
Results arrive newest first, a page at a time. See Pagination for how to walk the whole history.
Required scope: tcp-monitors:read
Query Parameters
perPageintegerResults per page, 1-200 (default: 50)
cursorstringPage to fetch, taken from a
Linkheader
Errors (5)
| Status | Type | Meaning |
|---|---|---|
| 400 | bad-request | The request is malformed |
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
resultsTcpMonitorResult[]RequiredShow nested fields
idstringRequiredstatusstringRequiredOne of
up,down,timeout.responseTimeMsinteger | nullRequirederrorMessagestring | nullRequiredcheckedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
paginationobjectRequiredShow nested fields
nextstring | nullRequiredCursor of the following page
prevstring | nullRequiredCursor of the preceding page
perPageintegerRequiredtotalinteger
curl -i "https://uptime.sergiodxa.com/api/v1/tcp-monitors/tcpm_abc123/results?perPage=10" \
-H "Authorization: Bearer uptime_your_api_key"Response
{
"data": {
"results": [
{
"id": "tcpr_xyz789",
"status": "up",
"responseTimeMs": 42,
"errorMessage": null,
"checkedAt": 1771070400000
},
{
"id": "tcpr_xyz788",
"status": "up",
"responseTimeMs": 38,
"errorMessage": null,
"checkedAt": 1771070340000
},
{
"id": "tcpr_xyz787",
"status": "down",
"responseTimeMs": null,
"errorMessage": "Connection refused",
"checkedAt": 1771070280000
}
]
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z",
"pagination": {
"next": "eyJkIjoiYWZ0ZXIi",
"prev": null,
"perPage": 10
}
}
}