Skip to content
Get Started

V2

V2Totp

Store and retrieve TOTP codes for agent 2FA (authenticator app replacement)

Get current TOTP code
GET/api/v2/totp/code/{secret_id}
ModelsExpand Collapse
TotpGetCodeResponse object { code, expires_in, status }
code: optional string

The current TOTP code

expires_in: optional number

Seconds until this code rotates

status: optional string

V2TotpSecrets

Store and retrieve TOTP codes for agent 2FA (authenticator app replacement)

Register a TOTP secret
POST/api/v2/totp/secrets
List TOTP secrets
GET/api/v2/totp/secrets
Delete a TOTP secret
DELETE/api/v2/totp/secrets/{secret_id}
ModelsExpand Collapse
SecretCreateResponse object { status, totp_secret }
status: optional string
totp_secret: optional object { id, algorithm, created_at, 5 more }
id: optional string

Unique identifier for this TOTP secret

formatuuid
algorithm: optional "SHA1" or "SHA256" or "SHA512"

Hash algorithm used

One of the following:
"SHA1"
"SHA256"
"SHA512"
created_at: optional string
digits: optional number

Code length (6 or 8)

issuer: optional string

Service name

label: optional string

Human-readable label

period: optional number

Rotation period in seconds

secret: optional string

Base32 secret — only returned on creation, never on list/get

SecretListResponse object { status, totp_secrets }
status: optional string
totp_secrets: optional array of object { id, algorithm, created_at, 5 more }
id: optional string

Unique identifier for this TOTP secret

formatuuid
algorithm: optional "SHA1" or "SHA256" or "SHA512"

Hash algorithm used

One of the following:
"SHA1"
"SHA256"
"SHA512"
created_at: optional string
digits: optional number

Code length (6 or 8)

issuer: optional string

Service name

label: optional string

Human-readable label

period: optional number

Rotation period in seconds

secret: optional string

Base32 secret — only returned on creation, never on list/get

SecretDeleteResponse object { status }
status: optional string

V2Seats

Operations for retrieving seats (users) on the account, used for attribution via seat_id

List seats
GET/api/v2/seats
Get seat count
GET/api/v2/seats/count
Get a seat
GET/api/v2/seats/{seat_id}
ModelsExpand Collapse
SeatListResponse = array of object { account, created_at, email, 4 more }
account: optional string

Account name the seat belongs to

created_at: optional string

When the seat was created

formatdate-time
email: optional string

Email address of the seat user

formatemail
first_name: optional string

First name

forwarding_number: optional string

Optional phone number used to forward calls

last_name: optional string

Last name

seat_id: optional string

Primary identifier for the seat. Pass this on the send endpoints’ seat_id parameter.

formatuuid
SeatCountResponse object { count }
count: optional number
SeatRetrieveResponse object { seat, status }
seat: optional object { account, created_at, email, 4 more }
account: optional string

Account name the seat belongs to

created_at: optional string

When the seat was created

formatdate-time
email: optional string

Email address of the seat user

formatemail
first_name: optional string

First name

forwarding_number: optional string

Optional phone number used to forward calls

last_name: optional string

Last name

seat_id: optional string

Primary identifier for the seat. Pass this on the send endpoints’ seat_id parameter.

formatuuid
status: optional string

V2Groups

Operations for group messaging (beta)

Get group membership
GET/api/v2/groups/{group_id}
ModelsExpand Collapse
GroupRetrieveResponse object { data, status }
data: optional object { created_at, group_id, group_name, 6 more }
created_at: optional string
group_id: optional string
group_name: optional string
latest_comm_at: optional string
latest_message_id: optional string
participant_numbers: optional array of string

Convenience list of resolved participant phone numbers. Participants with email-only handles remain in participants but are omitted here.

participants: optional array of object { contact_id, handle, name, 4 more }
contact_id: optional string

Contact ID when this participant is linked to a contact

handle: optional string

Raw participant handle, usually an E.164 phone number but sometimes an iMessage email handle

name: optional string

Contact or seat display name when available

participant_id: optional string

Unique participant row identifier

phone: optional string

Resolved participant phone number, preferring the stored group phone handle and falling back to contact phone. Email handles remain available in handle.

seat_id: optional string

Seat ID when this participant is a team member

type: optional "contact" or "seat"

Participant kind

One of the following:
"contact"
"seat"
updated_at: optional string
worker_group_id: optional string

Worker-local iMessage group identifier when known

status: optional string

V2GroupsVerify

V2GroupsVerifyServices

V2GroupsVerifyServicesVerifications

Sendblue Verify issuance and recovery state

Create a verification
POST/api/v2/verify/services/{service_sid}/verifications
Retrieve a verification
GET/api/v2/verify/services/{service_sid}/verifications/{verification_sid}
ModelsExpand Collapse
VerificationCreateResponse object { account_sid, channel, date_created, 9 more }
account_sid: string
channel: "imessage"
date_created: string
date_updated: string
expires_at: string

ISO timestamp when the Verification expires.

formatdate-time
service_sid: string
sid: string
status: "pending" or "approved" or "expired" or "canceled"
One of the following:
"pending"
"approved"
"expired"
"canceled"
to: string

Expected sender in E.164 format; older durable terminal records may return null.

url: string
delivery_target: optional DeliveryTarget { code, pool_number, sms_deep_link }

Present while the Verification is pending.

code: string

Code the expected sender must text to pool_number.

minLength4
maxLength8
pool_number: string

Sendblue phone number that should receive the verification code.

Messages/SMS deep link with the destination and code prefilled.

hosted: optional HostedVerification { component_script, expires_at, session_id, url }

Present only when hosted options were supplied during creation.

component_script: string

Web-component script URL. Load this value exactly as returned.

formaturi
expires_at: string

ISO timestamp when the Verification expires.

formatdate-time
session_id: string

Hosted widget session identifier.

url: string

Origin-bound widget URL containing a one-session bearer token in its fragment. Do not log, persist, or move the token into a query parameter.

formaturi
VerificationRetrieveResponse object { account_sid, channel, date_created, 8 more }
account_sid: string
channel: "imessage"
date_created: string
date_updated: string
expires_at: string

ISO timestamp when the Verification expires.

formatdate-time
service_sid: string
sid: string
status: "pending" or "approved" or "expired" or "canceled"
One of the following:
"pending"
"approved"
"expired"
"canceled"
to: string

Expected sender in E.164 format; older durable terminal records may return null.

url: string
delivery_target: optional DeliveryTarget { code, pool_number, sms_deep_link }

Present while the Verification is pending.

code: string

Code the expected sender must text to pool_number.

minLength4
maxLength8
pool_number: string

Sendblue phone number that should receive the verification code.

Messages/SMS deep link with the destination and code prefilled.