Why one card per campaign?
Advertising teams often run dozens or hundreds of ad accounts and campaigns across ad platforms at once. Paying for all of them with one shared card creates problems:- You can’t tell which campaign spent what without manual reconciliation.
- One overspending campaign eats everyone’s budget.
- If the card is compromised or blocked by a platform, every campaign stops.
This is the “when a media buyer launches 50 new campaigns in our internal tool, each one automatically gets its own card with its budget loaded. When a campaign needs more budget, we raise its cap. When it ends, the card is closed” use case. Finance sees spend per campaign with no reconciliation.
How it works
Before you begin
- Business Account API access is enabled and you have an API key with the scopes above. See Authentication.
- Your business has deposited funds and has enough credit to cover all campaign budgets combined. See How to add funds to your Reap Account in the Help Center.
- One approved team member will hold the cards, typically the head of performance marketing or a finance admin.
- You know whether your business uses Approvals. Approval is a dashboard feature: if your business uses it, cards created through the API are subject to it and each card in the batch creates its own approval request in the Business Account dashboard. If your business doesn’t use it, it never applies. See How do I set up approval workflows for my team? in the Help Center.
- This guide builds on Issue cards to your team. Read it first if you’re new to the API.
1
Plan the batch and check credit
Start from a list of campaigns in your own system, each with a stable reference and a budget:Add up the budgets and check your account can cover them:Compare your total with
unallocatedCredit: credit not yet set aside for other cards, and the best guide to how much new campaign budget you can hand out. Balances are calculated at request time, so check just before each batch.2
Pick the cardholder
All campaign cards are held by one approved team member. Find their Pick the member with
userId:inviteStatus: "approved" whose email matches your cardholder, and store the userId in your configuration.3
Pick the category
id. The examples below use marketing; replace it with the id your account returns.4
Create one card per campaign
Name every card after its campaign
The cardtitle is how you, finance and the dashboard will recognise each card. Use a consistent format that starts with your own reference:GET /cards?title=CMP-0001.Create each card
Handle each outcome
Same as in Issue cards to your team:201: card ready. Store the cardidagainst the campaign.201withstatus: "pending": created, still being set up. Store theidand poll theLocationheader untilactive.202withstatus: "pendingApproval": waiting for an approver. Store theapprovalRequestId; once approved, find the card withGET /cards?title=CMP-0001.
Rules for running a batch reliably
- Build each
Idempotency-Keyfrom your campaign reference, for exampleads-2026-10-CMP-0001. If the batch stops halfway and you re-run it, cards already created come back as-is instead of being duplicated. - Save each result immediately before moving to the next campaign.
- Send requests one after another, not in parallel. On
429, back off and retry with the same key. - Stop the batch on errors that affect everything.
CARD_CREATION_REQUIRES_DEPOSIT,401and403will fail every request, so fix the cause first.
5
Add each card to its ad account
To set up billing on an ad platform, the media buyer needs the card number, expiry and CVV. Show them in the secure, Reap-hosted window right inside your campaign tool:A typical flow: a Show card button next to each campaign in your tool. The media buyer clicks it, copies the card number into the ad platform’s billing settings, and moves on to the next campaign.
6
Track spend per campaign
Each card reports its own spend, so campaign attribution needs no reconciliation.One campaign:Compare Page through the results and join them to your campaigns using the reference at the start of each title. Typical uses:
spentAmount with spendCap to see budget used, for example USD 1,120 of 1,500 (75%).All campaigns:- A budget pacing dashboard showing spend vs. budget per campaign.
- An alert at 80% of cap so the team can top up before ads stop.
- A daily sync of spend into your BI or finance system.
GET /cards/balances. For activity across all cards, use GET /cards/activities.7
Top up running campaigns
When a campaign performs well and needs more budget, raise its cap:
8
Close cards when campaigns end
Closing cards at the end of each campaign keeps your card list clean and stops leftover budget from being spent later, for example by a platform that keeps billing after a campaign ends.
Complete example: Node.js batch script
Readscampaigns.json, creates one top-up card per campaign, and writes results to results.json as it goes. Requires Node 18+.
Go-live checklist
- One approved team member holds the campaign cards
- Card titles start with your campaign reference
Idempotency-Keybuilt from the campaign reference- Total budget checked against
unallocatedCreditbefore each batch 201and202 pendingApprovalall handled and saved- Retries limited to
409,429and503, with the same key - Reveal called from your backend, on demand, for authorised media buyers only
- Alert when a card nears its cap
- Cards terminated when campaigns end