Skip to main content

Stablecoin card programs

What it is

Stablecoin card programs back each card with a wallet that holds stablecoins, so the card can spend what the cardholder has loaded into it.

Card issuers, processors and their sponsor banks need to see each top-up as soon as it lands, because a cardholder who just loaded money and is declined at the till stops trusting the card.

Goldsky can watch every backing wallet, read its balance when a top-up lands and tell your card system, while issuing, authorization and the spend limit stay with you.

You can track card-backing wallets three ways: stream each top-up and the new balance to your card system with Turbo Pipelines, call the Feeds transfers and balances APIs for each wallet, or have Feeds sync transfers into your database.

Who it’s for

Card issuers and processors, sponsor banks and stablecoin platforms that run cards backed by a cardholder’s stablecoin wallet.

How a stablecoin card top-up raises the spend limit

Follow one top-up here, from issuing the card to raising its spend limit. Your setup may differ.

Your business, step 1: Issue a cardA cardholder joins your card program
Your business, step 2: Wallet or custody providerCreate the backing walletOne wallet backs the card’s spend
Goldsky, step 3: TurboWatch backing walletsEvery card’s wallet in one live list
Blockchains, step 4: Top-up arrivesStablecoins land in the backing wallet
Goldsky, step 5: TurboRead the new balanceTop-up spotted, balance read at its block
Your business, step 7: Raise the spend limitThe card can spend the new funds
Goldsky, step 6: TurboNotify your card systemA webhook with the top-up and balance
Your business, step 8: Card processorApprove each purchaseChecked against the new limit
  • Goldsky
  • Your provider

Ways to detect top-ups to card-backing wallets

Only the pipeline pushes each top-up to your card system with the wallet’s new balance; the APIs return transfers and balances when your card system calls them, and the synced feed lands transfers in your database for your code to total.

Best for
Many cards, each top-up pushed to your card system
Products
Turbo
What you run
The destination: your database, queue or bucket, or a Postgres database Goldsky hosts
What you write
Pipeline YAML and SQL; TypeScript transforms when needed
Where your data lives
In your own database or systems
How results reach you
Pushed to you
Best for
A small program, wallets checked when needed
Products
Feeds
What you run
Nothing; you call an endpoint and keep what you need
What you write
REST requests
Where your data lives
Hosted by Goldsky
How results reach you
Returned when you call
Best for
Top-ups in your database, with no pipeline to define
Products
Feeds
What you run
The destination database or endpoint
What you write
Nothing to get the rows; your own SQL to use them
Where your data lives
In your own database or systems
How results reach you
Pushed to you

Option 1: Fund stablecoin-backed cards by streaming top-ups to your card system

Goldsky runs a pipeline that watches every backing wallet, picks out each top-up, reads the wallet’s balance and sends both to your card system as a webhook. Your card system raises the spend limit.

When to stream card top-ups with a pipeline

You run many cards, each with its own backing wallet, and the spend limit should move as soon as a top-up lands, without your card system asking.

What you’ll need

  • Goldsky Turbo
  • A wallet provider that creates each card’s backing wallet
  • A database for the list of backing wallets
  • An HTTPS endpoint on your card system
  • Your card management and authorization system
  1. Issue the card

    A cardholder joins the program and gets a card that will spend from stablecoins they load.

    Your card program creates the cardholder record and the card, with a spend limit that starts at what’s been funded. The card ID is what every later top-up and limit change hangs off, so it has to exist before any money arrives.

  2. Create the wallet that backs the card

    The card spends what sits in one wallet, so each card needs a wallet of its own (or a known share of one).

    Your wallet provider creates the backing wallet and holds its keys under your policy, and you record which card the address belongs to. If that link is missing, a top-up lands in a wallet nobody can tie to a card, and the cardholder’s limit never moves.

  3. Watch every backing wallet

    Handled by Goldsky Turbo

    You only see top-ups to wallets you’re watching, so each new card’s wallet joins the list when it’s created.

    The list has to grow as cards are issued and shrink as they’re closed, while everything keeps running. A wallet left off the list takes top-ups the card never hears about.

    With Goldsky, every backing wallet can sit in one Turbo Pipelines dynamic table, which lives in a Postgres database. A new row is matched by the running pipeline with no redeploy.

    Learn about dynamic tables (opens in a new tab)
  4. Receive the top-up

    The cardholder loads the card by sending stablecoins to its backing wallet.

    The transfer is recorded in a block on the chain. For a short time the newest blocks can still be replaced, so a top-up seen once isn’t final yet.

  5. Spot the top-up and read the new balance

    Handled by Goldsky Turbo

    The card system needs both the top-up and what the wallet now holds, because the limit follows the balance.

    Each transfer into a backing wallet has to be caught, and the wallet’s balance read as of that transfer’s block. A balance read from a different moment can include a spend or a second top-up the card system hasn’t seen yet.

    In Turbo Pipelines, dynamic_table_check() filters transfers to your backing wallets, and the pipeline can read each wallet’s balance at the transfer’s block. For stablecoins and other tokens, the balance comes from the balances dataset Goldsky maintains for each chain.

    Track balances for a set of addresses (opens in a new tab)
  6. Notify your card system

    Handled by Goldsky Turbo

    The card system has to hear about the top-up to change anything, ideally without asking.

    Each top-up reaches your card system with the wallet, the amount and the new balance. A notification can arrive twice after a retry, so the card system checks a stable ID before it changes a limit.

    The Turbo Pipelines webhook sink posts each top-up to your card system, retries until it gets a 2xx response, and passes reorg corrections to the same endpoint for your code to apply.

    Set up the webhook sink (opens in a new tab)
  7. Raise the card’s spend limit

    The top-up is done when the cardholder can spend the new money at a till.

    Your card system looks up the card that owns the wallet and sets its available spend from the new balance, once, for that top-up. A limit raised for a top-up the chain later undoes lets the cardholder spend money that isn’t there.

  8. Approve purchases against the new limit

    When the cardholder pays, the card network asks for a yes or no within seconds, and the answer depends on the limit you just raised.

    Your card processor receives the authorization request from the network and either checks the available balance itself or calls your system for the decision, then answers the network. A slow answer is a decline, so the limit it reads has to sit in your own systems, not be fetched from the chain at that moment.

What to know about streaming card top-ups

  • Top-ups are pushed as they land, so your card system never polls the chain.
  • The webhook fires when a top-up is detected, before it’s final; your card system decides how much to make spendable straight away.
  • A top-up undone by a reorg reaches your endpoint as a correction record, which your card system applies to the limit.
  • Goldsky runs the pipeline; you own the endpoint, the spend rules and the authorization decision.

Option 2: Fund stablecoin-backed cards with transfers and balances APIs

Your card system calls the Feeds transfers endpoint to find new top-ups to a backing wallet and the balances endpoint to read what it holds now. There’s no pipeline or database to set up.

When to use wallet APIs for card top-ups

You run a small card program and can check each backing wallet when the cardholder opens the app, before an authorization, or on a timer.

What you’ll need

  • Goldsky Feeds
  • A wallet provider that creates each card’s backing wallet
  • A record of which wallet backs which card
  • Your card management and authorization system
  1. Issue the card

    A cardholder joins the program and gets a card that will spend from stablecoins they load.

    Your card program creates the cardholder record and the card, with a spend limit that starts at what’s been funded. The card ID is what every later top-up and limit change hangs off, so it has to exist before any money arrives.

  2. Create the wallet that backs the card

    The card spends what sits in one wallet, so each card needs a wallet of its own (or a known share of one).

    Your wallet provider creates the backing wallet and holds its keys under your policy, and you record which card the address belongs to. If that link is missing, a top-up lands in a wallet nobody can tie to a card, and the cardholder’s limit never moves.

  3. Receive the top-up

    The cardholder loads the card by sending stablecoins to its backing wallet.

    The transfer is recorded in a block on the chain. For a short time the newest blocks can still be replaced, so a top-up seen once isn’t final yet.

  4. Look up new top-ups to the wallet

    Handled by Goldsky Feeds

    Your card system learns about a top-up by asking for the wallet’s recent incoming transfers.

    The lookup has to cover the window since you last checked and every token the program accepts. Ask too rarely and a cardholder who just loaded money is declined.

    The Feeds transfers endpoint returns a wallet’s incoming transfers when you ask with direction=in, newest first, with the token’s details on each row.

    Read the transfers endpoint reference (opens in a new tab)
  5. Read the wallet’s current balance

    Handled by Goldsky Feeds

    The spend limit follows what the wallet holds, which can differ from the sum of top-ups once the card has spent.

    Read the balance after the top-up and use it to set the available spend. A balance read before the top-up lands leaves the limit where it was.

    With Goldsky, the Feeds balances endpoint returns the latest balance of each token in the wallet, with the block of its most recent change, so you can tell whether it already includes the top-up.

    Read the balances endpoint reference (opens in a new tab)
  6. Wait until the top-up is final

    A top-up you saw can still be undone by a reorg, when the chain replaces its newest blocks.

    Hold back all or part of the new spend until enough blocks sit on top of the top-up, by a rule you set for each chain. The API gives no signal when a transfer is reversed; the transfer stops appearing in its responses.

  7. Raise the card’s spend limit

    The top-up is done when the cardholder can spend the new money at a till.

    Your card system looks up the card that owns the wallet and sets its available spend from the new balance, once, for that top-up. A limit raised for a top-up the chain later undoes lets the cardholder spend money that isn’t there.

  8. Approve purchases against the new limit

    When the cardholder pays, the card network asks for a yes or no within seconds, and the answer depends on the limit you just raised.

    Your card processor receives the authorization request from the network and either checks the available balance itself or calls your system for the decision, then answers the network. A slow answer is a decline, so the limit it reads has to sit in your own systems, not be fetched from the chain at that moment.

What to know about checking card wallets with APIs

  • Your card system pulls, so a top-up shows up only when you ask.
  • The balances endpoint returns the latest balance only, not the balance at a past block.
  • A top-up undone by a reorg stops appearing in responses with no flag, so waiting for finality is your code’s job.
  • Transfers come back without their own ID, so your code decides how to tell a repeat from a second, identical top-up.

Option 3: Fund stablecoin-backed cards with a synced transfers feed

Feeds pushes new transfer rows into your database or to a webhook as they arrive, so your card system reads top-ups from its own tables without calling an API or running a pipeline.

When to sync a transfers feed for card top-ups

You want top-ups pushed into your own database without defining a pipeline, and your card system can work out each wallet’s balance from the rows it receives.

What you’ll need

  • Goldsky Feeds
  • A wallet provider that creates each card’s backing wallet
  • A database or webhook endpoint you run to receive the rows
  • A record of which wallet backs which card
  • Your card management and authorization system
  1. Issue the card

    A cardholder joins the program and gets a card that will spend from stablecoins they load.

    Your card program creates the cardholder record and the card, with a spend limit that starts at what’s been funded. The card ID is what every later top-up and limit change hangs off, so it has to exist before any money arrives.

  2. Create the wallet that backs the card

    The card spends what sits in one wallet, so each card needs a wallet of its own (or a known share of one).

    Your wallet provider creates the backing wallet and holds its keys under your policy, and you record which card the address belongs to. If that link is missing, a top-up lands in a wallet nobody can tie to a card, and the cardholder’s limit never moves.

  3. Receive the top-up

    The cardholder loads the card by sending stablecoins to its backing wallet.

    The transfer is recorded in a block on the chain. For a short time the newest blocks can still be replaced, so a top-up seen once isn’t final yet.

  4. Sync new transfers into your database

    Handled by Goldsky Feeds

    Top-ups reach your card system without it asking, so the limit can move sooner.

    Each new transfer has to arrive as a row or a webhook call with the recipient, token, amount and transaction. A sync that falls behind delays every top-up queued after it.

    Feeds can sync the transfers feed to a Postgres or MySQL database, ClickHouse or a webhook you own, so new rows reach you as they land.

    Sync Feeds to your database (opens in a new tab)
  5. Match the top-up to the card

    A transfer only funds a card once you know which card’s wallet received it.

    Join each transfer to a card on the receiving address, keep only your backing wallets, and record which transfers you’ve applied so none counts twice. Then work out the wallet’s new balance from the top-ups and spends you’ve recorded.

  6. Raise the card’s spend limit

    The top-up is done when the cardholder can spend the new money at a till.

    Your card system looks up the card that owns the wallet and sets its available spend from the new balance, once, for that top-up. A limit raised for a top-up the chain later undoes lets the cardholder spend money that isn’t there.

  7. Approve purchases against the new limit

    When the cardholder pays, the card network asks for a yes or no within seconds, and the answer depends on the limit you just raised.

    Your card processor receives the authorization request from the network and either checks the available balance itself or calls your system for the decision, then answers the network. A slow answer is a decline, so the limit it reads has to sit in your own systems, not be fetched from the chain at that moment.

What to know about syncing a transfers feed for cards

  • New transfers are pushed to you as they arrive, so nothing in your card system polls for them.
  • Rows arrive in the Feeds schema, so your code reads Feeds’ columns as they are.
  • Picking out your backing wallets, working out the new balance and deciding when a top-up is final stay in your code.
  • Goldsky runs the sync; you own the destination and keep it reachable.

Run self-custodial card spend by streaming approvals and debits to your database

Let a card spend stablecoins straight from the cardholder’s own wallet, under a spending limit they approve, and match each onchain debit to the card ledger.

A Turbo Pipelines pipeline records each spending limit cardholders approve for your card program, and each debit from their wallets, in your database. Your authorization service reads them there; the card processor, the sponsor bank and settlement stay with you.

What you’ll need

  • Goldsky Turbo
  • A card processor and a sponsor bank, or your own card network membership
  • A settlement wallet that collects spend from cardholders’ wallets
  • A database for spending limits and debits
  1. Approve a spending limit

    The card spends from the cardholder’s own wallet, so the cardholder first allows it to, up to a limit.

    The cardholder signs an approval, a token allowance, that lets your program’s spender address move up to the limit from their wallet. The funds stay in the wallet until they’re spent, and the cardholder can revoke the approval at any time.

  2. Track each wallet’s spending limit

    Handled by Goldsky Turbo

    Authorization needs to know how much each wallet has allowed the card to spend.

    Every approval to your spender address is kept with the wallet, token and new limit, and the latest one replaces the last. A revoked approval your records miss lets authorization approve spend it can’t collect.

    With Goldsky, a Turbo Pipelines pipeline can decode the token’s Approval events with _gs_log_decode, keep those whose spender is your program’s address and write the latest limit for each wallet to your database.

    Decode contract events (opens in a new tab)
  3. Approve or decline the card payment

    When the card is used, the network asks your program to approve or decline within seconds.

    Your authorization service approves only what both the wallet’s remaining limit and its token balance cover. A wallet emptied after the approval was set leaves a limit with nothing behind it.

  4. Collect the spend from the wallet

    Approved spend is paid by moving stablecoins from the cardholder’s wallet to your settlement wallet.

    Your settlement service moves the amount under the cardholder’s approval. A wallet emptied between authorization and collection leaves the program paying for the purchase itself.

  5. Match each debit to the card ledger

    Handled by Goldsky Turbo

    Each onchain debit has to tie to the card transaction it paid for.

    Every transfer from a cardholder’s wallet to your settlement wallet is recorded with its amount and transaction, then matched to the settled card transaction in your database. A debit with no card transaction behind it is a break to investigate.

    Turbo Pipelines can keep transfers into your settlement wallet whose sender is a linked cardholder wallet, listed in a dynamic table, and write each one beside your card ledger, where you run the match.

    Learn about dynamic tables (opens in a new tab)

What you control

Your team
  • Issue the card
  • Raise the card’s spend limit
Your providers
  • Wallet or custody provider
  • Card processor

Security and deployment

  • SOC 2 Type IIIndependently audited security controls.
  • Dedicated infrastructureSingle-tenant options for production workloads.
  • Data residencyCloud, on-premises or co-located.

Fund stablecoin-backed cards with Goldsky

We’ll map it to your systems and show you what Goldsky runs, so your team builds the product, not the pipelines underneath it.

© Endless Sky Inc. All rights reserved.

PrivacyTermsSecurity

System status