API Reference v2

WhatsApp API
Documentation

Everything you need to integrate WhatsApp messaging into your application. Simple REST endpoints, multiple SDKs, and copy-paste examples.

5+
Languages
10+
Endpoints
99%
Uptime

Overview

The Onyx WhatsApp API lets you send and receive WhatsApp messages programmatically using a simple HTTP REST interface. You can send text, images, PDFs, documents and more — to individuals or groups — from any programming language or platform.

The API uses an unofficial WhatsApp connection tied to your own WhatsApp number via a QR scan. Your messages are delivered directly from your number.

Base URL for all API requests: https://onyxberry.com/services/wapi/Api2

Important: This is an unofficial WhatsApp solution. Sending unsolicited bulk messages can risk your number being blocked. Always use random delays between messages, target genuine contacts, and read our Terms and WhatsApp's Terms of Service. We are not responsible for any bans or service interruptions.


2 Setup & Connection

Before making any API calls, you need to connect your WhatsApp number to our cloud service.

1
Create Account
Sign up or login to get your Client ID and API Key from the dashboard.
2
Start Cloud Service
In your dashboard, go to Cloud Service tab and start the service to generate a QR code.
3
Scan QR Code
Open WhatsApp on your phone → Linked Devices → Link a Device → Scan the QR code.
4
Start Sending
Once connected, use your Client ID and API Key in the API calls below to start sending messages.

Authentication

Every API request requires your Client ID and API Key, passed as URL path segments. You can find these in the API tab of your dashboard after login.

URL Format
https://onyxberry.com/services/wapi/Api2/{method}/{YOUR_CLIENT_ID}/{YOUR_API_KEY}

Replace {YOUR_CLIENT_ID} and {YOUR_API_KEY} with the values from your dashboard API tab.


Send Text Message

Send a plain text message to any WhatsApp number. The number must include the country code with + prefix.

POST /Api2/sendText/{client_id}/{api_key}
Parameters
ParameterTypeRequiredDescription
numberstringRequiredRecipient's WhatsApp number with country code, e.g. +971566599829
messagestringRequiredText content. Supports WhatsApp formatting: *bold*, ~strikethrough~, ```monospace```
PHP
cURL
Node.js
Python
PHP
include('WhatsappAPI.php');
$wp = new WhatsappAPI("YOUR_CLIENT_ID", "YOUR_API_KEY");

$result = $wp->sendText('+971566599829', 'Hello! This is sent via Onyx API 👋');
$data = json_decode($result);
print_r($data);
cURL
curl -X POST \
  "https://onyxberry.com/services/wapi/Api2/sendText/YOUR_ID/YOUR_KEY" \
  -d "number=+971566599829" \
  -d "message=Hello from Onyx API!"
Node.js
const onxy = new OnxyMessaging('YOUR_ID', 'YOUR_KEY');
onxy.sendSimpleTextMessage('+971566599829', 'Hello! 👋')
  .then(res => console.log(res));
Python
result = wp.send_simple_text_message('+971566599829', 'Hello! 👋')
print(result)
Response
✅ Success
{ "status": 200, "message": "WhatsApp chat has been queued for sending!", "data": false }
❌ Error Examples
{ "status": 400, "message": "Invalid phone number!" }
{ "status": "error", "response": "Invalid Credentials" }
{ "status": 500, "error": "WhatsApp account doesn't exist!" }

Send Bulk Messages

Queue up to 100 messages in a single API call. Each message is delivered asynchronously through the same queue as single messages — your configured random delay (set in Dashboard → Random Delay Settings) is applied between every send to keep your WhatsApp account safe.

Account Ban Risk — Read Before Using
  • Only message contacts who have opted in to receive WhatsApp messages from you.
  • Keep your delay set to at least 5–15 seconds between messages.
  • Avoid sending identical message bodies to all recipients — personalise where possible.
  • Do not exceed 200 unique contacts per day on a new or low-trust WhatsApp number.
  • OnyxBerry is not responsible for WhatsApp account bans. See WhatsApp Business Policy.
POST /Api2/sendBulk/{client_id}/{api_key}
Request Body (JSON)
FieldTypeRequiredDescription
messagesarrayRequiredArray of message objects. Each must have number and message. Max 100 items.
messages[].numberstringRequiredPhone number with country code and + prefix (e.g. +971566599829). The + is stripped automatically server-side.
messages[].messagestringRequiredMessage text. Max 4096 characters.
PHP
cURL
Python
Node.js
PHP
$client_id = "YOUR_CLIENT_ID";
$api_key   = "YOUR_API_KEY";
$url       = "https://onyxberry.com/services/wapi/Api2/sendBulk/{$client_id}/{$api_key}";

$messages = [
    ['number' => '+971566599829', 'message' => 'Hi Ahmed! Your invoice #1001 is ready.'],
    ['number' => '+971501234567', 'message' => 'Hi Sara! Your order has been shipped.'],
    ['number' => '+971509876543', 'message' => 'Hi Khalid! Your appointment is confirmed.'],
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['messages' => $messages]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

echo "Queued: " . $response['queued'] . " messages\n";
echo "Batch ID: " . $response['batch_id'] . "\n";
echo "ETA: " . $response['estimated_completion']['min_seconds'] . "–" . $response['estimated_completion']['max_seconds'] . "s\n";
cURL
curl -X POST \
  "https://onyxberry.com/services/wapi/Api2/sendBulk/YOUR_ID/YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      { "number": "+971566599829", "message": "Hi Ahmed! Your invoice #1001 is ready." },
      { "number": "+971501234567", "message": "Hi Sara! Your order has been shipped." },
      { "number": "+971509876543", "message": "Hi Khalid! Your appointment is confirmed." }
    ]
  }'
Python
import requests

client_id = "YOUR_CLIENT_ID"
api_key   = "YOUR_API_KEY"
url       = f"https://onyxberry.com/services/wapi/Api2/sendBulk/{client_id}/{api_key}"

messages = [
    {"number": "+971566599829", "message": "Hi Ahmed! Your invoice #1001 is ready."},
    {"number": "+971501234567", "message": "Hi Sara! Your order has been shipped."},
    {"number": "+971509876543", "message": "Hi Khalid! Your appointment is confirmed."},
]

res = requests.post(url, json={"messages": messages})
data = res.json()

print(f"Queued: {data['queued']} messages")
print(f"Batch ID: {data['batch_id']}")
print(f"Skipped: {data['skipped']}")
Node.js
const axios = require('axios');

const messages = [
  { number: '+971566599829', message: 'Hi Ahmed! Your invoice #1001 is ready.' },
  { number: '+971501234567', message: 'Hi Sara! Your order has been shipped.' },
  { number: '+971509876543', message: 'Hi Khalid! Your appointment is confirmed.' },
];

axios.post(
  `https://onyxberry.com/services/wapi/Api2/sendBulk/YOUR_ID/YOUR_KEY`,
  { messages }
).then(res => {
  console.log(`Queued: ${res.data.queued}`);
  console.log(`Batch: ${res.data.batch_id}`);
  console.log(`ETA: ${res.data.estimated_completion.min_seconds}–${res.data.estimated_completion.max_seconds}s`);
});
Example Response
JSON
{
  "status": "success",
  "response": "3 message(s) queued successfully.",
  "batch_id": "a3f2c1d0-4e5b-4f6a-8b9c-0d1e2f3a4b5c",
  "queued": 3,
  "skipped": [],
  "credits_remaining": 4997,
  "estimated_completion": {
    "min_seconds": 15,
    "max_seconds": 45,
    "note": "Actual delivery time depends on your configured message delay (5–15s). Adjust in Dashboard → Settings."
  },
  "warning": "IMPORTANT: Sending bulk messages carries a risk of WhatsApp account suspension...",
  "anti_ban_notice": {
    "delay_applied": "A random 5–15s delay is enforced between each message by the delivery engine.",
    "duplicate_filtering": "Duplicate phone numbers within this batch were automatically removed.",
    "queue_based": "Messages are delivered asynchronously — your account is never flooded.",
    "recommendation": "For large campaigns (200+ contacts), split into daily batches.",
    "onyxberry_liability": "OnyxBerry is not responsible for WhatsApp account bans."
  }
}
Limits & Safeguards
RuleLimitPurpose
Max messages per call100Prevents memory overload and request timeouts
Bulk calls per minute5Prevents rapid-fire campaign relaunching
Inter-message delayYour delay_from–delay_to settingMimics human typing speed to avoid WhatsApp spam detection
Duplicate numbersAuto-removedPrevents double-messaging same contact
Async queueMax 5,000 queuedQueue returns 429 if full — retry later
Message age drop6 hoursStale messages are dropped to avoid delivering outdated content

Send Media (PDF, Image, File)

Send any media file from a publicly accessible URL. Supports images, PDFs, Word docs, Excel files, videos and more. Maximum file size: 10MB.

POST /Api2/sendFromURL/{client_id}/{api_key}
Parameters
ParameterTypeRequiredDescription
numberstringRequiredRecipient WhatsApp number with country code
urlstringRequiredDirect public URL to the file (e.g. https://example.com/invoice.pdf)
captionstringOptionalText caption to accompany the file
cURL Example
curl -X POST \
  "https://onyxberry.com/services/wapi/Api2/sendFromURL/YOUR_ID/YOUR_KEY" \
  -d "number=+971566599829" \
  -d "url=https://example.com/invoice.pdf" \
  -d "caption=Your November Invoice 📄"

Send Text to Group

Send a text message to a WhatsApp group. Use the group's internal ID (e.g. [email protected]). Contact support to get your group IDs.

POST /Api2/sendTextInGroup/{client_id}/{api_key}
ParameterTypeRequiredDescription
groupNamestringRequiredWhatsApp Group ID (e.g. [email protected])
messagestringRequiredText message to send to the group

Send Media to Group

POST /Api2/sendFromURLInGroup/{client_id}/{api_key}
ParameterTypeRequiredDescription
groupNamestringRequiredWhatsApp Group ID
urlstringRequiredPublic URL of the file to send
captionstringOptionalCaption for the file

Check WhatsApp Registration

Verify whether a phone number is registered on WhatsApp before sending messages to it.

POST /Api2/isRegisteredUser/{client_id}/{api_key}
ParameterTypeRequiredDescription
numberstringRequiredPhone number with country code to check

Get Received Chats

Retrieve incoming WhatsApp messages received on your connected number — paginated, newest first. Use this to build chatbots, support inboxes, or trigger your own backend workflows.

You can also view received chats directly from the Bot & Actions page in your dashboard — no API call needed. Auto-reply rules are configured there too.

GET https://onyxberry.com/services/wapi/Api2/getReceivedChats?user_id=...&api_key=...

Query Parameters

ParameterTypeRequiredDescription
user_idstringYesYour API User ID
api_keystringYesYour API Key
pageintegerNoPage number (default: 1)
limitintegerNoResults per page (default: 20, max: 50)

Code Examples

PHP
cURL
Python
Node.js
PHP
$url = "https://onyxberry.com/services/wapi/Api2/getReceivedChats?user_id=YOUR_USER_ID&api_key=YOUR_API_KEY&page=1&limit=20";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
foreach ($data['data'] as $chat) {
    echo $chat['account'] . ' said: ' . $chat['message'] . PHP_EOL;
}
cURL
curl -X GET "https://onyxberry.com/services/wapi/Api2/getReceivedChats?user_id=YOUR_USER_ID&api_key=YOUR_API_KEY&page=1&limit=20"
Python
import requests

r = requests.get('https://onyxberry.com/services/wapi/Api2/getReceivedChats', params={
    'user_id': 'YOUR_USER_ID',
    'api_key': 'YOUR_API_KEY',
    'page':    1,
    'limit':   20,
})
for chat in r.json()['data']:
    print(chat['account'], 'said:', chat['message'])
Node.js
const axios = require('axios');

axios.get('https://onyxberry.com/services/wapi/Api2/getReceivedChats', {
    params: { user_id: 'YOUR_USER_ID', api_key: 'YOUR_API_KEY', page: 1, limit: 20 }
}).then(res => {
    res.data.data.forEach(c => console.log(c.account, 'said:', c.message));
});

Example Response

200 OK
{
  "status": 200,
  "message": "Received WhatsApp Chats",
  "data": [
    {
      "id": 301,
      "account":   "+447380294906",
      "recipient": "+639760713666",
      "message":   "Hello, I need help!",
      "attachment": null,
      "created":   1711234567
    }
  ]
}

Response Fields

FieldDescription
accountThe sender's WhatsApp number (who sent the message to you)
recipientYour connected WhatsApp number that received the message
messageThe text content of the received message
attachmentURL of any media attachment, or null
createdUnix timestamp of when the message was received


Video Tutorials

Watch these walkthroughs to get started quickly with the Onyx WhatsApp API.


Response Codes

Code Meaning Response
200SuccessMessage queued for sending
400Bad RequestInvalid phone number or missing parameters
401UnauthorizedInvalid Client ID or API Key
402Insufficient CreditsAccount has no remaining message credits
500Server ErrorWhatsApp not connected or server error

Best Practices

⏱️
Use Random Delays
When sending bulk messages, configure a random delay (e.g. 5–30 seconds) between each message. This mimics human behavior and reduces ban risk.
👥
Send to Known Contacts
Only message people who have consented to receive messages from you. Cold outreach to random numbers will get your account banned quickly.
🔄
Encourage Replies
Messages that get replies are seen as legitimate by WhatsApp. Ask recipients to respond — even a simple "received" helps protect your number.
📋
Read the Terms
This is an unofficial solution. Read our terms and WhatsApp's ToS before going live.

Get Your WhatsApp Groups

Returns a list of all WhatsApp groups your connected number is a member of, including the Group ID (gid) you need to send group messages via the API.

Dashboard shortcut: You no longer need to contact support to get your Group IDs. While your WhatsApp is connected, go to Messages in your dashboard and click "My WA Groups" in the left sidebar. You can search, view all groups, and copy any Group ID with one click.

GET https://onyxberry.com/services/wapi/Api2/getGroups

Query Parameters

ParameterTypeRequiredDescription
user_idstringYesYour API User ID (found in dashboard → Account Information)
api_keystringYesYour API Key

Code Examples

PHP
cURL
Python
Node.js
<?php
$user_id = 'YOUR_USER_ID';
$api_key = 'YOUR_API_KEY';

$url = "https://onyxberry.com/services/wapi/Api2/getGroups?user_id=$user_id&api_key=$api_key";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($http_code === 200) {
    $data = json_decode($response, true);
    foreach ($data['data'] as $group) {
        echo $group['name'] . ' → ' . $group['gid'] . PHP_EOL;
    }
}
curl -X GET "https://onyxberry.com/services/wapi/Api2/getGroups?user_id=YOUR_USER_ID&api_key=YOUR_API_KEY"
import requests

params = {
    'user_id': 'YOUR_USER_ID',
    'api_key': 'YOUR_API_KEY',
}

r = requests.get('https://onyxberry.com/services/wapi/Api2/getGroups', params=params)
if r.status_code == 200:
    for group in r.json()['data']:
        print(group['name'], '→', group['gid'])
const axios = require('axios');

axios.get('https://onyxberry.com/services/wapi/Api2/getGroups', {
    params: { user_id: 'YOUR_USER_ID', api_key: 'YOUR_API_KEY' }
}).then(res => {
    res.data.data.forEach(g => console.log(g.name, '->', g.gid));
});

Example Response

{
  "status": 200,
  "message": "WhatsApp Groups",
  "data": [
    { "gid": "[email protected]", "name": "My Test Group" },
    { "gid": "[email protected]", "name": "Family Group" },
    { "gid": "[email protected]", "name": "Support Team" }
  ]
}

Using the Group ID to Send a Message

Copy the gid value and pass it as the recipient in the Group Text or Group Media endpoints:

{
  "user_id":  "YOUR_USER_ID",
  "api_key":  "YOUR_API_KEY",
  "send_to":  "[email protected]",   // ← paste gid here
  "body":     "Hello everyone! 👋"
}
Important Notes
  • Your WhatsApp must be connected on the Cloud Service page before fetching groups.
  • Only groups your registered number is a member of will appear.
  • Group IDs (@g.us suffix) are stable — they don't change unless the group is deleted and recreated.
  • You can also get your Group IDs from the Messages page in your dashboard — no API call needed.

Auto-Reply Bot

The Auto-Reply Bot lets you automatically respond to incoming WhatsApp messages based on keyword rules. When a message matches your configured keywords, the bot instantly sends a reply — with text, image, or document — without any code on your side.

This feature requires the Auto-Reply Bot Add-on and an active connected WhatsApp session. Configure your rules from Dashboard → Auto-Reply Bot.

How It Works

1. Message Arrives
Someone sends a message to your connected WhatsApp number.
2. Keyword Check
The system checks if the message matches any of your configured rules.
3. Auto Reply Sent
A reply is sent automatically from your number back to the sender.

Match Types

Match TypeDescriptionExample
ContainsMessage contains the keyword anywherekeyword: hello → matches "hello there"
Exact (Case Insensitive)Full message equals keyword, any casekeyword: hi → matches "HI" or "hi"
Exact (Case Sensitive)Full message must match exactlykeyword: Hi → only matches "Hi"
RegexMessage matches a regular expressionpattern: order\s*#\d+
None (Always Reply)Replies to every incoming message

Reply Shortcodes

You can use these shortcodes inside your reply message text — they are replaced with live values at the time of sending:

ShortcodeReplaced With
{{phone}}Sender's phone number
{{message}}The original message text that triggered the reply
{{date.now}}Current date (e.g. 2026-03-04)
{{date.time}}Current time (e.g. 14:32:10)

Reply Message Types

Text
Plain text reply with optional shortcodes.
Media
Image or video from a public URL. Supports jpg, png, gif, mp4, mp3, ogg.
Document
PDF, Word, or Excel from a public URL. Supports pdf, doc, docx, xls, xlsx.

Auto-replies only fire when your WhatsApp is connected and live. If your session disconnects, rules will stop working until you reconnect from the Cloud page.


Critical Reading

WhatsApp Account Safety
& Ban Prevention Guide

WhatsApp actively monitors for automated or bulk messaging behaviour. Understanding what triggers bans — and how to avoid them — is essential before going live with any campaign or integration.

How WhatsApp Detects Abuse

WhatsApp uses a combination of AI-based pattern detection, user reports, and device/account signals to identify abusive senders. The key signals they watch for:

Message Velocity
Sending many messages in a very short time triggers automated spam detection. Even 10 messages in 10 seconds is enough to raise flags.
🔁
Identical Messages
Sending the exact same text to many different numbers is a strong spam signal. WhatsApp fingerprints message content across the network.
🚫
Block & Report Rate
When recipients block or report "spam" on your messages, it directly harms your account trust score. Even a few reports can trigger a ban.
📱
New Account / Number
Newly registered numbers have very low trust scores. Sending bulk messages on a fresh number (less than 30 days old) is extremely high risk.
🤖
Automation Patterns
Perfectly timed, machine-precise intervals between messages signal automation. Random human-like delays are essential to avoid this detection.
🌐
Unsaved Numbers
Messaging numbers who don't have your contact saved is treated more harshly. The more recipients who have your number saved, the safer your account is.

Message Volume Risk Levels

Use this as a daily volume guide. These are conservative estimates — actual tolerance varies by account age, history, and recipient behaviour.

Account Type Safe Daily Volume Caution Zone High Risk Recommended Delay
Established (2+ years, active) ≤ 300 300–600 600+ 5–15 seconds
Medium (6–24 months) ≤ 150 150–300 300+ 10–25 seconds
New (1–6 months) ≤ 50 50–100 100+ 15–30 seconds
Fresh (< 30 days) ≤ 20 20–40 40+ 30–60 seconds

Safe vs Risky Message Examples

SAFE — Personalised & Contextual
"Hi Ahmed 👋 Your order #ORD-5821 has been confirmed. Expected delivery: Wed 5 Mar. Reply STOP to unsubscribe."
  • Uses recipient's real name
  • References a specific order/context
  • Includes opt-out option
  • Short, clear, relevant
RISKY — Generic & Unsolicited
"Hello! We have a SPECIAL OFFER for you today. Buy now and get 50% OFF everything in our store! Click here: shortlink.com/xyz123"
  • No personalisation — looks like spam blast
  • Promotional language triggers filters
  • External shortlink (suspicious)
  • No opt-out mechanism

Configuring Your Message Delay

Your random delay (set in Dashboard → Settings) is applied between every message by the delivery engine. This is the single most important protection against WhatsApp bans.

Min Delay
1s
Default minimum — too low for bulk campaigns. Increase immediately.
Recommended
5–15s
Good balance of speed and safety for established accounts.
Maximum Safe
30–60s
Slowest but safest. Ideal for new numbers or large campaigns.
The delivery engine picks a random value between your min and max for each message — this randomness is key. Avoid setting both values the same (e.g. 5–5s) as a fixed interval is easy for WhatsApp to detect.

10 Rules to Keep Your Account Safe

1 Only message opted-in contacts
Every recipient must have explicitly agreed to receive WhatsApp messages from you. This is the #1 protection against reports.
2 Use random delays (never fixed)
Set your delay_from and delay_to to different values (e.g. 8–20s). A random interval mimics human behaviour. Fixed intervals scream automation.
3 Personalise every message
Include the recipient's name, order number, or any piece of context unique to them. Even one personalised word dramatically reduces the "spam blast" fingerprint.
4 Warm up new numbers gradually
Start with ≤20 messages/day for the first 2 weeks. Increase by ~20% weekly. Never go from 0 to 100 messages on day one.
5 Never use URL shorteners
Links like bit.ly, shortlink.io, etc. are heavily associated with spam. Use full, recognisable domain URLs instead.
6 Encourage replies
Ask recipients to reply — even "OK" or "received" is enough. High reply rates signal that your messages are wanted.
7 Vary your message templates
Sending the same text to 100 people is a strong spam signal. Rotate phrasing, add personalisation fields, and split large lists across different templates.
8 Verify numbers before sending
Use the /Api2/isRegisteredUser endpoint to check if a number is on WhatsApp before sending. Sending to unregistered numbers wastes credits and increases error rates.
9 Respect time zones
Sending messages at 2am in the recipient's timezone is likely to get your number blocked. Schedule messages during business hours.
10 Read WhatsApp's Business Policy
Stay informed about what WhatsApp allows. Policy violations — even unintentional — can lead to permanent bans with no appeal.

If Your Account Gets Banned

First — OnyxBerry is not responsible for WhatsApp account bans (see Terms & Conditions). However, here's what you can try:

Step 1: Request a Review
Open WhatsApp on your phone. If your account shows a ban notice, tap "Request a Review". WhatsApp sometimes lifts temporary bans within 24–72 hours.
Step 2: Stop All Sending
Go to your Dashboard → WhatsApp Control and stop the service immediately. Do not attempt to send more messages while the account is under review.
Step 3: Audit Your Campaign
Review your message history in Dashboard → Messages. Identify what triggered the ban — volume, content, recipient list, or timing — and fix it before resuming.
Step 4: Consider a New Number
If the ban is permanent, you'll need a new WhatsApp number. Update your registered phone in your OnyxBerry profile, reconnect via QR, and start a careful warm-up period.

Built-in Protections in Onyx API

Onyx API includes several automatic safeguards — but they are not a substitute for responsible usage:

Random Delay
Per-user configurable min–max delay applied between every send
Duplicate Filtering
Same message ID cannot be sent twice (in-memory dedup)
Async Queue
FIFO queue — messages never sent simultaneously regardless of batch size
6-Hour TTL
Stale queued messages are dropped automatically to avoid delivering outdated content
Rate Limiting
60 API calls/min (single) and 5 calls/min (bulk) enforced at the API level
Disconnect Alerts
Automatic WhatsApp notification if your account disconnects (24h cooldown)
Liability Disclaimer
OnyxBerry provides the API infrastructure and built-in protections described above. However, OnyxBerry is not responsible for WhatsApp account bans, restrictions, or data loss resulting from your use of the API. It is your responsibility to send messages responsibly, comply with WhatsApp's Business Policy, and follow the guidelines in this document. By using Onyx API you accept these terms — see our full Terms & Conditions.

Ready to start sending?

Create your free account and get your API keys in under a minute.