Gift cards

Gift cards hold purchased value issued by one merchant, in USD. They work only with that merchant and environment. Purchased cards have no expiry or fees. Promotional gift card products, customer store credit, transfers, and cross-merchant spending are not supported. To add unpaid value to a card, use a positive adjustment with reason complimentary.

You can issue, load, redeem, and reconcile cards without a Flint order. Hosted checkout uses the same ledger and can apply up to 20 cards alongside one processor payment. Gift card value pays the order after discounts and tax; it is not a discount. Gift card value cannot pay for subscription orders. Existing gift card value cannot fund a new gift card purchase. In a mixed basket, it can pay for eligible merchandise.

Save a card in a buyer account#

A buyer with a full customer session can save a card with POST /v1/me/gift-cards. The session determines the buyer, merchant, and environment; do not pass identity selectors. Reads and removal accept no request body. Provide one possession proof:

JSON
{ "credential_type": "code", "code": "GIFT_CARD_CODE" }

Or provide credential_type: "recipient_access", grant_id, and recipient_access_token from the original private recipient link. The grant ID is in the link's path and the token is in its fragment. Do not send both proof types or extra fields. Parse pasted links locally without fetching their URL, and keep codes and tokens out of navigation, browser storage, and telemetry.

Saving an active or frozen card, including one with no remaining balance, adds it to the buyer's saved collection. Several buyers may save the same card. Saving does not change customer_id, move funds, reveal the full code, or authorize checkout spending. Buying a card or matching its recipient email does not grant saved access. Order, invoice, return, and subscription sessions cannot use these endpoints.

GET /v1/me/gift-cards lists saved cards with current access. GET /v1/me/gift-cards/{gift_card_id} returns the card's masked identifier, status, balance, reserved amount, available amount, and timestamps. Existing saved cards remain readable after being frozen or closed. Replacing the code removes them from the list and makes detail and history reads return 404 until the buyer saves again with fresh proof. Expiry of the original private link does not expire previously saved access.

GET /v1/me/gift-cards/{gift_card_id}/transactions returns the full anonymous balance-change history, including changes made by other holders. Each entry includes its per-card sequence, signed amount, balance before and after, and posting time. Customer identities, order and payment references, source identifiers, reasons, and command keys are omitted.

Both lists take page_size and page_token, with a default of 20 and a maximum of 100. Cards sort by saved time, then card ID, descending. History sorts by per-card sequence, descending. Continue with the same page size and authenticated buyer. History tokens also require the same saved credential version.

DELETE /v1/me/gift-cards/{gift_card_id} removes only that buyer's saved access. Save and remove return 200. Duplicate saves do not add another entry, and repeated removals succeed. Both writes accept an optional Idempotency-Key, scoped to the buyer, merchant, environment, and operation. A replay cannot restore removed or revoked access. Removing and re-adding a card requires a new save key.

Issue and recover a card#

Create a card with currency: USD and optional funding. Unfunded cards remain pending. Funding records value_money, the face value issued, separately from consideration_money, the amount paid. external_payment funding requires a buyer_id for a customer in the environment, a reference_id, and consideration_money. import funding requires a reference_id; buyer_id and consideration_money are optional. Retire an imported balance in the source system so it cannot be spent in both places. References record activity outside Flint and do not mean Flint processed a payment. flint_payment funding requires a succeeded standalone payment intent from the same merchant, with enough unrefunded captured value to cover consideration_money. Manual-payment funding is created only through an order.

Money-changing commands require a caller-chosen Idempotency-Key. Retain and reuse the same key after a timeout. Replaying identical input returns the original operation; changing input with that key produces a conflict. Flint keeps the key for as long as the ledger exists, so a lost response can always be recovered by replaying the original request. Loads, redemptions, and transactions can also be listed with an idempotency_key filter.

Issuance and code rotation return the full code once. Replaying the same request returns it again for 24 hours; after that, a replay still returns the result without the code. Other reads, logs, and webhooks show only the last characters. The recipient's private access page is the only other place the full code appears. Store codes as credentials. Never put them in URLs or logs. Lookup uses a JSON request body. Code rotation revokes old credentials and recipient links while preserving balances and protecting already-reserved payments.

Codes have 16 normalized ASCII characters, for example 0000-0000-0000-0000 in a synthetic test. Lookup trims surrounding whitespace, ignores ASCII hyphens, accepts ASCII letter case, maps O to 0, and maps I and L to 1. It rejects Unicode and does not support prefix matching.

Reserve and redeem value#

balance_money is posted value, including reservations. reserved_money is held value; available_money is the spendable remainder. A freeze prevents new spending and retains the balance. Closing requires resolving remaining value and protected reservations. It cannot erase money.

Create a redemption with an amount, external reference, and capture_mode. Automatic capture posts the spend immediately. Manual capture creates a reservation that you later capture or cancel with an Idempotency-Key; add expected_version to reject a concurrent change. Reservations last 15 minutes by default and up to 24 hours. Expiry cannot release money behind a payment whose outcome is still unknown. Retrieve the existing redemption to recover its state before issuing another command.

Applying a card to an order returns an estimate. Accept the exact order revision, card allocations, and processor remainder when paying. Any change, up or down, returns GIFT_CARD_ALLOCATION_CHANGED; refresh the estimate and get the buyer's acceptance again. Gift-card-only payment settles without a processor charge.

Refunds and funding losses#

Refund merchandise through the refund API. Without tender_allocations, an order refund returns value to the original gift cards first; send allocations to choose gift card redemptions or processor payments yourself. Each original tender has a cumulative refund cap. The default destination restores the original card. If that card is closed or cannot accept the full allocation, explicitly authorize a replacement destination. Replacement value retains its funding provenance and risk restrictions; it does not become a newly paid load. Replays recover the same destinations.

Refunding a gift card purchase removes eligible unspent value from its funding load, including value restored through linked merchandise refunds. Spent or reserved value causes a conflict. Unknown provider refund outcomes remain protected until reconciled. Purchase refunds and manual-payment reversals do not use an ordinary balance adjustment to hide unavailable value.

After reversing a manual payment for a gift card purchase, collecting the outstanding amount through a processor or another manual payment restores the reversed value. The purchase keeps its original unit identities. If restoration requires a replacement card, purchased_gift_cards links it to the original card with restoration_reason: processor_recollection or manual_recollection, according to the new payment.

An open or lost dispute on a funding payment freezes the whole card. Value from other loads keeps its provenance but cannot be spent until the dispute is won or its loss is honored. Winning clears only that dispute's restriction. After a loss, create a gift card funding disposition with dispute_id, disposition: honor_value, and reason_message. Use commerce.gift_cards.adjustments.write and a durable Idempotency-Key. The 201 response returns the GiftCardFundingDisposition directly in data, including the disputed amount, original consideration, honored value, and preserved reservations. Unknown disputes return 404; disputes without an eligible funding loss return 409. Cash-out records require external payout evidence; recording one does not send cash to the buyer.

Recipient email#

Creating or rotating a card does not send an email unless you explicitly supply notification. Otherwise, create a notification with the card ID and recipient. Notifications use the current credential version and do not issue value, activate a card, or fulfill an order. Recipient email is required; name is optional, the message can contain up to 200 characters, and send_at can schedule up to 90 days ahead.

Status is scheduled, queued, sending, sent, failed, unconfirmed, bounced, or canceled. sent means the email provider accepted the message, not that the recipient opened it. For unconfirmed, the email provider did not confirm whether it sent the message. Flint does not resend it automatically. Retrieve the notification for its recent delivery.attempts and provider_outcomes. The history includes truncation flags when older records exist. After an outcome resolves, an explicit resend uses resend_of_notification_id and a new command identity. You can cancel a notification that is scheduled, queued, failed, or bounced. Once sending starts, cancellation returns a conflict. A notification for a pending card waits until the card is funded.

Recipient email opens private hosted access valid for 30 days from sending. Expiring or revoking that access does not expire the card's funds. Changing a credential revokes old access. Issuing and loading, spending, and adjustments and cash-outs have separate scopes. Recipient email and code replacement both require commerce.gift_cards.secrets.write; grant each scope only to callers that need it.

Reconcile#

List gift cards, loads, redemptions, and notifications with created_after and created_before to filter created_at. Use posted_after and posted_before on the merchant-wide transaction feed to filter posted_at. Both bounds are inclusive RFC 3339 timestamps. Money fields use the shared Money schema; transaction amounts and adjustment inputs use SignedMoney because they can be negative. Gift cards use USD.

Use the merchant-wide transaction feed to reconcile postings by card, source, order, period, or durable command key. Transactions are immutable and expose balance before and after each posting. Reservations and notification events do not change posted liability.

Subscribe to gift_card.*, gift_card_load.*, gift_card_notification.*, gift_card_redemption.*, and gift_card_transaction.created events. Set enabled_events to exact event names, such as gift_card_notification.created and gift_card_notification.updated, to receive only those events. Notification events carry a snapshot of the recipient, status, and notification version; retrieve the notification for current delivery history. Refunds appear as redemption, load, and transaction updates. Delivery is at least once and can arrive out of order. Deduplicate by event ID, compare resource versions, and retrieve current state when needed. Events never include full codes or recipient access secrets.

Use gift_card_liability_v1 for a fixed liability roll-forward and orders_itemized_v2 to separate gift card purchase consideration from merchandise. A $25 card sold for $22 adds $25 of face value and records $22 of consideration; its later redemption pays for merchandise. Do not count cash collected at issuance as another merchandise sale. See reports for report boundaries and columns.

Cash-out eligibility#

The merchant pays the customer outside Flint, then records the completed payout with the cash-out operation and its external evidence. A cash-out is a balance debit, separate from a merchandise refund or a refund of the card's purchase. Its amount cannot exceed unreserved value. Recording a larger voluntary payout is supported; these thresholds are eligibility floors, not maximum ledger debits.

State law sets the minimum: a remaining balance under the state's threshold must be paid out on request. Your policy can cover larger balances but not fewer. State rules include conditions and exclusions, and the state that governs an online sale needs legal review. The following table covers purchased, single-merchant cards and was checked on October 2, 2026.

StateRemaining balance eligible on requestConditions and source
CaliforniaLess than $15Operative April 1, 2026. Civil Code 1749.5
Colorado$5 or lessSingle-merchant cards. C.R.S. 6-1-722
ConnecticutLess than $5After a purchase; the statute has exclusions, including some discounted cards and out-of-state retailers. Consumer protection guidance
HawaiiLess than $5Consumer protection guidance
MaineLess than $5After an in-person redemption; original value must exceed $5. 33 M.R.S. 2067
Massachusetts$5 or less for a reloadable card; otherwise after at least 90% of its value has been redeemedRetail rights guide, gift certificate guidance
MontanaLess than $5Original value must exceed $5. MCA 30-14-108
New JerseyLess than $5After redemption. Cash balance redemption guidance
New YorkLess than $5Division of Consumer Protection guidance
Oregon$5 or lessMost cards after a purchase; consult the linked guidance for exceptions. Department of Justice guidance
Rhode IslandLess than $1Remaining value after redemption. R.I. Gen. Laws 6-13-12
VermontLess than $18 V.S.A. 2704
WashingtonLess than $5Remaining value after a purchase. RCW 19.240.020

Checkout credential verification#

Failed gift card guesses are counted independently for the checkout session, client IP and merchant environment. Each count runs for one hour from its first failure. After five session failures, ten IP failures, or fifty merchant failures, every checkout lookup in that hour requires a fresh Cloudflare Turnstile challenge for action gift_card_code, even with a valid code. Send its token in Flint-Gift-Card-Challenge. The challenge is separate from the spending code and is never part of the financial command identity. Hosted checkout shows the challenge when it is required. Buyers get the same GIFT_CARD_UNAVAILABLE refusal for unknown, other-merchant, and inactive codes.

A dashboard session must have verified its strongest available sign-in factor within the last five minutes to send a recipient email, issue a card with notification, or replace a code. Creating or updating an API key, approving CLI access, or authorizing a partner installation with commerce.gift_cards.secrets.write or accounts.api_keys.write requires the same verification; developer email sessions verify by email. The dashboard prompts and retries for API keys and CLI access. Other session callers receive 403 GIFT_CARD_RECIPIENT_VERIFICATION_REQUIRED; verify again, get a new token, and retry with the same Idempotency-Key. Refreshing a token alone does not renew verification. API keys and installed integrations are not challenged.

In a dashboard session, merchant viewers can read gift cards, and order operators can also redeem, capture, and cancel reservations. Every other gift card command, including updates, freezes, closing, honoring a funding loss, and canceling notifications, requires a merchant administrator or owner. Fresh verification preserves these role requirements.

Purchase velocity limits#

Processor-funded gift card purchase attempts have separate daily face-value limits for the buyer email, the payment card fingerprint on card, Apple Pay, and Google Pay payments, and the device when one is sent. Each defaults to $10,000 per merchant environment and UTC day. The platform can lower each limit. Failed attempts count toward the limit; exact retries of the same attempt count once. Split payment legs each count the full face value of gift cards that have not yet been issued, including partially funded cards, so a split purchase can reach the limit sooner. Value awaiting restoration after a manual-payment reversal also counts. Already-issued cards do not count again toward unrelated merchandise payments. The existing card balance and funding limits still apply.

For checkout-session purchases, send Flint-Buyer-Device with a stable random 32-character lowercase hexadecimal device identifier. Keep it across orders on the same device. A checkout-session purchase without it returns GIFT_CARD_BUYER_DEVICE_REQUIRED. Hosted checkout supplies it from a secure, HttpOnly cookie, separate from checkout credentials. This identifier is a fraud signal and grants no access. Clearing cookies or changing device identifiers can reset that signal; payment card and buyer email controls remain independent. Merchant integrations can supply the same header when they have a buyer device. Standalone flint_payment creation and reloads apply these limits before adding gift card value, using the captured payment's original card, buyer email, and device identities. A standalone payment may already have charged its buyer before you choose to allocate it to a gift card. If allocation is refused, refund that payment or use it for its original purpose. Manual, imported, and external attested funding retain the funding limits and audit requirements; they do not claim a processor card identity.

Card fingerprints come from the processor, and the buyer email comes from the Flint customer bound to the payment. Caller-supplied billing or receipt emails do not replace that buyer identity. For order purchases, a missing fingerprint on a card-backed payment, a missing required device identifier, or an unavailable verification service rejects the purchase before charging. GIFT_CARD_PURCHASE_LIMIT_EXCEEDED means this purchase would exceed a limit for the current UTC day. A smaller purchase can still fit, and a single purchase above a limit is always rejected.

The Gift card object#

Every field on a gift card, as returned by retrieve and carried by the endpoints below.

Attributes

consideration_moneyobject or nullRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

created_atstringRequired

RFC3339 timestamp.

funding_disputesarray of objectRequired

Restrictions tied to original funding, including value restored to replacement cards. A win clears only its own restriction. A loss keeps spending restricted until you create a gift card funding disposition.

gift_card_idstringRequired
gift_card_load_idstringRequired
idempotency_keystringRequired
purchase_refund_value_holdsarray of object

Pending original cash refunds holding unspent value on this descendant funding lot. Unknown provider outcomes retain these holds.

purchase_refundsarray of objectRequired

Cash refunds and manual payment reversals against this original funding load. Pending refunds reserve their value; confirmed success removes it, and confirmed failure releases the hold.

purchase_restorationobject
refund_provenanceobject
refund_transferred_moneyobject

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

remaining_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

reversed_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

sourceone ofRequired
source_created_atstring or nullRequired

RFC3339 timestamp.

value_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

versionintegerRequired

Create a gift card funding disposition#

POST/v1/gift-card-funding-dispositionsIdempotent

Requires scope commerce.gift_cards.adjustments.write

Accepts a confirmed funding dispute loss and honors all gift card value funded by that payment, including value restored to replacement cards. Records the dispute amount, original gift card consideration, honored value and preserved reservations. Clears only this dispute restriction; balances, unrelated restrictions and unresolved payment reservations remain intact. Requires gift card adjustment authority and a durable Idempotency-Key.

Request body

dispositionenumRequired
  • honor_value
dispute_idstringRequired

The lost dispute on the payment that funded the gift card value.

reason_messagestringRequired

Your reason for honoring the gift card value despite the confirmed funding loss.

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-card-funding-dispositions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "disposition": "honor_value",
    "dispute_id": "",
    "reason_message": ""
  }'

List gift card loads#

GET/v1/gift-card-loads

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Lists funding lots in descending ID order. Consideration may be null for imported balances whose original purchase price is unknown. The idempotency_key filter recovers a load after a lost command response.

Query parameters

created_afterstring

RFC3339 lower bound for created_at.

created_beforestring

RFC3339 upper bound for created_at.

gift_card_idstring

Exact, case-sensitive filter.

idempotency_keystring

Exact, case-sensitive filter.

order_idstring

Exact, case-sensitive filter.

page_sizeinteger

Number of resources to return.

page_tokenstring

Opaque continuation token for the same merchant, environment and filters.

source_idstring

Exact, case-sensitive filter.

source_typeenum

Exact, case-sensitive filter.

  • adjustment
  • external_payment
  • flint_manual_payment
  • flint_payment
  • gift_card_purchase_refund_recovery
  • gift_card_refund
  • import

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/gift-card-loads \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Get a gift card load#

GET/v1/gift-card-loads/{gift_card_load_id}

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Retrieves original value, consideration, funding provenance and remaining attributable value for one load.

Path parameters

gift_card_load_idstringRequired

Flint resource ID.

Response · 200

dataobjectRequired

Independent funding resource. Value and consideration are separate. External funding and import provenance are merchant-attested; no payment is collected by recording them. Replacement refund lots retain original funding provenance and do not represent new paid funding.

metaobject
request_idstring
curl https://api.withflintpay.com/v1/gift-card-loads/{gift_card_load_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

List gift card notifications#

GET/v1/gift-card-notifications

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Lists recipient notification identities, schedules and delivery outcomes. No redemption codes or recipient access tokens are returned.

Query parameters

created_afterstring

RFC3339 lower bound for created_at.

created_beforestring

RFC3339 upper bound for created_at.

gift_card_idstring

Exact, case-sensitive filter.

page_sizeinteger

Number of resources to return.

page_tokenstring

Opaque continuation token for the same merchant, environment and filters.

statusenum

Exact, case-sensitive filter.

  • bounced
  • canceled
  • failed
  • queued
  • scheduled
  • sending
  • sent
  • unconfirmed

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/gift-card-notifications \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Send a gift card notification#

POST/v1/gift-card-notificationsIdempotent

Requires scope commerce.gift_cards.secrets.write

Creates a recipient email notification, immediately or up to 90 days from now. A resend creates a new resource with resend_of_notification_id. An unconfirmed send must be resolved before another send is requested. Sending does not change gift card value or order fulfillment.

Request body

gift_card_idstringRequired
recipientobjectRequired
resend_of_notification_idstring

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-card-notifications \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "gift_card_id": "",
    "recipient": {
      "email": ""
    }
  }'

Get a gift card notification#

GET/v1/gift-card-notifications/{gift_card_notification_id}

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Retrieves a notification and its sending outcome. Sent means the sending provider accepted the message; it does not mean the recipient read it.

Path parameters

gift_card_notification_idstringRequired

Flint resource ID.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl https://api.withflintpay.com/v1/gift-card-notifications/{gift_card_notification_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Cancel a gift card notification#

POST/v1/gift-card-notifications/{gift_card_notification_id}/cancelIdempotent

Requires scope commerce.gift_cards.secrets.write

Cancels a notification before sending starts or after confirmed failure. A sending or unconfirmed notification cannot be canceled. Gift card value is preserved.

Path parameters

gift_card_notification_idstringRequired

Flint resource ID.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-card-notifications/{gift_card_notification_id}/cancel \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{}'

List gift card redemptions#

GET/v1/gift-card-redemptions

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Lists reservations and captured redemptions in descending ID order. Retrieve by idempotency_key to recover an operation after a lost response.

Query parameters

created_afterstring

RFC3339 lower bound for created_at.

created_beforestring

RFC3339 upper bound for created_at.

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

gift_card_idstring

Exact, case-sensitive filter.

idempotency_keystring

Exact, case-sensitive filter.

order_idstring

Exact, case-sensitive filter.

page_sizeinteger

Number of resources to return.

page_tokenstring

Opaque continuation token for the same merchant, environment and filters.

source_typeenum

Exact, case-sensitive filter.

  • external
  • flint_order
statusenum

Exact, case-sensitive filter.

  • canceled
  • captured
  • expired
  • reserved

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/gift-card-redemptions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Redeem gift card value#

POST/v1/gift-card-redemptionsIdempotent

Requires scope commerce.gift_cards.redemptions.write

Posts an exact amount automatically or reserves it for one full manual capture. Insufficient funds are rejected without a partial debit. Manual reservations default to 15 minutes and may be bounded up to 24 hours. External integrations coordinate and compensate their other tenders themselves.

Request body

Send exactly one of these

amount_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

capture_modeenumRequired
  • automatic
expected_versioninteger
external_reference_idstringRequired

Caller-owned identifier for this resource in an external system.

gift_card_idstringRequired

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-card-redemptions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "amount_money": {
      "amount": 0,
      "currency": "USD"
    },
    "capture_mode": "automatic",
    "external_reference_id": "",
    "gift_card_id": ""
  }'

Get a gift card redemption#

GET/v1/gift-card-redemptions/{gift_card_redemption_id}

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Retrieves requested, reserved, captured, refunded and remaining refundable value with the current reservation status.

Path parameters

gift_card_redemption_idstringRequired

Flint resource ID.

Response · 200

dataobjectRequired

Independent redemption resource. Operational reservations are separate from immutable posted transactions. Captured value can be refunded only against its original redemption.

metaobject
request_idstring
curl https://api.withflintpay.com/v1/gift-card-redemptions/{gift_card_redemption_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Cancel a gift card reservation#

POST/v1/gift-card-redemptions/{gift_card_redemption_id}/cancelIdempotent

Requires scope commerce.gift_cards.redemptions.write

Releases an uncaptured standalone reservation without posting a debit or refund. Flint order reservations cannot be released while a processor outcome is unresolved.

Path parameters

gift_card_redemption_idstringRequired

Flint resource ID.

Request body

expected_versioninteger

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-card-redemptions/{gift_card_redemption_id}/cancel \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_version": 0
  }'

Capture a gift card reservation#

POST/v1/gift-card-redemptions/{gift_card_redemption_id}/captureIdempotent

Requires scope commerce.gift_cards.redemptions.write

Posts the full reserved amount before the manual reservation expires. Capturing and expiry use the same concurrency fence. Flint order reservations are resolved by their payment attempt and cannot be captured through this standalone operation.

Path parameters

gift_card_redemption_idstringRequired

Flint resource ID.

Request body

expected_versioninteger

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-card-redemptions/{gift_card_redemption_id}/capture \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_version": 0
  }'

List gift card transactions#

GET/v1/gift-card-transactions

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Lists immutable financial entries across the merchant in ascending merchant_sequence order. Per-card sequences and balance snapshots support reconciliation. Reservations and code replacement never create financial debits.

Query parameters

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

gift_card_idstring

Exact, case-sensitive filter.

idempotency_keystring

Exact, case-sensitive filter.

order_idstring

Exact, case-sensitive filter.

page_sizeinteger

Number of resources to return.

page_tokenstring

Opaque continuation token for the same merchant, environment and filters.

posted_afterstring

RFC3339 lower bound for posted_at.

posted_beforestring

RFC3339 upper bound for posted_at.

source_idstring

Exact, case-sensitive filter.

source_typestring

Exact, case-sensitive filter.

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/gift-card-transactions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

List gift cards#

GET/v1/gift-cards

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Lists gift cards in descending ID order within the authenticated merchant and environment. Reads include masked codes, posted balance, reserved value and available value. Purchased cards have no expiry or service fees.

Query parameters

created_afterstring

RFC3339 lower bound for created_at.

created_beforestring

RFC3339 upper bound for created_at.

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

gift_card_idstring

Exact, case-sensitive filter.

page_sizeinteger

Number of resources to return.

page_tokenstring

Opaque continuation token for the same merchant, environment and filters.

statusenum

Exact, case-sensitive filter.

  • active
  • closed
  • frozen
  • pending

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/gift-cards \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Create a gift card#

POST/v1/gift-cardsIdempotent

Requires scope commerce.gift_cards.write

Creates a merchant-issued USD gift card with optional paid funding or imported opening value. External funding is merchant-attested and does not collect a payment. The full code is returned only by issuance or code replacement and their authorized retries for 24 hours. Financial command identity is retained for the lifetime of the ledger.

Request body

currencyenumRequired

ISO 4217 currency code.

  • USD
customer_idstring
external_reference_idstring

Caller-owned identifier for this resource in an external system.

fundingone of or null
notificationobject

Optional recipient notification recorded with issuance. Requires commerce.gift_cards.secrets.write in addition to issuance authority.

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "currency": "USD"
  }'

Get a gift card#

GET/v1/gift-cards/{gift_card_id}

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Retrieves the current gift card, including supported lifecycle actions and balance projections. A gift card ID does not authorize a buyer to spend it.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Response · 200

dataobjectRequired

Merchant-issued purchased gift card. Posted balance includes reserved value; available value is balance minus reservations. Frozen value remains part of outstanding liability. Gift cards are independent resources and cannot be transferred across merchants or currencies.

metaobject
request_idstring
curl https://api.withflintpay.com/v1/gift-cards/{gift_card_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

Update a gift card#

PATCH/v1/gift-cards/{gift_card_id}Idempotent

Requires scope commerce.gift_cards.write

Updates descriptive associations. Omitted fields are preserved; null clears external_reference_id or customer_id. This operation cannot change balances, currency, code or status.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Request body

customer_idstring or null

Omission preserves the association; null clears it.

expected_versioninteger
external_reference_idstring or null

Caller-owned identifier for this resource in an external system. Omission preserves the association; null clears it.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X PATCH https://api.withflintpay.com/v1/gift-cards/{gift_card_id} \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "customer_id": "",
    "expected_version": 0,
    "external_reference_id": ""
  }'

Adjust gift card value#

POST/v1/gift-cards/{gift_card_id}/adjustmentsIdempotent

Requires scope commerce.gift_cards.adjustments.write

Posts a relative correction with a typed reason and separate administrative authority. Corrections cannot consume reserved funds, exceed funding limits, or replace linked refunds and purchase reversals.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Request body

amount_moneyobjectRequired

Signed monetary amount represented as integer minor units plus an ISO 4217 currency code.

expected_versioninteger
reasonenumRequired
  • complimentary
  • balance_accidentally_decreased
  • support_issue
  • suspicious_activity
  • balance_accidentally_increased

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards/{gift_card_id}/adjustments \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "amount_money": {
      "amount": 0,
      "currency": "USD"
    },
    "reason": "complimentary"
  }'

Record a cash-out#

POST/v1/gift-cards/{gift_card_id}/cash-outsIdempotent

Requires scope commerce.gift_cards.adjustments.write

Records cash that the merchant attests it paid to the cardholder. Flint does not send cash. The amount cannot exceed available value or consume payment reservations; the external reference identifies the merchant's disbursement record.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Request body

amount_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

expected_versioninteger
external_reference_idstringRequired

Caller-owned identifier for this resource in an external system.

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards/{gift_card_id}/cash-outs \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "amount_money": {
      "amount": 0,
      "currency": "USD"
    },
    "external_reference_id": ""
  }'

Load a gift card#

POST/v1/gift-cards/{gift_card_id}/loadsIdempotent

Requires scope commerce.gift_cards.write

Adds positive value with separately recorded consideration and funding provenance. Limits apply to externally funded value and imports as well as Flint-funded sales. Loading a pending card activates it; loading a frozen card does not remove its restrictions.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Request body

Send exactly one of these

consideration_moneyobject or nullRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

expected_versioninteger
sourceone ofRequired
value_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards/{gift_card_id}/loads \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "source": {
      "funding_source_type": "external_payment",
      "reference_id": ""
    },
    "value_money": {
      "amount": 0,
      "currency": "USD"
    }
  }'

Replace a gift card code#

POST/v1/gift-cards/{gift_card_id}/rotate-codeIdempotent

Requires scope commerce.gift_cards.secrets.write

Invalidates the old bearer credential and generates a new code for the same gift card. Balances, funding, reservations and refund history are preserved. Requires commerce.gift_cards.secrets.write. Include notification to send the new private recipient link. Retired links cannot open the current code.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Request body

expected_versioninteger
notificationobject

Explicitly send or schedule the replacement code through private recipient access. Requires commerce.gift_cards.secrets.write.

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards/{gift_card_id}/rotate-code \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_version": 0,
    "notification": {
      "email": ""
    }
  }'

Transition a gift card#

POST/v1/gift-cards/{gift_card_id}/transitionsIdempotent

Requires scope commerce.gift_cards.write

Freezes spending, removes a merchant freeze, or closes a card after all value and restrictions are resolved. Unfreezing cannot remove unresolved funding-dispute restrictions. Freezing does not release accepted payment reservations.

Path parameters

gift_card_idstringRequired

Flint resource ID.

Request body

Send exactly one of these

actionenumRequired
  • freeze
expected_versioninteger
reasonenumRequired
  • suspicious_activity
  • customer_request
  • support_issue

Response · 200

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards/{gift_card_id}/transitions \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "action": "freeze"
  }'

Look up a gift card code#

POST/v1/gift-cards/lookup

Requires scope commerce.gift_cards.adjustments.write or commerce.gift_cards.read or commerce.gift_cards.redemptions.write or commerce.gift_cards.secrets.write or commerce.gift_cards.write

Evaluates a full bearer code in a request body. Codes contain 16 ASCII Crockford base32 characters, accept lowercase and hyphens, and normalize O to 0 and I/L to 1. Lookup is side-effect-free and never reserves funds. Unknown, other-merchant and unusable codes return the same error.

Request body

codestringRequired

Response · 200

dataobjectRequired

Merchant-issued purchased gift card. Posted balance includes reserved value; available value is balance minus reservations. Frozen value remains part of outstanding liability. Gift cards are independent resources and cannot be transferred across merchants or currencies.

metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/gift-cards/lookup \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "code": ""
  }'

Was this helpful?