.ton domain, gift, any NFT) is watched for its sale and auction, any other address forPoll: read them with a cursor. No server needed. Every event is there for 7 days.webhook_url and apiton POSTs each event to your HTTPS endpoint, signed.Authorization: Bearer <tg_id>:<secret>. Without one the answer isunauthenticated. Each RPC costs one request of your plan; webhook deliveries cost none.not_found. While the service is off on the server, every RPCunavailable.| Plan | Watches | Each address read every | Webhook pushes per hour |
|---|---|---|---|
| free, premium | 3 | 180 s | 10 |
| builder, pro | 30 | 30 s | 100 |
Poll and the hourly cap are per key; the cap is per clock hour (UTC) and applies tocapped.paused: true in List): they are notDelete frees a place at once.| Field | Type | Notes |
|---|---|---|
address | string | any form (raw 0:…, EQ…, UQ…); mainnet only; no .ton names |
webhook_url | string | optional; see the rules below |
min_amount | number | optional, wallet watches, ≥ 0; default 1 |
curl -X POST https://app.apiton.org/v2.Watch/Create \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer 123456789:aB3dE…' \
-d '{"address":"UQCdqXGvONLwOr3zCNX5FjapflorB6ZsOdcdfLrjsDLt3AF4","webhook_url":"https://example.com/apiton","min_amount":1}'
# {"watch":{"id":"41","address":"UQCdqX…","kind":"wallet","name":"UQCdqX…3AF4","min_amount":1,
# "poll_interval_seconds":180,"created_at":"2026-11-02T12:00:00Z",
# "webhook":{"url":"https://example.com/apiton","state":"active"}},
# "webhook_secret":"whsec_9f2c…","created":true}webhook_secret is shown once, in this answer. Keep it: it signs your deliveries. It belongscreated: false, no secret. To change a webhook_url or min_amount, Delete and CreateCreate raises nothing: the watch starts from the state it finds.webhook_url must be https, on port 443 or 8443, on a public host, without user:password, upCreate and again at every delivery, and the connection goesunauthenticated no key · invalid_argument bad address, testnet address, or a refusedwebhook_url (the message says why) · resource_exhausted the plan's watch limit, with what thefailed_precondition a field out of its bounds, or the item was taken down ·unavailable the chain read failed or the service is off: retry.POST with Content-Type: application/json and:| Header | Value |
|---|---|
X-Apiton-Signature | sha256= + hex HMAC-SHA256 of <timestamp>.<body>, keyed with webhook_secret |
X-Apiton-Timestamp | Unix seconds of this attempt |
X-Apiton-Event-Id | the event's id |
id: remember the ids you have processed and drop a repeat. Events of one watch go out inpaused: its queue is dropped, new events go to Poll only, and nothingTest. What it missed is in Poll, from your last cursor, for 7 days.List.# body.json: the raw body; $TS: X-Apiton-Timestamp; $SECRET: webhook_secret
printf '%s.' "$TS" | cat - body.json | openssl dgst -sha256 -hmac "$SECRET"
# SHA2-256(stdin)= 43a1ae1376fc… must equal X-Apiton-Signature after "sha256="