Verification & messages
Get a verification
Reads the verification with every channel attempt and its cost.
https://watsy.me/v1/verify/{id}curl https://watsy.me/v1/verify/5d3c1f0e-7a1b-4c55-9a7e-2f1d6b0c9e11 \
-H "Authorization: Bearer $WATSY_KEY"{
"id": "5d3c1f0e-7a1b-4c55-9a7e-2f1d6b0c9e11",
"object": "verification",
"mode": "live",
"phone": "+9647701234567",
"status": "verified",
"channel": "telegram",
"channels": [
"whatsapp",
"telegram",
"sms"
],
"attempts": 1,
"max_attempts": 5,
"attempts_remaining": 4,
"locale": "ar",
"metadata": {
"user_id": 8841
},
"expires_at": "2026-10-28T10:05:00.000Z",
"verified_at": "2026-10-28T10:01:12.000Z",
"created_at": "2026-10-28T10:00:00.000Z",
"price_milli": 18000,
"messages": [
{
"id": "0b6f6a3e-1c2d-4e5f-8a9b-1c2d3e4f5a6b",
"object": "message",
"verification_id": "5d3c1f0e-7a1b-4c55-9a7e-2f1d6b0c9e11",
"channel": "whatsapp",
"provider": "meta_cloud",
"status": "failed",
"error_code": "whatsapp_131026",
"price_milli": 0,
"created_at": "2026-10-28T10:00:00.000Z",
"updated_at": "2026-10-28T10:00:01.000Z"
},
{
"id": "7e1d2c3b-4a59-4687-9a0b-c1d2e3f4a5b6",
"object": "message",
"verification_id": "5d3c1f0e-7a1b-4c55-9a7e-2f1d6b0c9e11",
"channel": "telegram",
"provider": "telegram_gateway",
"status": "sent",
"error_code": null,
"price_milli": 18000,
"created_at": "2026-10-28T10:00:01.000Z",
"updated_at": "2026-10-28T10:00:02.000Z"
}
]
}Authorization
Authorizationstring (header)requiredBearerfollowed by your project key:wsy_live_…orwsy_test_….
Headers
X-Request-IdstringOptional, 8 to 64 characters. Echoed back; generated when missing.
Path parameters
idstring (uuid)requiredThe verification id returned by
POST /v1/verify.
Response (200)
application/jsonidstringrequiredVerification id (UUID).
objectstringrequiredAlways
verification.modestringrequiredMode of the key that created it.
Values:
livetestphonestringrequiredThe normalized E.164 number.
statusstringrequiredLifecycle state. See the status table.
Values:
pendingsentverifiedfailedexpiredcanceledchannelstring | nullrequiredThe channel last tried, or the one that delivered.
channelsstring[]requiredThe requested channel chain, in order.
attemptsintegerrequiredChecks made so far.
max_attemptsintegerrequiredCheck limit from the project settings (default 5).
attempts_remainingintegerrequiredChecks left.
localestringrequiredMessage language.
Values:
arenmetadataobjectrequiredYour metadata as sent, or
{}.expires_atstringrequiredWhen the code expires.
verified_atstring | nullrequiredWhen it was verified.
created_atstringrequiredCreation time.
price_milliintegerrequiredNet charge across all attempts, in milli-IQD (1 IQD = 1000).
messagesmessage[]requiredOne entry per channel tried, in order.
Show child fieldsHide child fields
idstringId of this channel attempt.
objectstringAlways
message.verification_idstringThe verification this attempt belongs to.
channelstringChannel.
Values:
whatsapptelegramsmsproviderstringWho carried the attempt:
meta_cloud(Watsy's WhatsApp number),whatsapp_own(your own number),telegram_gateway, ortestin test mode.statusstringdeliveredappears once the provider reports delivery (WhatsApp today).Values:
pendingsentdeliveredfailederror_codestring | nullProvider failure reason, e.g.
whatsapp_131026,telegram_PHONE_NUMBER_INVALIDortimeout.price_milliintegerNet charge of this attempt in milli-IQD. A refunded attempt shows 0.
created_atstringCreation time (ISO 8601, UTC).
updated_atstringLast update.
Statuses
| Status | Meaning |
|---|---|
pending | Being sent |
sent | Code sent, waiting for a check |
verified | Verified |
failed | Every channel failed, or attempts ran out |
expired | Expired before a successful check |
canceled | Canceled by you |
Expired verifications switch to expired when read or by a periodic job, and verification.expired fires. Test keys cannot read live verifications and vice versa (404).