Skip to main content

Documentation Index

Fetch the complete documentation index at: https://orbit-docs.devotel.io/llms.txt

Use this file to discover all available pages before exploring further.

Verify API

Send one-time verification codes to users and validate them. Supports delivery via SMS, WhatsApp, and Email. Built-in rate limiting, expiration, and attempt tracking. Base path: /v1/verify

Send Verification

POST /v1/verify/send Generate a verification code and deliver it to the recipient on the specified channel.
to
string
required
Recipient phone number (E.164) or email address
channel
string
required
Delivery channel: sms, whatsapp, email
max_attempts
integer
default:"3"
Maximum number of check attempts before the code is invalidated
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/verify/send" \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
  "to": "+14155552671",
  "channel": "sms",
  "max_attempts": 3
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'

const orbit = new Orbit({
  apiKey: process.env.ORBIT_API_KEY!,
})

const res = await fetch('https://orbit-api.devotel.io/api/v1/verify/send', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.ORBIT_API_KEY!,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "to": "+14155552671",
  "channel": "sms",
  "max_attempts": 3
}),
})
console.log(await res.json())
Python
import os, requests

headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/verify/send", headers=headers, json={
  "to": "+14155552671",
  "channel": "sms",
  "max_attempts": 3
})
print(r.json())
Go
package main

import (
	"bytes"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/verify/send", bytes.NewBuffer([]byte(`{
  "to": "+14155552671",
  "channel": "sms",
  "max_attempts": 3
}`)))
	req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
	req.Header.Set("Content-Type", "application/json")
	http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'

uri = URI('https://orbit-api.devotel.io/api/v1/verify/send')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
  "to": "+14155552671",
  "channel": "sms",
  "max_attempts": 3
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/verify/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'X-API-Key: ' . getenv('ORBIT_API_KEY'),
  'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
  "to": "+14155552671",
  "channel": "sms",
  "max_attempts": 3
}
JSON);
echo curl_exec($ch);
{
  "data": {
    "verification_id": "vrf_abc123",
    "to": "+14155552671",
    "channel": "sms",
    "status": "pending",
    "max_attempts": 3,
    "expires_at": "2026-03-08T12:10:00Z",
    "created_at": "2026-03-08T12:00:00Z"
  },
  "meta": {
    "request_id": "req_vrf_001",
    "timestamp": "2026-03-08T12:00:00Z"
  }
}

Check Verification

POST /v1/verify/check Validate a verification code submitted by the user.
verification_id
string
required
The verification ID returned from the send endpoint
code
string
required
The code entered by the user
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/verify/check" \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
  "verification_id": "vrf_abc123",
  "code": "482910"
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'

const orbit = new Orbit({
  apiKey: process.env.ORBIT_API_KEY!,
})

const res = await fetch('https://orbit-api.devotel.io/api/v1/verify/check', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.ORBIT_API_KEY!,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "verification_id": "vrf_abc123",
  "code": "482910"
}),
})
console.log(await res.json())
Python
import os, requests

headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/verify/check", headers=headers, json={
  "verification_id": "vrf_abc123",
  "code": "482910"
})
print(r.json())
Go
package main

import (
	"bytes"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/verify/check", bytes.NewBuffer([]byte(`{
  "verification_id": "vrf_abc123",
  "code": "482910"
}`)))
	req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
	req.Header.Set("Content-Type", "application/json")
	http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'

uri = URI('https://orbit-api.devotel.io/api/v1/verify/check')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
  "verification_id": "vrf_abc123",
  "code": "482910"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/verify/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'X-API-Key: ' . getenv('ORBIT_API_KEY'),
  'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
  "verification_id": "vrf_abc123",
  "code": "482910"
}
JSON);
echo curl_exec($ch);
{
  "data": {
    "verification_id": "vrf_abc123",
    "status": "approved",
    "attempts_remaining": 2,
    "checked_at": "2026-03-08T12:01:30Z"
  },
  "meta": {
    "request_id": "req_chk_001",
    "timestamp": "2026-03-08T12:01:30Z"
  }
}

Possible Check Statuses

StatusDescription
approvedCode is correct — verification passed
rejectedCode is incorrect — attempts remaining
expiredVerification has expired (default 10 minutes)
maxedMaximum check attempts reached — code is invalidated

List Verifications

GET /v1/verify Retrieve verification records with optional filtering and cursor-based pagination.
cursor
string
Cursor for pagination
limit
integer
default:"20"
Number of results per page (max 100)
status
string
Filter by status: pending, approved, rejected, expired, maxed
channel
string
Filter by delivery channel: sms, whatsapp, email
cURL
curl -X GET "https://orbit-api.devotel.io/api/v1/verify?status=approved&channel=sms&limit=10" \
  -H "X-API-Key: dv_live_sk_your_key_here" 
Node.js
import { Orbit } from '@devotel/orbit-sdk'

const orbit = new Orbit({
  apiKey: process.env.ORBIT_API_KEY!,
})

const res = await fetch('https://orbit-api.devotel.io/api/v1/verify?status=approved&channel=sms&limit=10', {
  method: 'GET',
  headers: {
    'X-API-Key': process.env.ORBIT_API_KEY!,
  },
})
console.log(await res.json())


Python
import os, requests

headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
r = requests.get("https://orbit-api.devotel.io/api/v1/verify?status=approved&channel=sms&limit=10", headers=headers)
print(r.json())
Go
package main

import (
	"bytes"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://orbit-api.devotel.io/api/v1/verify?status=approved&channel=sms&limit=10", nil)
	req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))

	http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'

uri = URI('https://orbit-api.devotel.io/api/v1/verify?status=approved&channel=sms&limit=10')
req = Net::HTTP::Get.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']


res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/verify?status=approved&channel=sms&limit=10');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'X-API-Key: ' . getenv('ORBIT_API_KEY'),

]);

echo curl_exec($ch);
{
  "data": [
    {
      "verification_id": "vrf_abc123",
      "to": "+14155552671",
      "channel": "sms",
      "status": "approved",
      "created_at": "2026-03-08T12:00:00Z",
      "checked_at": "2026-03-08T12:01:30Z"
    }
  ],
  "meta": {
    "request_id": "req_vrf_list",
    "timestamp": "2026-03-08T12:05:00Z",
    "pagination": {
      "cursor": "cur_vrf_abc",
      "has_more": false
    }
  }
}