Plug Cordelia into the tools you already run
Your campaigns, agents, field reports, storefront orders and survey data — reachable by API, pushed to you by webhook the moment they change, and summarized in plain English on demand. Your own website or app can also report results back to Cordelia, so agents are paid for sign-ups, bookings and orders automatically. No spreadsheets, no manual exports.

Built for teams running real integrations
Your own API keys
Generate and revoke keys yourself from your dashboard — no support ticket needed. Every key is scoped to your account and its full value is only ever shown to you once.
Real-time webhooks
Point Cordelia at a URL of yours and get notified the instant a campaign completes, a report comes in, an order is placed, or a survey response arrives — signed, logged, and retried on delivery.
AI account summary
A short, plain-English read of your account activity — active campaigns, agents used, total spend, survey engagement — generated on demand, right when you need the headline picture.
Advanced analytics
Coverage maps, agent performance and campaign ROI — the same reporting layer your dashboard uses, available for you to pull into your own BI stack.
Subscribe to what matters to you
Pick any combination — each endpoint you register can listen for one or more of these.
Let your website tell Cordelia when a result happens
Pay agents for sign-ups, bookings, orders or customers who stay, in any industry, without anyone reporting them by hand. Everything lands in the same ledger and is paid the same way as every other Cordelia result: from your wallet to the agent's wallet.
How tracking works
- On the campaign, set a destination link (your website, app page or booking form) and add a KPI with the capture mode Your system tells us. Note the KPI key, for example
first_order. - Each agent on the campaign gets a tracked Cordelia link. When a visitor opens it, Cordelia records the click and sends them to your destination with two parameters added:
ref(the agent's link code) andcordelia_click(the id of that click). - Your site must store
cordelia_clickwhen the visitor lands (a cookie or your session is fine), and keep it with the user or order. - When the visitor signs up, books or pays, your server sends the stored
cordelia_clickback with aPOST. Cordelia works out which agent to credit, checks the KPI's rules, and pays them or holds the payout.
https://yourshop.ng/signup?ref=AB12CD34&cordelia_click=90417
If you cannot store the click id, you can send the ref value instead. The click id is preferred because it also proves when the visitor arrived, which is how the KPI's attribution window is enforced.
Record a result
POST /api/v1/conversions.php with the header Authorization: Bearer <api_key>. Send JSON or form fields.
| Field | Required | Description |
|---|---|---|
campaign_id | Yes | The Cordelia campaign id. |
kpi | Yes | The KPI key you defined on the campaign. |
cordelia_click | One of these | The click id that came back on the visitor's URL. |
ref | One of these | The agent's link code, if you stored that instead of the click id. |
external_ref | Yes | Your own order, user or booking id. This makes retries safe. |
value | For percentage KPIs | The sale or order value in naira (₦). |
customer_ref | No | Your own customer id, for your records. It is never shown to agents. |
curl -X POST "https://cordelia.com.ng/api/v1/conversions.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaign_id": 128,
"kpi": "first_order",
"cordelia_click": 90417,
"external_ref": "ORD-20931",
"value": 18500,
"customer_ref": "cust_7741"
}'
A successful call returns 201. If the KPI has no hold period, the agent is paid straight away:
HTTP/1.1 201 Created
{
"success": true,
"duplicate": false,
"conversion_id": 5521,
"status": "paid",
"payout_amount": 925.0,
"release_at": null,
"message": "Recorded and paid."
}
If the KPI holds payout for some days (for example "still active after 30 days"), the result is recorded as confirmed, release_at tells you when it will be paid, and Cordelia pays it automatically once that date passes:
HTTP/1.1 201 Created
{
"success": true,
"duplicate": false,
"conversion_id": 5522,
"status": "confirmed",
"payout_amount": 500.0,
"release_at": "2026-11-05 10:42:00",
"message": "Recorded — payout is held until Nov 5."
}
| Response field | Meaning |
|---|---|
success | true when the result was recorded, or was already recorded. |
duplicate | true when this external_ref was already counted for this KPI. Nothing new is recorded or paid. |
conversion_id | Cordelia's id for the result. Use it to match your records. |
status | paid (the agent has been credited) or confirmed (accepted, payout held until release_at, or waiting on wallet funds). |
payout_amount | What the agent earns for this result, in naira. |
release_at | When a held payout will be released. null when there is no hold. |
message | A plain-English summary. |
Safe to retry
Every call needs an external_ref. Cordelia counts a given external_ref once per KPI on a campaign, so if your server times out and retries, or your queue delivers twice, the second call returns 200 with "duplicate": true and the original result. No second payout is made.
HTTP/1.1 200 OK
{
"success": true,
"duplicate": true,
"conversion_id": 5521,
"status": "paid",
"payout_amount": 925.0,
"release_at": null,
"message": "Already recorded — nothing new was counted."
}
Per-agent limits and hold periods are set on the KPI. A result can later be reversed from the merchant dashboard, for example when an order is refunded; it stays on the record.
Errors
A failed call returns "success": false, a readable error and a machine-readable code. A missing or invalid API key returns 401 before any of these.
HTTP/1.1 404 Not Found
{
"success": false,
"error": "That click id does not belong to this campaign.",
"code": "click_not_found"
}
| code | HTTP | Meaning |
|---|---|---|
campaign_not_found | 404 | The campaign does not exist or is not yours. |
kpi_not_found | 404 | No active KPI with that key on this campaign. |
click_not_found | 404 | The cordelia_click id does not belong to this campaign. |
ref_not_found | 404 | The ref code does not belong to this campaign. |
unattributed | 422 | Neither cordelia_click nor ref was sent, so Cordelia cannot tell which agent to credit. |
external_ref_required | 422 | external_ref is missing. It is required so a result can never be counted twice. |
wrong_capture_mode | 422 | This KPI is not set to "Your system tells us". Change its capture mode on the campaign. |
outside_window | 422 | The click is older than the KPI's attribution window (set per KPI, in days). |
agent_not_on_campaign | 422 | The agent behind that link is no longer an active member of the campaign. |
cap_reached | 422 | The agent has reached the per-agent limit set on this KPI. |
value_required | 422 | The KPI pays a share of the sale, so value must be greater than zero. |
zero_payout | 422 | The payout works out to zero. |
campaign_not_active | 422 | The campaign is not live, so results can no longer be recorded. |
api_not_available | 422 | Automatic capture needs an Enterprise API plan. |
server_error | 500 | Something went wrong on our side. Retry with the same external_ref; it is safe. |
List results
GET /api/v1/conversions.php returns the results on your campaigns, newest first.
| Filter | Description |
|---|---|
campaign_id | Only results on this campaign. |
status | One of pending, confirmed, paid, rejected, reversed. |
limit | Page size. Default 25, maximum 100. |
offset | How many results to skip, for paging. |
curl "https://cordelia.com.ng/api/v1/conversions.php?campaign_id=128&status=paid&limit=25&offset=0" \ -H "Authorization: Bearer YOUR_API_KEY"
{
"success": true,
"total": 1,
"limit": 25,
"offset": 0,
"data": [
{
"conversion_id": 5521,
"campaign_id": 128,
"kpi": "first_order",
"event_shape": "transaction",
"source": "api",
"external_ref": "ORD-20931",
"value": "18500.00",
"payout_amount": "925.00",
"status": "paid",
"release_at": null,
"created_at": "2026-10-06 10:42:11",
"paid_at": "2026-10-06 10:42:11",
"ref": "AB12CD34"
}
]
}
Amounts in the list are returned as decimal strings.
Webhooks for results
Subscribe an endpoint to either of these events from your dashboard (they also appear in the event list above). Deliveries use the same signed format as every other Cordelia webhook: the body is { "event", "created_at", "data" }, and X-Cordelia-Signature is the HMAC-SHA256 of the raw body with your endpoint secret.
conversion.recorded: a result was recorded on one of your campaigns, whether reported by an agent, entered by you, or sent by your system.conversion.paid: a result was confirmed and the agent has been paid.
POST https://yourshop.ng/hooks/cordelia
Content-Type: application/json
X-Cordelia-Event: conversion.paid
X-Cordelia-Signature: <HMAC-SHA256 of the raw body, using your endpoint secret>
{
"event": "conversion.paid",
"created_at": "2026-10-06T10:42:12+01:00",
"data": {
"id": 5521,
"campaign_id": 128,
"source": "api",
"external_ref": "ORD-20931",
"customer_ref": "cust_7741",
"gross_value": 18500.0,
"payout_amount": 925.0,
"status": "paid",
"release_at": null,
"created_at": "2026-10-06 10:42:11",
"paid_at": "2026-10-06 10:42:11",
"kpi_key": "first_order",
"kpi_label": "First order",
"event_shape": "transaction",
"link_code": "AB12CD34",
"agent_ref": "agt_57"
}
}
agent_ref is a stable reference to the agent (agt_ followed by their id); agent names and contact details are never included. link_code is the agent's tracked-link code, the same value as ref above.
Questions people ask
What does the Cordelia Enterprise API give me access to?
A REST API authenticated with your own API key, covering your campaigns, agents, field reports, storefront orders and survey responses — the same data you already see in your dashboard, available to pull into your own tools, warehouse or internal dashboards.
What are webhooks and which events can I subscribe to?
A webhook is a URL of yours that Cordelia calls the moment something happens, instead of you having to poll for it. You can subscribe to campaign completions, new field reports, new storefront orders, new survey responses, and Smart Link results being recorded or paid — each delivery is signed so you can verify it really came from Cordelia, and every attempt is logged so you can see what was sent and whether it succeeded.
Can my website or app tell Cordelia when a customer signs up, books or buys?
Yes. Smart Links give each agent a tracked link to your website, app page or booking form. When a visitor arrives through it, Cordelia adds a click id to your page address. Save it, and when the visitor signs up, books or buys, send it back to the conversions endpoint along with your own order or user id. Cordelia credits the right agent and pays them from your wallet. Sending the same order id twice never counts or pays twice.
Do I need the API to use Smart Links?
No. Agent-reported and merchant-confirmed results work on every plan with no integration. The API only adds fully automatic tracking from your own system, and it is available on Enterprise API plans.
Who can use the Enterprise API?
Merchants on a plan with API access enabled — currently the Custom/Enterprise plan. If you're on a lower plan you'll see the option appear in your dashboard the moment you upgrade.
What is the AI account summary?
A short, plain-English read of your account — active campaigns, agents used, total spend, survey activity — generated on demand so you get the headline picture without digging through separate reports.
Is API access included, or an add-on?
It's included on the Custom/Enterprise plan at no extra cost. Reach out and we'll agree terms for your operation — there's no fixed public price because Enterprise is scoped to what you actually need.
How do I generate an API key?
Once your account is on a plan with API access, generate and revoke keys yourself from Settings inside your merchant dashboard — no support ticket required.
Ready to connect Cordelia to your stack?
Enterprise plans are scoped to your operation — tell us what you're building and we'll set you up.
Get startedMore ways to use Cordelia
Pick what fits you. Each one takes a couple of minutes to start.
Credit agents from your own site
Add one line of script to your website and Cordelia credits the agent whenever a visitor from their link signs up, orders, messages you on WhatsApp, sends a form or books. Works for any brand.
See the website trackerBuild on the Cordelia API
Create campaigns, read results and receive webhooks from your own systems.
Enterprise APISee what things really cost
Live shelf prices by state, LGA and area, with rises and falls by day. Combined and anonymous. Businesses and researchers can request reports.
Explore the Price Board