CordeliaCordelia

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.

REST + WebhooksPull on demand, or get pushed in real time
Signed & LoggedEvery delivery HMAC-verified, every attempt recorded
Pay-per-resultReport sign-ups & orders back; agents are paid automatically
API keys and webhook activity in the Cordelia Enterprise dashboard
What's included

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.

Webhook events

Subscribe to what matters to you

Pick any combination — each endpoint you register can listen for one or more of these.

campaign.completed report.submitted order.placed survey.response conversion.recorded conversion.paid
Conversions (Smart Links)

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.

Enterprise API plans only. Agent-reported and merchant-confirmed results work on every plan with no integration. This page covers the automatic option.

How tracking works

  1. 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.
  2. 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) and cordelia_click (the id of that click).
  3. Your site must store cordelia_click when the visitor lands (a cookie or your session is fine), and keep it with the user or order.
  4. When the visitor signs up, books or pays, your server sends the stored cordelia_click back with a POST. 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.

FieldRequiredDescription
campaign_idYesThe Cordelia campaign id.
kpiYesThe KPI key you defined on the campaign.
cordelia_clickOne of theseThe click id that came back on the visitor's URL.
refOne of theseThe agent's link code, if you stored that instead of the click id.
external_refYesYour own order, user or booking id. This makes retries safe.
valueFor percentage KPIsThe sale or order value in naira (₦).
customer_refNoYour 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 fieldMeaning
successtrue when the result was recorded, or was already recorded.
duplicatetrue when this external_ref was already counted for this KPI. Nothing new is recorded or paid.
conversion_idCordelia's id for the result. Use it to match your records.
statuspaid (the agent has been credited) or confirmed (accepted, payout held until release_at, or waiting on wallet funds).
payout_amountWhat the agent earns for this result, in naira.
release_atWhen a held payout will be released. null when there is no hold.
messageA 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"
}
codeHTTPMeaning
campaign_not_found404The campaign does not exist or is not yours.
kpi_not_found404No active KPI with that key on this campaign.
click_not_found404The cordelia_click id does not belong to this campaign.
ref_not_found404The ref code does not belong to this campaign.
unattributed422Neither cordelia_click nor ref was sent, so Cordelia cannot tell which agent to credit.
external_ref_required422external_ref is missing. It is required so a result can never be counted twice.
wrong_capture_mode422This KPI is not set to "Your system tells us". Change its capture mode on the campaign.
outside_window422The click is older than the KPI's attribution window (set per KPI, in days).
agent_not_on_campaign422The agent behind that link is no longer an active member of the campaign.
cap_reached422The agent has reached the per-agent limit set on this KPI.
value_required422The KPI pays a share of the sale, so value must be greater than zero.
zero_payout422The payout works out to zero.
campaign_not_active422The campaign is not live, so results can no longer be recorded.
api_not_available422Automatic capture needs an Enterprise API plan.
server_error500Something 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.

FilterDescription
campaign_idOnly results on this campaign.
statusOne of pending, confirmed, paid, rejected, reversed.
limitPage size. Default 25, maximum 100.
offsetHow 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.

Answers

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 started
Get started

More 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 tracker

Build on the Cordelia API

Create campaigns, read results and receive webhooks from your own systems.

Enterprise API

See 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