ByteVerseDevelopers
Get API keys

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.

  1. 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 a bv_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.
  2. Check that your key worksEvery request needs your key in the Authorization header.
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
}
  1. 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.

  1. Create a campaignWith a test key this uses your 5,000,000 NGN of play money. The Idempotency-Key header 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
}
  1. 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);
  1. 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);
  1. 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.