title: Spend Programs source_url: /developer-api/v1/spend-programs summary: Compose Ramp's spend control primitives — funds, spend programs, transactions, webhooks — to manage a recurring budget end-to-end: stamp out funds from a template, share them across a team, watch the spend in real time, and wind down cleanly when the cycle ends. content: Compose Ramp's spend control primitives — funds, spend programs, transactions, webhooks — to manage a recurring budget end-to-end: stamp out funds from a template, share them across a team, watch the spend in real time, and wind down cleanly when the cycle ends. A working pattern for any recurring budget shape — team offsites, monthly stipends, departmental allowances, contractor stipends, per-employee SaaS. The same five steps apply regardless of shape. By the end you'll have: A spend program template that captures the policy once. A live fund minted from that program, scoped to a specific instance (e.g., one offsite). Multiple users sharing the fund, with cards issued automatically. Real-time spend visibility via API and webhooks. A clean wind-down path that doesn't break refunds or audit trails. Estimated time: 30–60 minutes for a working integration. Prerequisite knowledge: Comfortable with REST APIs and bearer auth; basic familiarity with how funds work in Ramp. Required: A Ramp account with API access. An OAuth token with spend_programs:write, funds:write, funds:read, transactions:read, and users:read scopes. Recommended: Read Spend Controls for the funds / spend programs / approvals mental model, and Cards for the card variant a fund issues. Prerequisites: A user ID for an initial member (you'll add more later). Fetch via GET /developer/v1/users. Three objects compose every recurring budget on Ramp. They're independent APIs that plug together cleanly. Spend program — the template. Encodes policy: amount, interval, allowed categories, what kinds of spend are permitted, whether the fund is shareable. Fund — an instance of the template, scoped to a specific user, team, or cycle. Issues a virtual card automatically. Created and managed via the Funds API. Transactions — settled spend against the fund, retrievable with the limit_id filter (pass the fund ID) and streamed in real time via webhooks. Most decisions you make happen at the program level — once. Funds inherit the program's policy. The only per-fund choices are who's on it, what it's called, and when to wind it down. Implementation A spend program template encodes policy once so every fund minted from it inherits the same shape. Key fields: display_name and description — visible to users and reviewers. is_shareable — whether one fund can be shared by multiple users. permitted_spend_types — primary_card_enabled, reimbursements_enabled. spending_restrictions — limit (amount, currency), interval (ANNUAL, MONTHLY, TOTAL, etc.), allowed_categories. This template allows spending on meals (19), lodging (6), and airlines (4) up to $10,000/year per fund minted from it. Verify: the response contains the new spend_program_id. List your spend programs (GET /developer/v1/spend-programs) to confirm. Funds created from a spend program inherit its policy. Provide display_name, spend_program_id, and an initial user_id. Fund creation is synchronous and returns the new fund directly. The 201 response contains the fund's id and its auto-issued virtual card in cards. Verify: GET /developer/v1/funds/$FUND_ID returns the fund with the inherited policy and card. For shareable programs, expand the fund to additional team members. Each user gets access to the shared budget; transactions are still attributed individually. Use DELETE /developer/v1/funds/{fund_id}/members with the same user_ids body to revoke access without terminating the fund. Two reads give you everything you need to monitor a budget in flight. For real-time updates, subscribe to the transactions.cleared webhook event. The event fires on settlements, refunds, and reversals; check the amount field for sign. See Webhooks. When the cycle ends, suspend or terminate. Suspend is reversible. Stops new spend on the fund without affecting cards' ability to draw from other funds they're attached to. Terminate is irreversible. Use only when you're certain the fund won't return. Refunds and reversals route correctly even after suspension or termination — they appear as negative amount values on transactions.cleared and reconcile to the original fund. Synchronous fund lifecycle. Fund creation, suspension, unsuspension, and termination return their result directly. Don't build deferred-task polling into these flows. Webhook subscriptions. Subscribe to transactions.cleared before going live. The webhook fires for settlements and refunds; rely on amount sign, not event type, to distinguish. Choose your interval carefully. ANNUAL, MONTHLY, and TOTAL are not interchangeable. TOTAL is a lifetime cap; MONTHLY resets every month; ANNUAL resets every year on the program's creation anchor. Decide upfront: one shared fund or many individual. is_shareable: true for team budgets where members coordinate (offsites, events). Individual funds when each person needs a distinct allowance with its own restrictions (per-employee SaaS, contractor stipends). Audit trails persist past termination. Transactions, refunds, and reversals stay queryable for historical reporting after a fund is terminated. Agentic Payments — spend programs and funds constrain what an AI agent can spend per merchant and per amount. Embedded Cards — expose a fund-backed card to the user's browser through an iframe. Vault API — retrieve a fund-backed card in an approved server-side flow. Procurement Integrations with the Blank Canvas API — spend programs back the intake form templates routed through external approvals. Spend Controls — the Product hub for funds, spend programs, and approvals. Cards — card variants and lifecycle. Every fund issues a virtual card. Spend Programs — create, list, and inspect program templates. Funds — mint funds, add or remove members, suspend, and terminate. Transactions — read settled spend with the limit_id filter, passing the fund ID. Webhooks — subscribe to transactions.cleared for real-time spend, refunds, and reversals. Authorization — spend_programs:write, funds:write, funds:read scopes. FAQ Yes. Funds without cards are usable for reimbursements only. No. The program-to-fund relationship is set at mint time. To change policy, terminate and re-mint from the new program. Suspending a fund stops new spend from that fund. Cards attached to it stay active and can still spend from other funds they're linked to. Suspending a card stops all spend on that card without touching the funds. Yes. Refunds and reversals route to the original fund even after termination. Watch for negative amount values on the transactions.cleared webhook. One shared fund (is_shareable: true) for team budgets where members coordinate spend (offsites, events). Individual funds when each person needs a distinct allowance with its own restrictions (per-employee SaaS, contractor stipends). Spend programs when the same fund shape recurs — quarterly offsites, monthly stipends, departmental budgets. Direct fund creation for one-offs and tests.