Quickstart
Create an account
Sign up — your API key is shown on your dashboard immediately.
Add credit or subscribe
Top up your wallet to pay per call, or choose a monthly or yearly unlimited plan from your dashboard.
Make your first call
Send your key in the X-Api-Key header. Every response is JSON.
Base URL
https://pillvera.com/api/v1/
Your first request
curl -X POST https://pillvera.com/api/v1/verify-product.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "product=A4-1234"<?php
$ch = curl_init('https://pillvera.com/api/v1/verify-product.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['product' => 'A4-1234']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/verify-product.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ product: 'A4-1234' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/verify-product.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'product': 'A4-1234' },
timeout=20,
)
data = r.json()
r.raise_for_status()Authentication
Every request needs your secret API key in the X-Api-Key header (an api_key form/query field is also accepted). Requests may be GET or POST (form-encoded).
X-Api-Key: 3f9c…your 40-character key…a1b2
Pricing & billing
Choose what suits your volume — and switch anytime from your dashboard:
Pay as you go
Prepay your wallet (instant online top-up), then each call is deducted at the price below. No commitment.
All-access plans
Unlimited calls to every endpoint for ₦15,000.00/month or ₦150,000.00/year.
| Endpoint | Price per call | When charged |
|---|---|---|
| verify-product | ₦20.00 | Charged only when a product is found. |
| check-global-alert | ₦20.00 | Charged on every call. |
| drug-info | ₦15.00 | Charged only when a label is found. |
| find-generic | ₦15.00 | Charged on every call. |
| check-interactions | ₦20.00 | Charged on every call. |
| verify-doctor | ₦50.00 | Charged only when a record is found. |
| submit-correction | Free | Never charged |
Every billable response tells you what happened, so you can reconcile in your own system:
| charge | Amount deducted for this call (0 when covered by a plan or not billable) |
| billed_via | wallet or subscription (sandbox in the sandbox) |
| wallet_balance | Your wallet balance after this call |
Errors
Errors return a non-2xx status and {"success": false, "error": "human-readable message"}.
| Status | Meaning | What to do |
|---|---|---|
| 401 | Missing/invalid key, or account not active | Check the header; check your dashboard |
| 402 | Insufficient wallet balance | Top up or subscribe |
| 404 | Endpoint not available | Check the URL |
| 405 | Wrong HTTP method | Use GET or POST |
| 422 | Missing or invalid parameter | Read the error field |
| 429 | Sandbox rate limit reached | Wait, or use your live key |
| 500 | Unexpected server error | Safe to retry with back-off |
Verify a NAFDAC product
₦20.00 / callGET / POSThttps://pillvera.com/api/v1/verify-product.php
Look up a medicine by NAFDAC registration number (preferred) or product name. Returns registration status, manufacturer, whether the manufacturer has verified the listing, and any matching WHO falsified/substandard alerts. Charged only when a product is found.
| Parameter | Type | Description | |
|---|---|---|---|
| product | string | required | NAFDAC number, e.g. A4-1234, or a product name |
Request
curl -X POST https://pillvera.com/api/v1/verify-product.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "product=A4-1234"<?php
$ch = curl_init('https://pillvera.com/api/v1/verify-product.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['product' => 'A4-1234']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/verify-product.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ product: 'A4-1234' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/verify-product.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'product': 'A4-1234' },
timeout=20,
)
data = r.json()
r.raise_for_status()Response
{
"success": true,
"query": "A4-1234",
"found": true,
"nafdac_reg_no": "A4-1234",
"product_name": "Coartem 20/120 Tablets",
"manufacturer": "Novartis",
"category": "drug",
"registry_status": "active",
"registration_expires_at": null,
"last_confirmed_at": "2026-10-27 06:00:00",
"manufacturer_verified": false,
"has_global_alert": false,
"alerts": [],
"disclaimer": "…",
"charge": 20,
"billed_via": "wallet",
"wallet_balance": 4980
}Check WHO recall / fake-drug alerts
₦20.00 / callGET / POSThttps://pillvera.com/api/v1/check-global-alert.php
Match a product against the World Health Organization's published falsified and substandard medical product alerts (synced automatically). Charged on every call.
| Parameter | Type | Description | |
|---|---|---|---|
| product | string | required | Product name or NAFDAC number |
Request
curl -X POST https://pillvera.com/api/v1/check-global-alert.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "product=Darzalex"<?php
$ch = curl_init('https://pillvera.com/api/v1/check-global-alert.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['product' => 'Darzalex']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/check-global-alert.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ product: 'Darzalex' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/check-global-alert.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'product': 'Darzalex' },
timeout=20,
)
data = r.json()
r.raise_for_status()Response
{
"success": true,
"query": "Darzalex",
"matched_in_nafdac_cache": true,
"matched_product_name": "Darzalex (daratumumab) Injection",
"has_global_alert": true,
"alerts": [{
"reference": "N°5/2026",
"type": "falsified",
"title": "Medical Product Alert N°5/2026: Falsified Darzalex",
"published_at": "2026-05-12",
"source_url": "https://www.who.int/news/item/…"
}],
"charge": 0,
"billed_via": "subscription",
"wallet_balance": 4980
}Drug facts: uses & side effects
₦15.00 / callGET / POSThttps://pillvera.com/api/v1/drug-info.php
Uses, side effects, warnings, contraindications, pregnancy/breastfeeding notes and storage, summarised from the official U.S. FDA label. International names (e.g. paracetamol) are mapped automatically. Dosing is intentionally not returned. Charged only when a label is found.
| Parameter | Type | Description | |
|---|---|---|---|
| drug | string | required | Brand or active ingredient, e.g. Paracetamol |
Request
curl -X POST https://pillvera.com/api/v1/drug-info.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "drug=Amoxicillin"<?php
$ch = curl_init('https://pillvera.com/api/v1/drug-info.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['drug' => 'Amoxicillin']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/drug-info.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ drug: 'Amoxicillin' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/drug-info.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'drug': 'Amoxicillin' },
timeout=20,
)
data = r.json()
r.raise_for_status()Response
{
"success": true,
"query": "Amoxicillin",
"found": true,
"facts": {
"generic_name": "Amoxicillin",
"brand_names": ["Amoxil"],
"route": "Oral",
"uses": "Infections of the ear, nose, throat…",
"side_effects": "Nausea, vomiting, diarrhoea, rash…",
"warnings": "Serious allergic reactions…",
"do_not_use": "History of allergy to penicillins…",
"pregnancy": "…",
"storage": "…"
},
"source": "U.S. FDA drug label via openFDA",
"charge": 15,
"billed_via": "wallet",
"wallet_balance": 4965
}Find generic equivalents
₦15.00 / callGET / POSThttps://pillvera.com/api/v1/find-generic.php
Every brand and generic product sharing the same active ingredient (RxNorm). Use it to suggest lower-cost alternatives. Charged on every call.
| Parameter | Type | Description | |
|---|---|---|---|
| drug | string | required | Brand or generic name, e.g. Panadol |
Request
curl -X POST https://pillvera.com/api/v1/find-generic.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "drug=Panadol"<?php
$ch = curl_init('https://pillvera.com/api/v1/find-generic.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['drug' => 'Panadol']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/find-generic.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ drug: 'Panadol' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/find-generic.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'drug': 'Panadol' },
timeout=20,
)
data = r.json()
r.raise_for_status()Response
{
"success": true,
"query": "Panadol",
"found": true,
"ingredient_name": "Acetaminophen",
"equivalents": [
{ "name": "Tylenol", "tty": "BN" },
{ "name": "acetaminophen 500 MG Oral Tablet", "tty": "SCD" }
],
"charge": 15,
"billed_via": "wallet",
"wallet_balance": 4950
}Check a drug interaction
₦20.00 / callGET / POSThttps://pillvera.com/api/v1/check-interactions.php
Cross-references both medicines' official FDA label interaction and warning text for mentions of each other. A reference check, not a scored clinical verdict. Charged on every call.
| Parameter | Type | Description | |
|---|---|---|---|
| drug_a | string | required | First medicine |
| drug_b | string | required | Second medicine |
| tier | string | optional | basic (default) |
Request
curl -X POST https://pillvera.com/api/v1/check-interactions.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "drug_a=Warfarin" -d "drug_b=Aspirin"<?php
$ch = curl_init('https://pillvera.com/api/v1/check-interactions.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['drug_a' => 'Warfarin', 'drug_b' => 'Aspirin']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/check-interactions.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ drug_a: 'Warfarin', drug_b: 'Aspirin' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/check-interactions.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'drug_a': 'Warfarin', 'drug_b': 'Aspirin' },
timeout=20,
)
data = r.json()
r.raise_for_status()Response
{
"success": true,
"engine": "basic",
"drug_a": { "input": "Warfarin", "matched_name": "warfarin", "label_found": true },
"drug_b": { "input": "Aspirin", "matched_name": "aspirin", "label_found": true },
"possible_mention_found": true,
"excerpt_from_a_mentioning_b": "…aspirin…may increase the risk of bleeding…",
"excerpt_from_b_mentioning_a": null,
"both_labels_found": true,
"charge": 20,
"billed_via": "wallet",
"wallet_balance": 4930
}Verify an MDCN doctor
₦50.00 / callGET / POSThttps://pillvera.com/api/v1/verify-doctor.php
Check a medical practitioner's registration number against our copy of the MDCN register. Charged only when a record is found.
| Parameter | Type | Description | |
|---|---|---|---|
| registration_number | string | required | e.g. MDCN/R/12345 |
Request
curl -X POST https://pillvera.com/api/v1/verify-doctor.php \
-H "X-Api-Key: $RX_API_KEY" \
-d "registration_number=MDCN/R/12345"<?php
$ch = curl_init('https://pillvera.com/api/v1/verify-doctor.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['registration_number' => 'MDCN/R/12345']),
CURLOPT_HTTPHEADER => ['X-Api-Key: ' . getenv('RX_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$result = json_decode(curl_exec($ch), true);
if ($result['success']) {
// use $result
}// Node 18+ (server side — never expose your key in a browser)
const res = await fetch('https://pillvera.com/api/v1/verify-doctor.php', {
method: 'POST',
headers: { 'X-Api-Key': process.env.RX_API_KEY },
body: new URLSearchParams({ registration_number: 'MDCN/R/12345' }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);import os, requests
r = requests.post(
'https://pillvera.com/api/v1/verify-doctor.php',
headers={'X-Api-Key': os.environ['RX_API_KEY']},
data={ 'registration_number': 'MDCN/R/12345' },
timeout=20,
)
data = r.json()
r.raise_for_status()Response
{
"success": true,
"query": "MDCN/R/12345",
"found": true,
"registry_status": "active",
"full_name": "Jane Doe",
"specialty": "General Practice",
"practice_location": "Lagos",
"last_confirmed_at": "2026-09-01 10:00:00",
"is_stale": false,
"charge": 50,
"billed_via": "wallet",
"wallet_balance": 4880
}Report a data error
POSThttps://pillvera.com/api/v1/submit-correction.php
Tell us when a registration number that should exist came back not found, or looks wrong. Always free.
| Parameter | Type | Description | |
|---|---|---|---|
| registration_number | string | required | The number you checked |
| reported_name | string | optional | The name you expected |
| note | string | optional | Anything that helps us fix it |
Live sandbox
Run real requests against live data — no API key, no charge. Responses are identical to production plus "sandbox": true. Limited to 30 calls per hour.
Best practices
- Call the API from your server, never from a browser or mobile app.
- Cache results for a few hours — registry data changes slowly and you'll save money.
- Handle
402by alerting your team to top up, or move to an all-access plan. - Retry
500responses with exponential back-off (e.g. 1s, 2s, 4s). - Show the
disclaimerfield to end users when you display results. - Use
chargeandbilled_viato reconcile usage in your own records.