# Create a monitor

`POST /service/@id/uptime/monitors` · Tino Uptime, service owner's sign-in token

JSON body: name, interval, probe locations and `settings` for the [monitor type](/en/docs/uptime-start#monitor-types). Tino Uptime runs the first check right away and waits up to 10 seconds: the result is in `first_check` (`status: pending` past that). A heartbeat monitor's `settings.ping_url` appears only in this answer. HTTP 201. Over a plan limit (monitor count, interval, location) answers 403 `entitlement_exceeded`; an internal or unsafe target answers 422 `validation_failed` (`details.reason: blocked_destination`); a target checked too often answers 422 `target_rate_exceeded`.

## HTTP request

| Item | Value |
| --- | --- |
| URL | `https://api.tino.vn/service/@id/uptime/monitors` |
| Method | `POST` |
| Authentication | the Tino Uptime service owner's sign-in token (`Authorization: Bearer <token>`); the `/v1` gateway does not expose Tino Uptime yet |
| Content-Type | `application/json` |

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | int | yes | Tino Uptime service ID |
| `name` | body | string | yes | Monitor name, 1–200 characters |
| `interval_s` | body | int | yes | Check interval in seconds, 30–86400, not below the plan's `limits.min_interval_s` |
| `locations` | body | array | no | Probe locations, up to 10, within the plan's `limits.locations` (`vn-cmc`, `vn-vt`, `intl`) |
| `settings` | body | object | yes | Check type and target: `type` is `http`, `keyword`, `ssl`, `domain`, `ping`, `tcp`, `dns` or `heartbeat`, fields per type in [Getting started with Tino Uptime](/en/docs/uptime-start#monitor-types) |
| `international_critical` | body | boolean | no | `true`: a failure seen only by the international probe also counts as down; default `false` |
| `idempotency_key` | body | string | no | 8–128 characters `A-Za-z0-9._:-`: resending the same key and body creates nothing new |

## Example request

```bash
curl -X POST "https://api.tino.vn/service/100002/uptime/monitors" \
  -H "Authorization: Bearer $TINO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Website chính",
  "interval_s": 60,
  "locations": [
    "vn-cmc",
    "vn-vt",
    "intl"
  ],
  "settings": {
    "type": "http",
    "url": "https://example.com/",
    "expected_status": [
      200
    ]
  },
  "idempotency_key": "website-chinh-0001"
}'
```

`$TINO_TOKEN` is the Tino Uptime service owner's sign-in token. Path parameters in the example are sample values.

SDK ([SDK & examples](/en/docs/sdk)): no dedicated function yet, use `client.request("POST", "/service/@id/uptime/monitors")`.

## Example response

```json
{
 "data": {
  "id": "3f6c2a10-8b1e-4c5d-9a7f-2e4b6c8d0a11",
  "name": "Website chính",
  "interval_s": 60,
  "locations": [
   "vn-cmc",
   "vn-vt",
   "intl"
  ],
  "enabled": true,
  "paused_until": null,
  "snoozed_until": null,
  "disabled_reason": null,
  "verified": true,
  "created_at": "2026-10-24T08:00:00+07:00",
  "settings": {
   "type": "http",
   "url": "https://example.com/",
   "method": "GET",
   "expected_status": [
    200
   ],
   "follow_redirects": true,
   "header_names": [],
   "basic_auth_set": false,
   "body_set": false
  },
  "international_critical": false,
  "state": "pending",
  "state_since": null,
  "last_check_at": null,
  "last_latency_ms": null,
  "last_error_kind": null,
  "current_incident_id": null,
  "ssl_expires_at": null,
  "domain_expires_at": null,
  "uptime_30d": null,
  "first_check": {
   "status": "done",
   "outcome": "ok",
   "latency_ms": 182,
   "status_code": 200,
   "error_kind": null,
   "location": "vn-cmc",
   "reason": null
  }
 }
}
```

Sample built from the Tino Uptime OpenAPI (Tino relays the answer as is inside `data`); values are examples.
