AfroPin Developers
Postman Sign in Get test keys

Bulk sales

Look up a quote

Retrieve one quote by its id or its QTE- reference: where it stands and, once paid, who paid and how far the cards have got.

GET https://afropin.com/api/v1/brand/quotes/{quote_id}

HMAC-signed request with a unique Idempotency-Key header. Authentication

With an SDK
PHP$afropin->brand->quotes->get($quoteId, $params)
Node.jsafropin.brand.quotes.get(quoteId, params)
Pythonafropin.brand.quotes.get(quote_id, params)
Javaafropin.brand().quotes().get(quoteId, params)

Path parameters

quote_id uuid | string Required

The quote's id or reference.

Quote object

id uuid Required

The quote's ID.

reference string Required

Its QTE- reference, shown to the buyer and on your Campaigns page. Works wherever an ID does.

external_reference string | null Required

The reference you sent, for example your own order or deal number.

status string Required open paying paid sent review expired cancelled

open until the buyer starts paying, paying while they are at the payment page, paid for a moment once paid, then sent when the cards start going out. review means it was paid but the cards couldn't be sent; the money is on your issuing balance and our team contacts you. expired is an unpaid quote past expires_at; cancelled one you withdrew.

mode string Required test live

The mode of the key that made it. Test quotes are paid at once with no money taken, and send test cards.

source string Required api dashboard

Where it was made: through the API, or on your Campaigns page.

catalog_id uuid Required

The product quoted, from your issuing catalog.

pin_type string Required

The product's name.

currency string Required

The product's currency.

card_value number Required

The value of each gift card.

quantity integer Required

How many gift cards.

discount_percent number Required

The discount given.

face_total number Required

card_value × quantity: what the cards are worth.

price number Required

What the buyer pays: face_total less the discount.

company string Required

The business the quote is for.

message string | null Required

Your note to the buyer, shown on the payment page.

pay_url string | null Required

The hosted page where the buyer pays. Send it to them, or let us email it with send_email. null once the quote can no longer be paid.

delivery string | null Required recipients buyer

recipients when the cards go to a list of people (yours, or one the buyer uploaded), buyer when every card goes to the buyer. null until the buyer chooses.

recipients_count integer | null Required

How many people are on the list, when there is one. The list itself is never returned.

buyer object | null Required

name and email of whoever paid, once paid.

cards object | null Required

Once sent, the progress of the cards: status (queued, sending, stopped, done), total, sent and failed. Follow the same send on your Bulk send page.

webhook_id uuid | null Required

The webhook told about this quote's changes.

expires_at datetime Required

The end of the last day the quote can be paid.

paid_at datetime | null Required

When it was paid.

created_at datetime Required

When it was made.

Response 200

{
    "ok": true,
    "data": {
        "id": "7d0e4f2a-1c9b-4e83-a5d6-2b8f0c3e9a14",
        "reference": "QTE-K7Q2M9XW",
        "external_reference": "deal-2041",
        "status": "sent",
        "mode": "live",
        "source": "api",
        "catalog_id": "3f8a1c2e-6b4d-4f90-8e7a-5c1d9b2e4f63",
        "pin_type": "Grams Fresh Bakes",
        "currency": "NGN",
        "card_value": 10000,
        "quantity": 50,
        "discount_percent": 5,
        "face_total": 500000,
        "price": 475000,
        "company": "Acme Ltd",
        "message": "Staff appreciation week",
        "pay_url": null,
        "delivery": "recipients",
        "recipients_count": 50,
        "buyer": {
            "name": "Bola Ade",
            "email": "[email protected]"
        },
        "cards": {
            "status": "sending",
            "total": 50,
            "sent": 12,
            "failed": 0
        },
        "webhook_id": "ca1d075c-f6b0-4d4a-b498-d126239ee0a4",
        "expires_at": "2026-11-19T22:59:59.000000Z",
        "paid_at": "2026-11-06T10:02:41.000000Z",
        "created_at": "2026-11-05T09:14:22.000000Z"
    }
}

Errors

Failed requests return a stable code with a translated message. Branch on code, never on the message.

403 wrong_account_type Your account type cannot use this endpoint
403 issuing_disabled Issuing PINs is not switched on for your account. Contact support
404 quote_not_found No quote of yours has this id or reference
429 rate_limited Too many requests. Wait a moment and try again
500 internal_error Something went wrong on our side. Try again; if it keeps happening, contact support
{
    "ok": false,
    "error": {
        "code": "quote_not_found",
        "message": "No quote of yours has this id or reference",
        "fields": null
    }
}
All error codes →