API docs
Gift certificates
Permission: gift_certificates (read / write).
GET /v1/gift-certificates. Filters: code (dashes and case ignored), status, purchaser_customer_id, updated_since, limit, cursor.
GET /v1/gift-certificates/{id} also returns the last 50 ledger rows as transactions (kind, amount_cents, balance_after_cents, note, created_at).
curl "https://app.blackbeachpos.com/api/v1/gift-certificates?code=WE-7K2M-9QXA" -H "Authorization: Bearer $KEY"
{
"object": "gift_certificate",
"id": 58,
"code": "WE-7K2M-9QXA",
"status": "active",
"source": "pos",
"initial_cents": 10000,
"balance_cents": 6450,
"purchaser_customer_id": 1166,
"recipient_name": "Sam Reyes",
"recipient_email": "sam@example.com",
"expires_on": null,
"issued_at": "2026-08-30T20:11:00Z",
"updated_at": "2026-09-21T18:40:00Z"
}
status is one of active, depleted, disabled, expired. source is pos or bigcommerce.
Issue a certificate
POST /v1/gift-certificates — for a certificate sold on another channel. It becomes a real code in Black Beach POS, spendable at the counter, and mirrors to BigCommerce like one sold at the register.
| Field | Notes |
|---|---|
amount_cents |
Required, 500 to 200000 ($5 to $2,000) |
code |
Optional; a code is generated when omitted. 409 if taken |
recipient_name, recipient_email, message |
Optional |
purchaser_customer_id or purchaser_name / purchaser_email |
Optional |
expires_on |
Optional YYYY-MM-DD |
location_id |
Optional; the store credited with the sale |
reference |
Optional; your order id, kept in the ledger note |
curl -X POST https://app.blackbeachpos.com/api/v1/gift-certificates \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: etsy-gc-3381920" \
-d '{"amount_cents": 5000, "recipient_name": "Sam Reyes", "recipient_email": "sam@example.com", "reference": "ETSY-3381920"}'
Returns 201 with the certificate and its first ledger row.
Redeem and reverse
POST /v1/gift-certificates/{id}/redeem spends from the balance; POST /v1/gift-certificates/{id}/reverse gives an amount back (a refund on your side). Body: { "amount_cents": 1000, "reference": "ORDER-4410" }.
- An
Idempotency-Keyheader is required on every move of value — redeem, reverse, reload and adjust (400 IDEMPOTENCY_KEY_REQUIREDwithout it), so a retry can never move the balance twice. A replay returns the first response withIdempotent-Replayed: true. - Find the id from a code with
GET /v1/gift-certificates?code=…. 422 GIFT_CERTIFICATE_INSUFFICIENTwhen the balance is short (details.balance_cents);422 GIFT_CERTIFICATE_INACTIVEwhen the certificate is disabled or expired.- The response is the certificate plus
transaction, the ledger row just written.
Reload and adjust
POST /v1/gift-certificates/{id}/reload adds value: { "amount_cents": 2500, "reference": "TOPUP-88" }. It's refused on a disabled or expired certificate (422 GIFT_CERTIFICATE_INACTIVE).
POST /v1/gift-certificates/{id}/adjust corrects the balance either way. amount_cents is signed (negative removes value) and a reason is required:
curl -X POST https://app.blackbeachpos.com/api/v1/gift-certificates/42/adjust \
-H "Authorization: Bearer ir_live_…" -H "Content-Type: application/json" \
-H "Idempotency-Key: adj-42-20260925" \
-d '{"amount_cents": -1000, "reason": "Price-match correction"}'
- An
Idempotency-Keyheader is required on both, as on redeem and reverse. - An adjustment can't take the balance below zero (
422 GIFT_CERTIFICATE_INSUFFICIENT). - The response is the certificate plus
transaction, the ledger row just written (kindreloadoradjustment).
Disable and enable
POST /v1/gift-certificates/{id}/disable with { "reason": "…" } stops it being spent; POST /v1/gift-certificates/{id}/enable turns it back on (an expired certificate can't be re-enabled).
