Skip to main content

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.
Giving each ad account or campaign its own virtual card solves all three: 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 userId:
Pick the member with inviteStatus: "approved" whose email matches your cardholder, and store the userId in your configuration.
3

Pick the category

Choose the category that fits advertising spend and keep its 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 card title is how you, finance and the dashboard will recognise each card. Use a consistent format that starts with your own reference:
Starting with the reference lets you find the card later with GET /cards?title=CMP-0001.

Create each card

Handle each outcome

Same as in Issue cards to your team:
  • 201: card ready. Store the card id against the campaign.
  • 201 with status: "pending": created, still being set up. Store the id and poll the Location header until active.
  • 202 with status: "pendingApproval": waiting for an approver. Store the approvalRequestId; once approved, find the card with GET /cards?title=CMP-0001.

Rules for running a batch reliably

  1. Build each Idempotency-Key from your campaign reference, for example ads-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.
  2. Save each result immediately before moving to the next campaign.
  3. Send requests one after another, not in parallel. On 429, back off and retry with the same key.
  4. Stop the batch on errors that affect everything. CARD_CREATION_REQUIRES_DEPOSIT, 401 and 403 will 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.
  • The link expires after 1 minute. Request it only when the button is clicked. Never store or log it.
  • Call reveal from your backend only. Your API key must never reach the browser.
  • Restrict the button to media buyers who should see card numbers. The cards:read_vault scope covers every card in the business.
6

Track spend per campaign

Each card reports its own spend, so campaign attribution needs no reconciliation.One campaign:
Compare spentAmount with spendCap to see budget used, for example USD 1,120 of 1,500 (75%).All campaigns:
Page through the results and join them to your campaigns using the reference at the start of each title. Typical uses:
  • 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.
For account-level credit, use 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:
spendCap is the new total, not an increment. To add USD 1,000 to a USD 1,500 campaign, send 2500.00. The new cap can’t be lower than what’s already been spent (SPEND_CAP_TOO_LOW), and its currency must match the card.
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

Reads campaigns.json, creates one top-up card per campaign, and writes results to results.json as it goes. Requires Node 18+.
Re-running is safe: campaigns that already have a card return the same card, thanks to the idempotency key.

Go-live checklist

  • One approved team member holds the campaign cards
  • Card titles start with your campaign reference
  • Idempotency-Key built from the campaign reference
  • Total budget checked against unallocatedCredit before each batch
  • 201 and 202 pendingApproval all handled and saved
  • Retries limited to 409, 429 and 503, 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