Start
Quickstart
Create your first sandbox campaign and watch it complete in about ten minutes. No real money moves while you use a test key.
- Get your API keysLog in to your ByteVerse business account and open Developers in the dashboard. Create a
bv_test_...key for the sandbox right away, and abv_live_...key when you are ready for production. Each key is shown once. Keep them in environment variables on your server; never ship them in a browser or mobile app. - Check that your key worksEvery request needs your key in the
Authorizationheader.
curl "https://api.byteverseafrica.com/v1/me" \
-H "Authorization: Bearer $BYTEVERSE_API_KEY"const res = await fetch("https://api.byteverseafrica.com/v1/me", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BYTEVERSE_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.byteverseafrica.com/v1/me",
headers={"Authorization": f"Bearer {os.environ['BYTEVERSE_API_KEY']}"},
timeout=30,
)
data = res.json()<?php
$ch = curl_init("https://api.byteverseafrica.com/v1/me");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BYTEVERSE_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);Response
{
"object": "partner",
"id": "7d1c3b52-9e04-4a6f-b1d8-52c0e7a93f16",
"name": "Arewa Threads Ltd",
"environment": "test",
"key": {
"id": "b3f0a7c4-61d2-4e8b-9a35-0c7e41d8f259",
"scopes": [
"catalog:read",
"campaigns:read",
"campaigns:write",
"performance:read",
"wallet:read",
"webhooks:manage",
"submissions:read",
"evidence:read"
]
},
"rate_limit_per_minute": 60
}- Look at pricesThe catalog lists every Growth Action type with its price per verified action. Then ask for an exact quote for your budget before creating anything.
curl -X POST "https://api.byteverseafrica.com/v1/quotes" \
-H "Authorization: Bearer $BYTEVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task_type": "instagram-follow",
"budget": 5000
}'const res = await fetch("https://api.byteverseafrica.com/v1/quotes", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BYTEVERSE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"task_type": "instagram-follow",
"budget": 5000
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.byteverseafrica.com/v1/quotes",
headers={"Authorization": f"Bearer {os.environ['BYTEVERSE_API_KEY']}"},
json={
"task_type": "instagram-follow",
"budget": 5000,
},
timeout=30,
)
data = res.json()<?php
$ch = curl_init("https://api.byteverseafrica.com/v1/quotes");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BYTEVERSE_API_KEY"), "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"task_type" => "instagram-follow",
"budget" => 5000,
]),
]);
$data = json_decode(curl_exec($ch), true);A budget of ₦5,000 on instagram-follow (₦70 per action) buys 71 verified actions. The total charged is the budget plus a 5% service fee: ₦5,250.
- Create a campaignWith a test key this uses your 5,000,000 NGN of play money. The
Idempotency-Keyheader is required so a retry can never charge twice.
curl -X POST "https://api.byteverseafrica.com/v1/campaigns?status=active&limit=10" \
-H "Authorization: Bearer $BYTEVERSE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Sallah Weekend Ankara Sale",
"task_type": "instagram-follow",
"budget": 5000,
"destination_url": "https://instagram.com/arewathreads",
"targeting": {
"locations": [
"Lagos",
"Kano"
],
"gender": "all"
},
"external_reference": "order_10482",
"metadata": {
"order_id": "10482"
}
}'const res = await fetch("https://api.byteverseafrica.com/v1/campaigns?status=active&limit=10", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BYTEVERSE_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Sallah Weekend Ankara Sale",
"task_type": "instagram-follow",
"budget": 5000,
"destination_url": "https://instagram.com/arewathreads",
"targeting": {
"locations": [
"Lagos",
"Kano"
],
"gender": "all"
},
"external_reference": "order_10482",
"metadata": {
"order_id": "10482"
}
}),
});
const data = await res.json();import os, uuid, requests
res = requests.post(
"https://api.byteverseafrica.com/v1/campaigns?status=active&limit=10",
headers={"Authorization": f"Bearer {os.environ['BYTEVERSE_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"name": "Sallah Weekend Ankara Sale",
"task_type": "instagram-follow",
"budget": 5000,
"destination_url": "https://instagram.com/arewathreads",
"targeting": {
"locations": ["Lagos", "Kano"],
"gender": "all",
},
"external_reference": "order_10482",
"metadata": {
"order_id": "10482",
},
},
timeout=30,
)
data = res.json()<?php
$ch = curl_init("https://api.byteverseafrica.com/v1/campaigns?status=active&limit=10");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BYTEVERSE_API_KEY"), "Content-Type: application/json", "Idempotency-Key: " . bin2hex(random_bytes(16))],
CURLOPT_POSTFIELDS => json_encode([
"name" => "Sallah Weekend Ankara Sale",
"task_type" => "instagram-follow",
"budget" => 5000,
"destination_url" => "https://instagram.com/arewathreads",
"targeting" => [
"locations" => ["Lagos", "Kano"],
"gender" => "all",
],
"external_reference" => "order_10482",
"metadata" => [
"order_id" => "10482",
],
]),
]);
$data = json_decode(curl_exec($ch), true);Response (201 Created)
{
"id": "cmp_8f3a1c9d2b7e4f60a5d1",
"object": "campaign",
"environment": "live",
"status": "in_review",
"name": "Sallah Weekend Ankara Sale",
"external_reference": "order_10482",
"metadata": {
"order_id": "10482"
},
"task_type": "instagram-follow",
"task_label": "Instagram Follow",
"destination_url": "https://instagram.com/arewathreads",
"caption": null,
"media_url": null,
"targeting": {
"locations": [
"Lagos",
"Kano"
],
"gender": "all"
},
"price_per_action": 70,
"budget": {
"currency": "NGN",
"amount": 5000,
"service_fee": 250,
"total_charged": 5250,
"spent": 0,
"remaining": 5000
},
"progress": {
"target_actions": 71,
"verified_actions": 0,
"rejected_actions": 0,
"pending_actions": 0,
"completion_percent": 0
},
"tracking_url": "https://business.byteverseafrica.com/campaign-dashboard.html?campaign_id=cmp_8f3a1c9d2b7e4f60a5d1",
"created_at": "2026-10-22T09:14:03Z",
"completed_at": null,
"cancelled_at": null,
"refund_amount": null
}- Simulate resultsIn the sandbox, approve the campaign and add verified actions yourself. In production, real people do this and ByteVerse verifies each action.
curl -X POST "https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate" \
-H "Authorization: Bearer $BYTEVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event": "activate"
}'const res = await fetch("https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BYTEVERSE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"event": "activate"
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate",
headers={"Authorization": f"Bearer {os.environ['BYTEVERSE_API_KEY']}"},
json={
"event": "activate",
},
timeout=30,
)
data = res.json()<?php
$ch = curl_init("https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BYTEVERSE_API_KEY"), "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"event" => "activate",
]),
]);
$data = json_decode(curl_exec($ch), true);curl -X POST "https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate" \
-H "Authorization: Bearer $BYTEVERSE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event": "progress",
"actions": 20
}'const res = await fetch("https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BYTEVERSE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"event": "progress",
"actions": 20
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate",
headers={"Authorization": f"Bearer {os.environ['BYTEVERSE_API_KEY']}"},
json={
"event": "progress",
"actions": 20,
},
timeout=30,
)
data = res.json()<?php
$ch = curl_init("https://api.byteverseafrica.com/v1/sandbox/campaigns/cmp_test_4b7e91d0a2c85f13/simulate");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BYTEVERSE_API_KEY"), "Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"event" => "progress",
"actions" => 20,
]),
]);
$data = json_decode(curl_exec($ch), true);- Read the results
curl "https://api.byteverseafrica.com/v1/campaigns/cmp_8f3a1c9d2b7e4f60a5d1/performance?days=14" \
-H "Authorization: Bearer $BYTEVERSE_API_KEY"const res = await fetch("https://api.byteverseafrica.com/v1/campaigns/cmp_8f3a1c9d2b7e4f60a5d1/performance?days=14", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BYTEVERSE_API_KEY}`,
},
});
const data = await res.json();import os, requests
res = requests.get(
"https://api.byteverseafrica.com/v1/campaigns/cmp_8f3a1c9d2b7e4f60a5d1/performance?days=14",
headers={"Authorization": f"Bearer {os.environ['BYTEVERSE_API_KEY']}"},
timeout=30,
)
data = res.json()<?php
$ch = curl_init("https://api.byteverseafrica.com/v1/campaigns/cmp_8f3a1c9d2b7e4f60a5d1/performance?days=14");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BYTEVERSE_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true);- Listen for eventsInstead of polling, register a webhook endpoint and ByteVerse will call you when the campaign goes live, reaches milestones and completes. See the webhooks guide.
When you are ready for production, follow the going live checklist. The code you wrote against the sandbox works unchanged; you only swap the key.
