# Ramp Developer API ## Guides # Ramp Developer API Guides Plain-text guide export for Ramp's Developer API. title: AI Index source_url: /developer-api/v1/ai-index text_url: /llms-guides/ai-index.txt summary: AI Index is subject to change. Feedback and questions can be submitted via a Developer API support ticket. content: AI Index is subject to change. Feedback and questions can be submitted via a Developer API support ticket. AI Index measures the adoption rate of artificial intelligence products and services among American businesses. Our sample includes more than 50,000 American businesses and billions of dollars in corporate spend using data from Ramp's corporate card and bill pay platform. Our work builds on previous work by Bonney et al. (2024) by using Ramp transaction data to measure business adoption of AI products and services. Firms are considered to have adopted AI tools if they have a positive transaction amount for an AI product or service in a given month. Because AI Index is based on observed paid transactions, it likely undercounts total AI adoption when businesses use free tools or employees use personal accounts for work-related AI usage. For the full methodology and latest writeup, see Ramp's AI Index page. Metric definitions AI adoption share measures the percentage of businesses in the relevant cohort that had a positive transaction amount for an AI product or service in a given month. Industry sector is the NAICS-based grouping used to compare AI adoption across different parts of the economy. Sectors are assigned using internal company models. Company size segment is the size bucket used to compare AI adoption across businesses of different scales. Size segments are assigned using internal company models together with internal and third-party revenue and employee-count data. REST API Use the public AI Index API to inspect overall AI adoption, vendor concentration, industry sector trends, and company size patterns over time. Base URL: https://api.ramp.com/v1/public/ai-index GET /adoption Get overall AI adoption metrics and vendor breakdowns as monthly records. GET /adoption/sectors Get AI adoption rates by industry sector as monthly records. GET /adoption/sizes Get AI adoption rates by company size segment as monthly records. All three AI Index endpoints support an optional months query parameter: months integer 1 Number of months of history to return. 1 returns the latest available month. You can request up to 120 months, and the response may contain fewer months if less history is available. All AI Index endpoints return a {"data": [...]} wrapper containing zero or more monthly records. GET /adoption returns monthly records with a month, an overall ai_adoption_share, and a vendor breakdown. GET /adoption/sectors returns monthly records with a month and a sectors array. GET /adoption/sizes returns monthly records with a month and a sizes array. If no data is available for the request, the API returns {"data": []} with HTTP 200. MCP AI Index is queryable conversationally via Ramp Data MCP — Ramp's public-data MCP server. One connection queries both AI Index and Ramp Rate; setup matrix and client configs live on that page. ai_index_get_adoption Get AI adoption history with vendor breakdown. Supports months from 1 to 120; 1 returns the latest available month, and responses may contain fewer months when less history is available. ai_index_get_adoption_by_sector Get AI adoption history broken down by industry sector. Supports months from 1 to 120; 1 returns the latest available month, and responses may contain fewer months when less history is available. ai_index_get_adoption_by_size Get AI adoption history broken down by company size. Supports months from 1 to 120; 1 returns the latest available month, and responses may contain fewer months when less history is available. The same MCP server also exposes Ramp Rate tools — see Ramp Rate → Available Ramp Rate tools. Ramp Rate — software category and vendor benchmarks. Shares the same MCP server. GET /v1/public/ai-index/adoption — overall AI adoption with vendor breakdown. GET /v1/public/ai-index/adoption/sectors — adoption by industry sector. GET /v1/public/ai-index/adoption/sizes — adoption by company size segment. --- title: Applications source_url: /developer-api/v1/applications text_url: /llms-guides/applications.txt summary: Pre-fill a Ramp application on behalf of a new business as a Ramp partner. Ramp emails the applicant, they finish sign-up in the Ramp UI, and your platform gets API access to the new business through OAuth. content: Pre-fill a Ramp application on behalf of a new business as a Ramp partner. Ramp emails the applicant, they finish sign-up in the Ramp UI, and your platform gets API access to the new business through OAuth. A partner-led customer onboarding flow: Your platform POSTs an application with the applicant's information. Ramp emails the applicant a sign-up invite. The applicant accepts the invite and (optionally) grants your app OAuth scopes on the new business. The applicant completes and submits the application in the Ramp UI. Ramp reviews; your platform receives status updates via webhook. The API creates and pre-fills the application but does not submit it — the applicant always finalizes submission in the Ramp UI. Required: A Ramp app registered in the Ramp Developer Console with the Client Credentials grant type enabled. The POST endpoint takes no scopes; reading status afterward requires applications:read granted on the new business via the Authorization Code flow. Recommended: Read Partner Integrations for the broader partnership context, listing requirements, and security expectations. Prerequisites: A registered HTTPS redirect_uri if you want to capture the applicant's OAuth grant on completion. Three actors: your platform, Ramp, and the applicant. Ramp brokers the email handoff and the OAuth grant. Implementation POST /developer/v1/applications with the applicant's information. Authenticate with Client Credentials; the endpoint takes no scopes. The response is 202 Accepted with no body — Ramp creates the business and queues the invite asynchronously. The endpoint is designed to be safely retried: If the applicant's email doesn't exist in Ramp, a new business and application are created. If the email already exists and the business is still in the application stage, Ramp re-sends the invitation email. If the business is already approved, the request is a no-op. Include oauth_authorize_params in the POST body to route the applicant through your app's OAuth consent screen after they accept the invite: After sign-up, Ramp shows the applicant your app's consent screen requesting applications:read and applications:write. On approval, Ramp redirects to your redirect_uri with code and state. Exchange the code for an access token per the Authorization Code flow. Without oauth_authorize_params, the applicant is sent directly to the Ramp application after accepting the invite — no consent screen. You can prompt them to authorize the connection later. redirect_uri requirements The redirect_uri must be registered in your app's configuration in the Ramp Developer Console and must use HTTPS (or localhost for development). After the OAuth handoff — or at any point after submitting — link the applicant to Ramp's sign-in page to finish their application: The email query parameter is optional. When provided, it auto-populates the email field on the sign-in page. Invite must be accepted first The applicant won't be able to sign in until they've accepted the email invite from Ramp. If they haven't received or accepted the invite yet, direct them to check their inbox first. Applications walk a status enum: STARTED Application has been created but the applicant hasn't completed sign-up yet. IN_REVIEW Application has been submitted and is under review by Ramp. FOLLOW_UPS_REQUIRED Ramp needs additional information from the applicant. APPROVED Application has been approved — the business can start using Ramp. REJECTED Application has been rejected. WITHDRAWN Application has been withdrawn by the applicant. Call GET /developer/v1/applications to fetch the current status. This endpoint requires the applications:read scope obtained via the Authorization Code flow in step 2. Subscribe to the applications.status_updated webhook so your platform reacts in real time rather than polling. Payload: When you receive the event, call GET /developer/v1/applications to fetch the full application details. See Webhooks for subscription and signature verification. Partner approval. Production listing on Ramp's Integrations page requires going through the partner launch checklist. See Partner Integrations. Webhook reliability. Verify webhook signatures and treat the status-updated event as the canonical trigger for downstream workflows; the GET endpoint is the source of truth on read. Error recovery. The POST endpoint is idempotent on applicant email — safe to retry. Treat 5xx responses as retryable; treat 4xx as permanent until the body changes. Partner Integrations — partner program: pricing, listing, security, support expectations. Applications — submit applications, fetch status. Authorization — Client Credentials for POST, Authorization Code for read after the applicant grants applications:read. Webhooks — subscribe to applications.status_updated for real-time status changes. --- title: Authorization source_url: /developer-api/v1/authorization text_url: /llms-guides/authorization.txt summary: Ramp uses OAuth 2.0 for secure API access, providing granular permission control through scopes and supporting multiple authorization flows for different use cases. Ramp authenticates requests to /developer/v1/token using your client ID and client secret, typically with HTTP Basic Auth. content: Ramp uses OAuth 2.0 for secure API access, providing granular permission control through scopes and supporting multiple authorization flows for different use cases. Ramp authenticates requests to /developer/v1/token using your client ID and client secret, typically with HTTP Basic Auth. This guide covers the authorization framework in depth. For a quick start making your first API calls, see the Setup Guide. OAuth 2.0 Framework Ramp implements the OAuth 2.0 authorization framework with the following components: Resource Server: Ramp's API endpoints that serve protected resources Authorization Server: Ramp's OAuth service that issues access tokens Client: Your application requesting access to Ramp resources Resource Owner: The Ramp business granting access to their data Client Credentials Internal integrations, server-to-server None required Authorization Code Third-party apps, public integrations Authorized user consent required Permission model and scopes Ramp's permission model uses OAuth 2.0 scopes to control access to different resources and operations. Each scope follows the pattern resource:permission where: resource: The API resource (e.g., transactions, bills, users) permission: The allowed operation (read or write) The examples below are not exhaustive. Review each endpoint's API reference for its required scopes, and configure only the scopes your app needs. accounting:read Accounting data Access accounting sync status and metadata applications:read Applications View financing application status applications:write Submit and manage financing applications accounting:write Update accounting sync settings and connections bank_accounts:read Bank accounts View connected bank account information bills:read Bills Access bill data and payment history bills:write Create, update, and pay bills business:read Business profile Access business information and settings cards:read Cards View card information and spending limits cards:read_vault Card vault Access sensitive card data (PAN, CVV) cards:write Create, update, and manage cards cashbacks:read Cashback rewards View cashback earnings and history custom_records:read Custom records Access custom data fields and records custom_records:write Create and update custom data fields departments:read Departments View department structure and assignments departments:write Create and manage departments entities:read Legal entities Access entity information and hierarchies item_receipts:read Item receipts View itemized receipt data leads:read Sales leads Access lead and referral information leads:write Create and update lead information limits:read Spending limits View spending limits and policies limits:write Create and modify spending limits locations:read Locations View location data and assignments locations:write Create and manage location data memos:read Memos Access transaction memos and notes memos:write Add and update transaction memos merchants:read Merchants View merchant information and policies purchase_orders:read Purchase orders Access purchase order data and status receipt_integrations:read Receipt integrations View receipt integration settings receipt_integrations:write Configure receipt integration settings receipts:read Receipts Access receipt images and data receipts:write Upload and manage receipt data reimbursements:read Reimbursements View reimbursement requests and status spend_programs:read Spend programs Access spend program configuration spend_programs:write Create and manage spend programs statements:read Statements Download monthly statements transactions:read Transactions Access transaction data and history transfers:read Transfers View transfer history and status users:read Users Access user profiles and roles users:write Create and manage user accounts vendors:read Vendors View vendor information and payment details vendors:write Create and update vendor information When requesting scopes for your application: Principle of Least Privilege: Only request scopes your application actually needs Read vs Write: Start with read-only access and add write permissions as needed Sensitive Data: Scopes like cards:read_vault require additional security review Related Resources: Some operations may require multiple scopes (e.g., creating cards may need both cards:write and users:read) Token management Access tokens issued by Ramp have the following characteristics: Format: Opaque tokens (not JWT) Lifetime: 10 days (864,000 seconds) for Client Credentials access tokens; 1 hour (3,600 seconds) for Authorization Code and Refresh Token access tokens Scope Binding: Tokens are bound to specific scopes and cannot be used beyond granted permissions Environment Isolation: Tokens work only in the environment where they were issued Token Security Access tokens provide complete access to granted scopes. Treat them as credentials: Never log tokens or include them in error messages Store tokens encrypted at rest Use HTTPS for all API communications Implement token rotation for long-running applications Monitor for unusual API usage patterns Authorization flow deep dive Best for server-to-server integrations where no user interaction is required. Ramp typically uses HTTP Basic Auth for token requests in this flow: send client_id:client_secret, base64-encoded, in the Authorization: Basic ... header. Some clients may be configured to send client_id and client_secret in the form body instead. When to Use: Internal company integrations Backend services accessing Ramp data Automated workflows and data sync Security Considerations: Client secret must be kept secure and never exposed in client-side code Suitable for confidential clients (servers, not mobile apps or SPAs) No user context - operates with the permissions of the app creator Required for third-party applications and public integrations. Use this flow if you're building a public integration or need users to explicitly grant access to their Ramp accounts. This flow is required for third-party applications acting on behalf of other businesses (e.g. apps listed on ramp.com/integrations). Third-party integrations Multi-tenant applications Apps requiring user-specific permissions Requires HTTPS redirect URIs State parameter must be cryptographically random and verified Authorization codes have short lifetimes (10 minutes) Users must have permission to authorize Developer API applications; this is typically limited to Admin and Business Owner users Step 1: User is redirected to Ramp authorization URL There are five required parameters in this request: response_type Required — Must be set to code. scope Required — Space-separated list of scopes (e.g., transactions:read business:read). client_id Required — Your app's client ID from the Ramp Developer Console. redirect_uri Required — Must match exactly one of the URIs configured in your app. state Required — Protects against CSRF; should be unique and verifiable by your app. Older apps may not be forced to send state, but new integrations should always include it. Example URL: Your application must direct the user to Ramp's OAuth authorization endpoint. This initiates the flow by asking the user to log in and approve your app. Step 2: User authenticates and approves access Authorized consent required Only users with the required Developer API authorization permissions can authorize third-party applications. This is typically limited to Admin and Business Owner users. If a user with insufficient permissions attempts to authorize your app, they will receive a "Business not authorized to use this application" error. The user logs in to Ramp and is shown a screen prompting them to approve your app's requested access. Upon approval, Ramp redirects to your redirect_uri with a temporary code and the original state: Extract the code from the URL to proceed to token exchange. Step 3: Exchange the code for an access token Step 4: Refresh the access token Tokens expire. Use the refresh token to obtain a new access token: Error handling invalid_client Client authentication failed Verify client ID and secret are correct invalid_grant Authorization code expired or invalid Restart authorization flow with new code invalid_scope Requested scope not configured for app Update app configuration or request different scopes unauthorized_client Grant type not enabled for this client Enable required grant type in app settings access_denied User denied authorization request User must approve access or contact admin When using access tokens with API endpoints: 401 Unauthorized: Token is missing, expired, or invalid 403 Forbidden: Token is valid but lacks required scope for the resource 429 Too Many Requests: Rate limit exceeded (see Rate Limiting) FAQ Need help? Submit a Developer API support ticket and our team will follow up. Review the API endpoints your app will use. Each endpoint's documentation lists required scopes. Start with read-only scopes and add write permissions as needed. No, each environment requires separate app configurations. Create one app in sandbox for testing and another in production for live usage. For security reasons, only users with the required Developer API authorization permissions can grant OAuth2 permissions to third-party applications. This is typically limited to Admin and Business Owner users and ensures proper oversight of data access. Client Credentials access tokens last 10 days. Authorization Code and Refresh Token access tokens last 1 hour, and refresh tokens can be used to get new access tokens. Implement refresh logic before expiration rather than waiting for 401 errors. The authorization server will return an invalid_scope error. Configure all required scopes in your app settings before requesting them in authorization flows. No, scopes are bound to tokens at issuance time. To change scopes, you must obtain a new access token with the updated scope configuration. Only users with the required Developer API authorization permissions can authorize third-party applications Ask your customer to have an Admin, Business Owner, or another user with the required permissions complete the authorization flow Users without these permissions cannot grant OAuth2 permissions for security reasons The customer should verify their role in Settings > Team Admin and Business Owner roles are clearly labeled in the Ramp UI and usually have the required authorization permissions If uncertain, they should contact their Ramp administrator --- title: Bill Pay source_url: /developer-api/v1/bill-pay text_url: /llms-guides/bill-pay.txt summary: A bill is the structured accounts payable record in Ramp — the object that powers approvals, coding, and payment. content: A bill is the structured accounts payable record in Ramp — the object that powers approvals, coding, and payment. For product details, see the Ramp Help Center. How bills work A bill carries the vendor, amount, due date, line items, and the payment details that fund it. Payments are nested — there are no dedicated payment endpoints — so creating a bill via API includes the payment shape in the same request. Payment info is returned as part of the bill object on GET /bills. Bills move through the following statuses: Draft → Invoice uploaded, OCR extracts details. Pending approval → Awaiting approver sign-off in Ramp. Approved → Ready for payment. Bills follow your customer's configured approval policy in Ramp — see Spend Controls for the policy surface, or the help center article for product-side configuration. Paid → Payment processed. Bills created via API are automatically approved and enter the workflow at the Approved status. Draft bill endpoints Draft bills can be created and updated through the API, but they can only be approved in the Ramp dashboard — approval via API is not supported. A bill chooses a payment method, and each method carries its own shape on POST /bills. Common options include: Card Pay by Ramp card (existing or single-use virtual). Earns cashback. Real-time ACH Bank transfer via verified vendor bank account. 2–3 business days Check Mailed check to vendor's address on file. 5–7 business days Wire Same-day domestic wire transfer. Same-day SWIFT International wire transfer. Varies Use POST /bills to create an approved bill with nested payment details. The request requires several UUIDs; fetch them from the endpoints below before building the request. GET /entities id entity_id bank_accounts[].id where usage_type = BILL_PAY_BANK_ACCOUNT source_bank_account_id GET /vendors vendor_id GET /vendors/{id}/contacts vendor_contact_id GET /vendors/{id}/accounts id for ACH, wire, and SWIFT payments vendor_account_id Pick a payment method below and the builder will assemble the POST /bills request for it. For the full implementation path, including attachments and production checks, see the Bill Payments Use case. A bill can be verified against an upstream purchase order and item receipt — when all three documents share the same purchase_order_line_item_ids, you have a verified match. See Bill Payments for the procedure and Procurement for the upstream of how POs come to exist. A Vendor is the bill-pay payee — the entity you pay. Vendors carry contacts (email, phone, address) and bank accounts (for ACH, wire, or check). Each business maintains its own vendor list. Key fields: vendor_contact_id — default contact for payments. vendor_account_id — default bank account for payments. accounting_vendor_remote_id — links the vendor to the ERP coding value used at GL export. GET /developer/v1/vendors List vendors. /developer/v1/vendors/{id} Get a vendor. /developer/v1/vendors/{id}/contacts Get vendor contacts. /developer/v1/vendors/{id}/accounts Get vendor bank accounts. PATCH /developer/v1/vendors/{vendor_id} Update a vendor. For how Vendors relate to the read-only Merchants on card transactions and the Accounting Vendors used for GL coding, see Data relationships. Approvals. Bill approvals can't be triggered or managed via API. Bills created via API are auto-approved; draft bills must be approved in the Ramp dashboard. Payments. Payments are nested in bills and have no dedicated endpoints. Update support is limited once a payment is created. Batch payments — one payment across multiple bills — aren't supported. Documents. OCR upload for draft bills isn't supported via API; images of invoices can't be attached via API (PDFs work). Entity bank accounts. Not manageable via API. Vendor bank accounts are — see /developer/v1/vendors/{id}/accounts. UCSV. Bills can't be synced via API with Universal CSV — use the dashboard export. AI Agents — agents can search and read bills via MCP (bill approvals are on the roadmap). Bill Payments — create approved bills via API and pay vendors end-to-end. ERP Integrations — sync bills and payments to your accounting system. Procurement Intake — receive intake requests and read POs that downstream bills match against. Cards — pay bills with a Ramp card for cashback. Spend Controls — the approval policy that gates bills before payment. Procurement — the purchase order a bill matches against. Bills — create, list, fetch, update, and archive bills. Includes nested payment details. Vendors — bill-pay payees, contacts, bank accounts. Bank Accounts — verified funding sources for bill payment. Transfers — wire-transfer payment objects, including bill-related transfers. Webhooks — subscribe to bills.* events. Pagination — paginate GET /bills. Authorization — bills:read / bills:write scopes. --- title: Bill Payments source_url: /developer-api/v1/bill-payments text_url: /llms-guides/bill-payments.txt summary: Create approved bills via the API, attach documents, choose a payment method, and pay vendors end-to-end — without forcing your AP team to leave your stack. content: Create approved bills via the API, attach documents, choose a payment method, and pay vendors end-to-end — without forcing your AP team to leave your stack. An integration that creates and pays bills programmatically. By the end you'll have: A working POST /bills request that resolves every required UUID upfront. A payment method selected per bill — card (cashback), ACH, check, wire, or SWIFT — with the right shape for each. Invoice and supporting documents attached to the bill. Optional 3-way match against an upstream purchase order and item receipt. Estimated time: 1–2 hours for a working integration. Prerequisite knowledge: OAuth on Ramp, the Bill Pay mental model, and how Vendors relate to Merchants and Accounting Vendors (see Data relationships). Required scopes: bills:write to create bills; bills:read to read; entities:read and vendors:read to resolve UUIDs. Required configuration: Bill Pay must be enabled for your organization. Verify by calling GET /entities and confirming a bank account with usage_type = BILL_PAY_BANK_ACCOUNT is present. If it isn't, follow the Bill Pay set-up guide in the dashboard, then retry. Recommended: Read Bill Pay for the bill lifecycle and Spend Controls for how approvals gate bills. A bill created via the API skips the draft phase and lands in Approved. From there, Ramp processes the payment using the method you chose; the bill moves to Paid once the payment clears. Webhooks fire at each transition. Bills created via API are auto-approved. If your customer's policy requires human approval before payment, use the draft-bill endpoints instead — but draft bills can only be approved through the Ramp dashboard, not the API. Implementation POST /bills requires several IDs. Fetch them from the endpoints below and reuse them across bills wherever possible. GET /entities id entity_id bank_accounts[].id where usage_type = BILL_PAY_BANK_ACCOUNT source_bank_account_id GET /vendors vendor_id GET /vendors/{id}/contacts vendor_contact_id GET /vendors/{id}/accounts id (ACH / wire / SWIFT only) vendor_account_id Missing BILL_PAY_BANK_ACCOUNT? If you don't see a bank account with usage_type = BILL_PAY_BANK_ACCOUNT in your GET /entities response, Bill Pay isn't enabled for your organization yet. Follow the Bill Pay set-up guide to configure it, then retry your API call. Verify: every UUID you'll need for the next step is in hand and points at an active object. Five payment methods. Each carries a different shape on POST /bills. Card — pay by Ramp card. Earns cashback. Two card options: Existing Ramp card — use an already-issued card. Share card details with the vendor manually, then rely on Ramp's automatic transaction matching to link the payment to the bill once it clears. Single-use virtual card — Ramp generates a unique virtual card per bill, with the limit set to the bill amount. Two delivery options: Card delivery disabled — card details become available once the bill is approved; share with the vendor manually. Card delivery enabled — Ramp emails the vendor's primary contact on the due date, with reminders at 2, 4, and 7 days. Card delivery disabled — card details become available once the bill is approved; share with the vendor manually. Card delivery enabled — Ramp emails the vendor's primary contact on the due date, with reminders at 2, 4, and 7 days. Single-use cards auto-lock when the spending limit is reached, after 14 days (delivery enabled) or 21 days (delivery disabled). Transaction matching happens automatically once payments clear. Supports international bills in local currency. For programmatic access to full card details (PAN/CVV), see Virtual cards. To filter out one-time card transactions in the Transactions API, set has_no_sync_commit=true. ACH, check, wire, and SWIFT — all require a source_bank_account_id from GET /entities. ACH Verified vendor bank account 2–3 business days Check Vendor address 5–7 business days Wire Same-day (domestic) SWIFT Varies (international) Payments arrive by payment_arrival_date (cannot be a weekend or bank holiday). Non-check payments require a verified vendor bank account via GET /vendors/{id}/accounts. Check payments require a vendor address on file. Expedited ACH and wire payments are not available via API. Pick a method below and the builder will assemble the POST /bills request for it — card bills nest a different sub-object than ACH bills, so the shape changes per method. Upload invoice PDFs or supporting documents using POST /bills/{bill_id}/attachments. The endpoint accepts multipart/form-data. POST /developer/v1/bills/{bill_id}/attachments Upload an invoice or supporting document (multipart/form-data). Shape callout: Verify: GET /bills/{bill_id} returns the attachment in the bill's attachments array. If the bill comes from an approved purchase order, verify a 3-way match — bill, PO, and item receipt all reference the same line items. Get the bill → extract purchase_order_ids, line_items[].purchase_order_line_item_id, and inventory_line_items[].purchase_order_line_item_id. Get the purchase order → extract item_receipt_ids. Get the item receipt → confirm line_items[].purchase_order_line_item_id matches the bill. When all three documents share the same line-item IDs, you have a verified match. See Procurement Intake for the upstream of how POs come to exist. Subscribe to bill webhooks. Listen for bills.created, bills.approved, bills.paid, and bills.rejected to drive status in your UI without polling. See Webhooks. Idempotency on retries. Pass an idempotency_key on POST /bills so a retry doesn't double-create a bill (or double-pay a vendor). Validate up front, not on submit. Check that the vendor has the right account type (ACH requires vendor_account_id; check requires an address) before assembling the request. Ramp returns clear 400s on submission, but failing fast in your UI is friendlier. Mind the API limitations. Bills created via API are auto-approved; approval-workflow gating happens in Ramp, not via API. Payments are nested in bills and have limited update support once created. Batch payments (one payment across multiple bills) aren't supported. Sync to ERP. Bills sync automatically with direct accounting connections (QuickBooks, NetSuite, etc.). For custom integrations, use the sync_status model — see ERP Integrations. UCSV restriction Bills cannot be synced via API with Universal CSV. Use the dashboard export instead. ERP Integrations — sync bills and payments to your accounting system after they clear. Procurement Intake — bills produced downstream of an approved procurement request. Bill Pay — the Product hub for bills. Data relationships — how the bill-pay Vendor relates to card Merchants and ERP Accounting Vendors. Cards — pay bills with a Ramp card for cashback. Spend Controls — the approval policy that gates bills. Bills — create, list, fetch, update, and archive bills. Includes nested payment details. Bank Accounts — verified funding sources for bill payment. Transfers — wire-transfer payment objects, including bill-related transfers. Vendors — bill-pay payees, contacts, bank accounts. Entities — legal entities and their bill-pay bank accounts. Webhooks — subscribe to bills.* events. Pagination — paginate GET /bills. Authorization — bills:read / bills:write scopes. --- title: AI Agents source_url: /developer-api/v1/build-for-ai-agents text_url: /llms-guides/build-for-ai-agents.txt summary: Give an AI agent read access, action authority, and (with approval) real purchasing power on Ramp — through MCP, the Ramp CLI, or both. Every action respects the authenticated user's role and lands in the Ramp audit log. content: Give an AI agent read access, action authority, and (with approval) real purchasing power on Ramp — through MCP, the Ramp CLI, or both. Every action respects the authenticated user's role and lands in the Ramp audit log. An agent that can do useful work on Ramp without copy-paste: Agents reach Ramp through two channels — MCP (the Model Context Protocol — the standard way assistants connect to external systems) or the Ramp CLI (a local runtime that brokers calls and ships skills). Pick one, run both side-by-side, or compose them. Both honor the authenticated user's permissions and write every action to the audit log. Estimated time: 5–15 minutes to your first agent action via MCP; 30–60 minutes to a working agent purchase via Agent Cards. Required for any agent integration: a Ramp production or sandbox account, and access to a supported client. Required for production MCP when you're embedding Ramp MCP in your own product or behind a custom client: redirect-URI whitelisting via Ramp support. Tech partners building a product that connects customers' Ramp accounts apply through Partner Integrations. Required for Agent Cards (alpha): at least one active fund and approved alpha access. Apply here. Best for Off-the-shelf assistants (Claude, ChatGPT, Cursor, Claude Code, etc.) and any MCP-compatible tool Coding agents (or any agent with terminal access) and scripted/scheduled workflows Setup One-click in supported clients; custom config for everything else curl ... | sh, then ramp auth login Surface Tool calls dispatched by the AI client Commands + skills invoked by the agent Auth Browser OAuth on first use Browser OAuth on first use; session reusable on remote hosts Best capability fit Conversational analysis, approvals, edits Scripted reads/writes, agent-driven purchases via the agentic-purchase skill The two channels expose overlapping capabilities — both can call Ramp MCP tools. The CLI adds skills (like agentic-purchase) that compose tool calls into a workflow. Most teams pick one and add the other when a specific capability requires it. Pattern A: connect via MCP Ramp ships an MCP server at https://mcp.ramp.com/mcp (demo data: https://demo-mcp.ramp.com/mcp). The simplest integration is a supported client; a custom client works too once a redirect URI is allowlisted. One-click in the client's directory or a single command in a terminal client: Other MCP-compatible tools (Notion, Codex, Windsurf, Continue, etc.) connect with the same server URL. See Ramp MCP for the full setup matrix. Embedding Ramp MCP in your own product, or routing through a gateway like Glean, MintMCP, or GoSearch? Ramp must allowlist the redirect URI first. Use https:// or localhost/127.0.0.1 only. Exact host required — wildcard subdomains aren't supported. Submit a Developer API support ticket with your client name and redirect URI. Tech partners apply through Partner Integrations. Microsoft Copilot for 365 Microsoft Copilot for 365 doesn't natively support remote MCP servers. Integrate via Copilot Studio's MCP server integration, or use the Developer API directly through Power Automate. Pattern B: connect via the Ramp CLI The CLI is the right channel when the agent has terminal access or runs as a script/scheduled job — coding agents (Claude Code, Cursor, Codex), CI workflows, headless services on a remote host. For remote hosts, authenticate locally and copy the session config — see Going to production below. Full command reference and skill catalog: Ramp CLI. The CLI exposes packaged skills an agent can invoke. The most common one for AI-driven flows: agentic-purchase — drives the Agent Cards capability end-to-end (request credential → checkout → audit). Install the skill URL into your agent: https://github.com/ramp-public/ramp-cli/blob/main/src/ramp_cli/skills/agentic-purchase/SKILL.md. Skills can call MCP tools under the hood, so an agent with CLI access also has the full MCP capability surface. What an AI agent can do on Ramp Capabilities are grouped here by what the agent does for the user, not by tool name. The underlying MCP tool surface evolves continuously — disconnect and reconnect your client to pick up new tools as they ship. For the channel-specific capability surface, see Ramp MCP → What you can do. Search transactions by merchant, amount, date, or user. Pull full spend exports and run SQL-style analysis (admins). Load vendor lists, accounting categories, tracking categories, departments, entities, treasury balances, and the org chart. Get explanations for declined transactions and policy guidance for borderline ones. Approve or reject transactions, reimbursements, and unified requests (purchase orders, fund requests, procurement approvals). View pending approvals across types. Bill approvals aren't yet available via MCP — use the Ramp UI or the Blank Canvas Approvals API for now. Edit transaction memos, fund assignment, accounting categories, and trip assignment. Submit and resubmit reimbursements. Post comments and mention users on workflow items. Lock, unlock, and activate cards. Connect transactions to trips. Apply GL coding to transactions and reimbursements. Policy Q&A from natural-language prompts ("Is this within policy?"). Help Center search. Decline explanations for transactions that didn't go through. The agent generates a per-merchant, per-amount payment credential at purchase time via Visa Intelligent Commerce. Each credential is scoped to one merchant and capped at the requested amount; it expires once used. See Agent Cards below for the full flow, limits, and merchant-category restrictions. Create trips, view trips with status filters, connect transactions to trips, retrieve flight and hotel bookings. Agent Cards Agent Cards give an AI agent real payment authority through Visa Intelligent Commerce. Available through both MCP (ramp_get_agent_card_creds) and the CLI (agentic-purchase skill). Agent Cards are in Alpha Agent Cards require approved alpha access. Apply for access here. Funds, supported flows, and APIs may change as we iterate. Three pieces compose: Visa Intelligent Commerce (VIC) mints a per-merchant, per-amount payment credential at purchase time. The credential expires once used. A Ramp fund (Spend Controls) sets the policy ceiling. The agent can only generate credentials against funds the authenticated user is scoped to. The agent's channel — either MCP or the CLI's agentic-purchase skill — brokers the request and respects the user's existing permissions. We're working with Visa to close these as fast as we can. If any block a real workflow, reach out. Spend limit. $5K/day issuance limit per business; case-by-case lifts are possible. 3D Secure (3DS). Not yet supported via VIC. Affects online transactions in the EEA, UK, India, Japan, Australia, and a few others. Merchant-initiated transactions (MIT) / card on file (CoF). Not yet supported via VIC. Affects subscriptions, recurring billing, metered AI spend. Visa blocks the following Merchant Category Codes for agent purchases. If your use case lives in one of these, reach out. 4816 Computer Network / Information Services 5122 Drugs, Drug Proprietors and Druggists Sundries 5816 Digital Goods: Games 5912 Drug Stores and Pharmacies 5966 Direct Marketing – Outbound Telemarketing Merchant 5967 Direct Marketing – Inbound Telemarketing Merchants 5968 Direct Marketing – Continuity / Subscription Merchant 5993 Cigar Stores and Stands 6012 Member Financial Institution – Merchandise and Services 6051 Quasi Cash – Merchant 6211 Securities – Brokers and Dealers 7273 Dating Services 7995 Betting, including Lottery Tickets, Casino Gaming Chips, Off-Track Betting, Wagers at Race Tracks Agent Cards run through the Ramp CLI agentic-purchase skill, so an agent purchasing on a user's behalf inherits that user's CLI session. Session window Agent sessions can last up to 8 hours. Re-authenticate after the session expires. Refreshes keep credentials valid within the window but do not extend it. For remote-host setups, see the copy-session pattern below. Going to production Production MCP for custom clients and partner products is gated: Custom apps and third-party gateways — submit a support ticket to allowlist your redirect URI before launch. Tech partners building a product that connects customers' Ramp accounts — apply through the Partner Integrations launch checklist. Audit log — every write operation lands in the customer's Ramp audit log automatically, no extra wiring. Customers control which employees can use Ramp MCP through their dashboard: Company → Integrations → Ramp MCP → Manage Access. Restrict by role, department, or specific users. The MCP server respects each user's existing Ramp permissions on top of that — employees see only their own data; admins see company-wide data. Read-only sessions expire one week after last use. Read-write sessions expire 24 hours after last use. For remote hosts, authenticate locally and copy the session config: As long as the agent makes at least one call within the refresh window, the session doesn't expire. New MCP tools ship continuously. Have agents disconnect and reconnect (or run /mcp in Claude Code) to pick up additions. The capability surface in this Use case is grouped by user job — specific tool names will drift; the categories shouldn't. Query result cap: 100 rows per MCP query. Clients auto-add filters and retry on overflow. ETL data tables: "too many tables loaded" errors clear by asking the agent to drop unused tables; persistent errors resolve within minutes. Spend programs — back agent purchases with recurring-budget templates instead of one-off funds. Virtual cards — non-agent virtual cards (Vault API or embedded iframe) for human-driven flows. Cards — Agent Cards is one of four card variants. Spend Controls — the funds, spend programs, and approvals that constrain agent spend. Reimbursements — agents can submit and approve reimbursements via MCP. Procurement — agents can approve unified requests (POs, fund requests). Ramp MCP — the protocol surface and supported-client setup matrix. Ramp CLI — the runtime, command reference, and skill catalog. Limits — funds that constrain what an agent can spend. Spend Programs — recurring-budget templates for agent purchases. FAQ Yes. They're independent channels using the same OAuth-authenticated session. Pick MCP for conversational/UI-driven flows, the CLI for terminal/scripted ones. Bill approvals route through Ramp's Blank Canvas Approvals system. For now, approve bills in the Ramp UI or via Blank Canvas Approvals. MCP coverage is on the roadmap. No. Most of the capability surface (reads, approvals, edits, policy Q&A) works without Agent Cards. Agent Cards only matters when the agent needs real payment authority. Use the ramp feedback command in the CLI, the in-client feedback in your MCP client, or submit a support ticket. New tools ship continuously. --- title: Partner Integrations source_url: /developer-api/v1/build-with-ramp text_url: /llms-guides/build-with-ramp.txt summary: Ramp enables technology partners to build integrations that reach 50,000+ businesses. This guide walks you through building, testing, and publicly listing on the Ramp Integrations page. content: Ramp enables technology partners to build integrations that reach 50,000+ businesses. This guide walks you through building, testing, and publicly listing on the Ramp Integrations page. Monetize your integration — You keep 100% of your revenue. Set your own pricing, charge customers directly, and grow your business without revenue sharing or platform fees. Public marketplace listing — Once published, your integration gets featured on the Ramp Integrations page, giving you visibility and credibility with prospective customers. This guide applies to all integration categories. Additional guidance for Accounting/ERP integrations is linked where relevant. Building an integration with Ramp means entering a partnership focused on delivering a high-quality experience to our shared customers. Each side plays a clear role in making that happen. Your side: Pricing and monetization — You set your pricing, bill customers directly, and keep 100% of revenue. Ramp does not process payments or participate in billing. Building and hosting your integration — You develop and maintain your integration using Ramp's APIs. Customer support — You assist customers through your own support channels and provide a public support email. Documentation — You host setup guides, workflow instructions, and troubleshooting on your site. Marketing assets — You supply the logo, descriptions, screenshots, and videos for your listing. Ramp's side: API troubleshooting & advisory — Our team helps you debug API issues and offers guidance on best practices and specific use cases. Product review and guidance — We review your integration flows and provide feedback. Approval is required before production access. Distribution — Your integration reaches 50,000+ businesses once published on the Ramp Integrations page. This partnership model gives you full ownership of your product while Ramp provides oversight, guidance, and reach. Each integration must go through the following four stages; below is a checklist to help you work your way through each stage. Phase 1: Build Phase 2: Apply for Production Access Phase 3: Beta Testing Phase 4: Apply for a Public Listing Appendix You control your pricing. Ramp does not charge fees or take a revenue share. Many integrations are free, while others charge for their services—the choice is yours. Best practices for pricing: Price relative to the value your integration delivers to customers. Keep pricing predictable and easy to understand. Factor in implementation cost, ongoing maintenance, and support burden. Common pricing models include: Flat annual subscription. Implementation fee plus annual renewal. Usage-based pricing (for example, per transaction or per bill). Tiered feature bundles based on functionality. High-quality documentation improves customer activation and reduces support load. It is also heavily used by Ramp's sales, customer success, and support teams when discussing your integration. Your documentation should: Be publicly accessible and hosted on your website. Include prerequisites for both Ramp and your platform. Provide step-by-step setup instructions. Detail key user workflows and common use cases. Offer troubleshooting tips and a frequently asked questions section. Examples of strong integration documentation: Dualentry Ramp for FE Acumatica Ramp's systems may surface your documentation links when customers and internal teams ask about your integration, so strong docs are one of your most effective marketing and support assets. Partners must fully complete security disclosures and provide: Security certifications and/or attestations such as SOC 2 Type II, ISO 27001, PCI, or a recent third-party penetration test. Full certification and/or pen test reports (not just summary letters). A public URL to your security policy. A dedicated and monitored security contact email address. Written descriptions covering: What data your integration processes and how it is secured. Where and how data is stored. Your data retention policy. Whether and how employees at your company can access customer data. What data your integration processes and how it is secured. Where and how data is stored. Your data retention policy. Whether and how employees at your company can access customer data. Early-stage companies may use a recent third-party pen test in place of full SOC 2 or ISO 27001 certifications, subject to Ramp's review. You own first-line support for your integration. Ramp will route customer questions about your integration to you. Provide a public support email address; this will be visible to customers and used by them to troubleshoot issues. Maintain clear customer-facing documentation for setup, key workflows, and troubleshooting. Provide an internal support guide for Ramp teams that explains how to triage issues, what information to collect, and how to escalate to your team. If you have questions while building or preparing your submission, submit a Developer API support ticket. --- title: Cards source_url: /developer-api/v1/cards-and-funds text_url: /llms-guides/cards-and-funds.txt summary: Issue cards, attach controls, and watch spend in real time — virtual or physical, agent-driven or human, embedded in your product or used directly. content: Issue cards, attach controls, and watch spend in real time — virtual or physical, agent-driven or human, embedded in your product or used directly. How cards work A Ramp card is a payment method that draws against a fund. Funds, spend programs, and approvals all live on the Spend Controls hub; this page covers the cards themselves — what each variant is, when to pick which, and how they're issued. Every card in Ramp is one of these. The variant is set at creation; the rest of the card's behavior is just fund and policy configuration on Spend Controls. Virtual A 16-digit number, CVV, and expiration. Always tied to a fund. Use for online purchases, vendor payments, surfacing card details inside your own product, or any flow where plastic isn't needed. Physical A card shipped to an employee. Can draw from one or many funds (auto-matched by category) or carry independent spending restrictions. Use when an employee needs to spend in person — meals, travel, fuel, on-site purchases. Agent A per-merchant, per-amount payment credential generated at purchase time for AI agents, via Visa Intelligent Commerce. Use when an AI agent needs payment authority constrained to a specific purchase. Virtual cards can be exposed two ways: server-side (Vault API, PAN to your backend) or browser-side (Ramp-served iframe, PAN never touches your servers). See Virtual cards for both patterns. Standard API responses return masked card numbers. Full PANs and CVVs require the cards:read_vault scope and PCI qualification — submit a Developer API support ticket to start the qualification. All customers see full data in Sandbox. A Merchant is the counterparty on a card transaction — the business where a swipe happened. Auto-populated from card network data and read-only; merchants are global (Home Depot is the same Merchant for every Ramp customer) and surface on transactions as merchant_id and merchant_name with a normalized name, logo, and category code. No dedicated CRUD endpoints — read merchants off the Transaction object. For how Merchants relate to bill-pay Vendors and ERP Accounting Vendors, see Data relationships. Virtual cards — issue virtual cards backed by funds, expose them to your servers (Vault API) or to a user's browser (iframe). AI Agents — give an AI agent read access, action authority, and (with approval) real purchasing power via MCP, the CLI, and Agent Cards. Spend programs — compose funds, spend programs, transactions, and webhooks to manage a recurring budget end-to-end. Spend Controls — funds, spend programs, and approvals that back every card. Bill Pay — vendor payments that don't fit a card. Procurement — request-to-PO flow when spend needs approval upfront. ERP Integrations — accounting vendors are the coding values card transactions map to for GL export. Cards — physical card lifecycle. Limits — the API behind funds; create, update, suspend, terminate. Virtual cards are issued here. Transactions — settled spend, with filters by card and fund (limit_id). Receipts — receipts attached to card transactions. Cashbacks — rewards earned on card purchases. Statements — monthly billing data. Repayments — payments toward a card balance. Trips — travel-tagged transactions, receipts, and reimbursements. Webhooks — subscribe to transactions.cleared for real-time spend. Rate limits and timeouts — guidance for high-volume card issuance. Authorization — cards:read, cards:write, cards:read_vault scopes. --- title: Changelog source_url: /developer-api/v1/changelog text_url: /llms-guides/changelog.txt summary: Stay up to date with our latest API updates via RSS feed (reader required). content: Stay up to date with our latest API updates via RSS feed (reader required). May 19, 2026 May 18, 2026 May 11, 2026 May 8, 2026 May 6, 2026 April 30, 2026 April 28, 2026 April 27, 2026 April 17, 2026 March 30, 2026 March 25, 2026 March 19, 2026 March 18, 2026 March 17, 2026 March 16, 2026 March 12, 2026 February 27, 2026 February 13, 2026 February 12, 2026 February 11, 2026 February 10, 2026 February 5, 2026 February 3, 2026 January 30, 2026 January 28, 2026 January 22, 2026 January 16, 2026 January 14, 2026 January 6, 2026 January 5, 2026 December 23, 2025 December 11, 2025 December 4, 2025 November 28, 2025 November 26, 2025 November 24, 2025 November 20, 2025 November 18, 2025 November 12, 2025 November 10, 2025 November 7, 2025 November 4, 2025 October 31, 2025 October 30, 2025 September 25, 2025 August 8, 2025 June 25, 2025 May 16, 2025 April 29, 2025 March 25, 2025 February 25, 2025 January 17, 2025 May 2024 New accounting codings endpoint (beta) — Post accounting coding selections to Ramp objects like transactions via POST /developer/v1/accounting/codings. Specify an object_id, object_type (currently TRANSACTION), and an array of accounting_coding_selections with field and option IDs. View endpoint Purchase order edit_line_items action detail — The purchase order permitted_actions response now includes an edit_line_items field indicating whether line items can be edited, with denial reasons such as archived, no_permission, and punchout_order. New purchase order denial reason values — Several purchase order action denial reason enums now include additional values: archived added to IssuePurchaseOrderFundDenialReason, AgreementCreationPostApprovalDenialReason, and UploadBillDenialReason; punchout_order added to RequestAgainDenialReason and RequestChangesDenialReason. Clarified spend limit and card display name descriptions — The display_name field on limits now specifies it is the spend allocation name, separate from each linked card's display_name. The display_name query parameter on the List Limits endpoint clarifies it filters by the limit's display name. View endpoint New audit log actor type — Added spend_request_agent as a new actor_type enum value for filtering and identifying Spend Request Agent activity in audit log events. View endpoint New audit log event types — Added several new event types for audit logs including Accounting settings updated, Agent key created, Agent key revoked, Agent key updated, Bank account ACH details viewed, Bank account sensitive details viewed, Identity locked, Identity unlocked, Transfer created, and WBX request admin approved entire workflow. View endpoint New transaction decline reason — Added AUTHORIZER_UNDER_TRANSACTION_AMOUNT_LIMIT enum value indicating a transaction amount fell below the per-transaction minimum. Clarified location entity update side effect — The entity_id field description on PATCH /developer/v1/locations/{location_id} now clarifies that updating a location's entity also moves existing users assigned to that location to the updated entity. View endpoint Vendor accounting link uniqueness documented — The accounting_vendor_remote_id and vendor_tracking_category_option_id fields on POST /developer/v1/vendors now clarify that the referenced accounting vendor must not already be linked to another Ramp vendor. View endpoint New OUSD currency code — Added OUSD to supported currency code enums across bill and transaction schemas. New tasks:read OAuth scope — Added tasks:read scope for granting read access to tasks. New ARAVO third-party risk management provider — Added ARAVO as a new enum value for ThirdPartyRiskManagementProviderType. Date-time support for custom record values — Custom record row values now accept date-time formatted strings in addition to numbers, strings, booleans, and arrays. New PAYEE document version type — Added PAYEE as a new enum value for RampDocumentVersionType. New edit_accounting_merchant vendor action — Vendor response now includes an edit_accounting_merchant action detail indicating whether the caller can edit the vendor's accounting merchant link, with denial reasons such as archived, matches_payee_vendor, no_payee, and no_permission. New allow_none field on tracking category settings — The TrackingCategorySettings schema now includes an allow_none boolean field. Bill payment date scheduling — You can now set an optional payment_date field when creating or updating bills via POST /developer/v1/bills and PATCH /developer/v1/bills/{bill_id} to schedule when a non-card payment should be initiated. Send null on update to unschedule a previously set payment date. View endpoint New audit log event types — Added several new event types for the audit logs endpoint: Cash manager recommendation reviewed, Forecast custom input deleted, Forecast custom input updated, Forecast settings updated, and Strict MFA setting updated. View endpoint Schedule bill payments via API — You can now set an optional payment_date field when creating or updating bills to schedule when a non-card payment should be initiated. Pass null to clear a previously scheduled date. View endpoint Update GL account on inventory item options — The PATCH /developer/v1/accounting/inventory-item/options/{option_id} endpoint now accepts an optional gl_account_id field, letting you associate an inventory item option with a specific GL account. View endpoint Spending restrictions on unified requests — Unified request responses now include a spending_restrictions object with an interval field, so you can see the spend frequency associated with a request. View endpoint New allowed_overage_percent field on unified requests — Unified request responses now include allowed_overage_percent, indicating the permitted overage percentage for a spend allocation request. View endpoint New Comments endpoints (beta) — List and create comments on bills and spend requests via GET /developer/v1/comments/{object_type}/{object_id} and POST /developer/v1/comments/{object_type}/{object_id}. Supports bills and spend-requests as object_type values, with paginated responses. View endpoint Purchase order deep links — Purchase order responses now include a ramp_url field with a stable permalink to the purchase order in the Ramp web application. View endpoint Unified request deep links — Unified request responses now include a ramp_url field linking directly to the request in the Ramp web application. View endpoint Bill update line item PO matching — When updating bills, line_items and inventory_line_items now accept a purchase_order_line_item_id field to match individual line items to specific purchase order line items. View endpoint GL account association for inventory item options — The PATCH /developer/v1/accounting/inventory-item/options/{option_id} endpoint now accepts a gl_account_id field to associate an inventory item option with a GL account. View endpoint Mileage reimbursement fund attribution — The POST /developer/v1/reimbursements/mileage endpoint now accepts a spend_allocation_id field to attribute a mileage reimbursement to a specific fund. View endpoint Multi-currency spending restriction support — Spending restriction descriptions for limit and transaction_amount_limit on cards and spend limits now correctly reference the smallest currency unit rather than assuming USD cents, reflecting proper non-USD currency handling. Mock webhook business_id field — The mock webhook event response now includes a business_id field identifying the business associated with the event. View endpoint New webhook event types — Added entities.created and transactions.synced as new webhook event types you can subscribe to and trigger via mock webhooks. View endpoint Matrix table append duplicate handling — The append rows endpoint for matrix tables now supports an ignore_duplicates boolean parameter. Set it to true to skip existing duplicate cells instead of returning an error. View endpoint Expanded audit log event types — Added 30+ new event_type enum values for audit logs, including Account details viewed, Passkey created, Passkey deleted, Transfer initiated, User logged out, Voided check downloaded, Payment run action, Edited custom field, Cash Manager settings updated, and more. View endpoint New audit log resource types — Added Cash Manager recommendation, Forecast custom input, Payment run, and Wallet automation policy as resource_type enum values for audit log events. View endpoint Card expiration in Vault API response — GET /developer/v1/vault/cards/{card_id} now returns an expiration field with the card's expiration date in MMYY format, aligning the GET response with the existing POST response. View endpoint Update purchase order memo — You can now set, update, or clear the memo field when calling PATCH /developer/v1/purchase-orders/{purchase_order_id}. View endpoint Spend program workflow nodes simplified — The kind field has been removed from the workflow nodes response on GET /developer/v1/spend-programs/{spend_program_id}/workflow-nodes. This field was never populated in actual responses; the schema now matches the real response shape. View endpoint New audit log event types — Added several new event_type values for audit log filtering: Account closed, Account renamed, Bank letter downloaded, Investment Account closed, Investment Account opened, Vendor hold released, Vendor placed on hold, and WBX request archived. View endpoint New audit log resource types — The resource_type filter now includes Investment account and Managed portfolio transfer (replacing the previous Brokerage account value). View endpoint New vendor document categories — Added ADDENDUM_OR_RIDER, AMENDMENT, CONTRACT_OTHER, ENGAGEMENT_LETTER, SECURITY_EXHIBIT, and SLA to the document_category enum for vendor agreement document uploads. View endpoint Purchase order memo updates — You can now update the memo field when patching a purchase order via PATCH /developer/v1/purchase-orders/{purchase_order_id}. View endpoint Longer invoice numbers on bills — The invoice_number field on bills now supports up to 84 characters (previously 20), accommodating longer invoice numbers from certain accounting providers. View endpoint GL account linking for inventory item options — Inventory item options now include a gl_account_id field, letting you associate a GL account when creating or viewing inventory item options. View endpoint New vendors.updated webhook event — Subscribe to the vendors.updated event to get notified when vendor details change. View endpoint New TRANSFER_LEDGER_ENTRY_MAPPING sync type — Added TRANSFER_LEDGER_ENTRY_MAPPING as a supported entity type for accounting syncs, enabling sync support for transfer ledger entry mappings. View endpoint New is_not_null query clause for custom records — Matrix table row queries now support an is_not_null clause type, letting you filter for rows where a column value is not null. View endpoint New audit log event types — Added Account opened as a new audit log event type and Treasury account / Wallet transfer as entity types for more granular audit trail filtering. View endpoint New supported file types — Added jsonl and npy to the list of accepted file formats for uploads. New Ramp-only accounting fields endpoints (beta) — Manage custom accounting fields that exist only in Ramp (not synced from an ERP). Create, list, fetch, update, and delete Ramp-only fields and their options. View endpoint New user invite management endpoint (beta) — Control the invite lifecycle for draft users with POST /developer/v1/users/{user_id}/invite. Schedule an invitation for a future time (SCHEDULE), cancel a scheduled invitation (DESCHEDULE), or send the invite immediately (SEND_NOW). View endpoint Draft user creation support — Added is_draft field to the create user request body. When set to true, the user is created in a DRAFT state without sending an invite email, allowing you to activate them later. View endpoint User lifecycle status field — User responses now include a lifecycle_status field with possible values DRAFT, PENDING, ACTIVE, INACTIVE, and DELETED, giving you visibility into where a user is in their lifecycle. Vendor agreement link and unlink endpoints (beta) — Link purchase orders or documents to a vendor agreement via POST /developer/v1/vendors/agreements/{agreement_id}/link, link spend requests via POST /developer/v1/vendors/agreements/{agreement_id}/link-spend-request, and unlink them via DELETE /developer/v1/vendors/agreements/{agreement_id}/unlink. View endpoint Filter bills by missing payment details — Added payment_details_missing query parameter to the list bills endpoint. Set to true to return only bills that are missing vendor bank account or payment method information. View endpoint Enhanced vendor credit filtering — Added entity_id, from_created_at, and to_created_at query parameters to both vendor credits list endpoints for filtering by business entity and creation date ranges. View endpoint SPEND_PROGRAM added to accounting field locations — The remote_field_locations enum for accounting fields now includes SPEND_PROGRAM, enabling accounting field mapping on spend programs. GOVERNMENT_ENTITY vendor business type — Added GOVERNMENT_ENTITY as a new enum value for vendor business entity types when creating or updating vendors. Relaxed bill line item unit_price validation — The unit_price field on bill line items no longer enforces a minimum of 0, allowing negative unit prices for credit adjustments. Nullable manual_payment_method — The manual_payment_method field on bill payment details is now nullable, returning null when a bill has not yet been marked as paid. New audit log event types — Added numerous new event types for audit logs including Accounting coding rules updated, Bill linked to contract, Bill unlinked from contract, Cashback redeemed, Counterparty created, Counterparty details changed, International payment initiated, Large transfer initiated, Mass payout initiated, Payment approval overridden, Payment to new counterparty, and various WBX (workflow) and RFX (sourcing) events. View endpoint New audit log entity types — Added Brokerage account, WBX Policy, WBX Request, and Wallet account as entity types for audit log filtering. New blank canvas approvals endpoints — Approve or reject blank canvas workflow steps, update metadata for external approval requests, and upload documents for blank canvas workflow steps. View endpoint · View metadata endpoint · View documents endpoint New repayments endpoint — List repayments with filtering by entity, funding method, repayment date range, and user. View endpoint New unified requests endpoints — List and fetch unified spend requests with filtering by department, entity, location, owner, spend program, request type, status, amount range, and date range. View endpoint New spend request endpoints — Create draft spend requests via OCR, list and create comments on spend request discussion threads. View endpoint · View comments endpoint New spend program workflow nodes endpoint — Fetch blank canvas workflow nodes for a spend program, filtered by external approval service key. View endpoint New custom form collection response endpoint — Fetch a custom form collection response by ID. View endpoint New vendor agreement endpoints (beta) — Create, fetch, update, and delete vendor agreements, upload agreement documents, and create agreements for specific vendors. View endpoint · View documents endpoint New mock webhook event endpoint — Create mock webhook events for testing active subscriptions matching a given event type. View endpoint Audit log object filtering — Added object_id and resource_name query parameters to the audit logs endpoint for filtering events by specific object ID and resource type. View endpoint Purchase order external ID support — Added external_id field to purchase order and line item creation and responses, plus external_id and remote_id query parameters for filtering purchase orders. View endpoint Purchase order shipping fields — Purchase order responses now include ship_to_address, ship_to_company_name, shipping_contact_email, shipping_contact_first_name, shipping_contact_last_name, and shipping_contact_phone_number fields. New purchase order creation source — Added EXTERNAL_IMPORT enum value to the creation_source field on purchase orders. Accounting connection ID support across accounting endpoints — Added optional accounting_connection_id query parameter to GL accounts, custom fields, custom field options, inventory items, tax codes, tax rates, and accounting vendor endpoints for accessing resources belonging to inactive accounting connections. Enhanced vendor filtering — Added to_created_at, from_updated_at, and to_updated_at query parameters to the List Vendors endpoint for date-based filtering. View endpoint Draft user status support — Added USER_DRAFT enum value to the user status filter and response field, along with a new scheduled_invitation_date field on user responses. View endpoint Business balance structured amounts — The business balance response now includes CurrencyAmount fields (e.g., available_card_limit_amount, card_limit_amount, statement_balance_amount) with explicit currency codes and minor unit values alongside the existing numeric fields. View endpoint Bank account name field — Bank account responses now include an account_name field. View endpoint Reimbursement trace ID — Reimbursement detail responses now include a trace_id field with the bank-facing accountability reference for the payment. New limit state — Added ARCHIVED enum value to the limit state field. New currency support — Added USDT to supported currency codes across bill, purchase order, and other endpoints. New accounting field type — Added UNIT_OF_MEASURE to the remote_type enum for custom accounting fields. New webhook event types — Added bills.ready_to_sync, payments.updated, transactions.declined, and users.invite_accepted event types for webhook subscriptions. New audit log event types — Added numerous new audit log event types including ABK agent schedule failed, Accounting provider access changed, Bill pay AP coworker questions answered, Business bank account added/changed/removed, HRIS integration setting updated, Item receipt accounting sync, Reimbursement field changed, Trip changed, Vendor added to group, Vendor removed from group, and several RFX and question-related events. New List Bank Accounts endpoint — Retrieve a paginated list of bank accounts associated with your business. Supports start and page_size query parameters for pagination. View endpoint New List Vendor Agreements endpoint (beta) — Query vendor agreements with extensive filtering options including date ranges, renewal status, contract owners, departments, total value, and custom record filters via POST /developer/v1/vendors/agreements. View endpoint Enhanced vendor filtering by timestamps — Added to_created_at, from_updated_at, and to_updated_at query parameters to the List Vendors endpoint for filtering vendors by creation and update dates. View endpoint Vendor subsidiary data — Added include_subsidiary query parameter to the List Vendors endpoint. When set to true, vendor responses include a subsidiary field with ERP subsidiary identifiers. View endpoint Allowed overage percent override on limits — The allowed_overage_percent_override field is now available when creating limits and is returned in limit responses. This decimal value (0–100) lets you set a fund-level override for the allowed overage percent, independent of the spend program or business default. View endpoint Update custom accounting field options — New PUT /developer/v1/accounting/field-options/{field_option_id} endpoint to update existing custom accounting field options. View endpoint New audit log event types — Added Generated renewal brief for contract, Spend allocation change request approval policy updated, and Vendor Network updates enabled event types to the audit logs endpoint. Updated token prefix format — Access tokens are now prefixed with ramp_business_tok_, ramp_user_tok_, ramp_business_jwt_, or ramp_user_jwt_ instead of the previous ramp_tok_ prefix. Refresh tokens use ramp_business_tok_ or ramp_user_tok_. Custom records reference columns relaxed — The corresponding_column_name field on reference column configurations is no longer required and defaults to null. It will be auto-generated if not provided, simplifying forward-only reference column setup. Auto-match uploaded receipts without a transaction ID — The POST /receipts endpoint can now automatically match uploaded receipts to transactions without requiring a transaction_id. View endpoint New financing applications endpoints (beta) — Create and fetch financing applications programmatically. Submit applicant details, business information, controlling officers, beneficial owners, and financial details. View GET endpoint | View POST endpoint | View guide New ready-to-sync endpoint (beta) — Mark accounting objects as ready to sync by providing a list of object_ids and an object_type (currently supports TRANSACTION). View endpoint New applications.status_updated webhook event — Subscribe to applications.status_updated to receive notifications when a financing application's status changes. View endpoint New bill payment status ON_HOLD — Added ON_HOLD enum value to the bill payment_status filter and response, representing bills that have been placed on hold. View endpoint New cancelled trip status — The status filter on the List Trips endpoint now supports the cancelled enum value, and trip responses can include cancelled as a status. View endpoint New audit log event type — Added Vendor linked to vendor network to the list of supported audit log event types. View endpoint New GL account classification types — Added AR_CHARGEBACK_CLEARING_ACCOUNT and AR_REFUNDS_CLEARING_ACCOUNT classification enum values for accounting GL accounts. New bill filtering by payment ID — Added customer_friendly_payment_id query parameter to filter bills by their customer-friendly payment identifier, making it easy to find all bills belonging to the same payment or batch payment. The response also now includes customer_friendly_payment_id on bill payment objects. View endpoint New bill filtering by draft bill ID — Added draft_bill_id query parameter to the List Bills endpoint to filter by the originating draft bill. The bill response now also includes draft_bill_id to indicate which draft bill a bill was created from. View endpoint New bill and draft bill filtering by remote ID — Added remote_id query parameter to both the List Bills and List Draft Bills endpoints, allowing you to look up bills and drafts by their external system identifier. View endpoint | View draft bills endpoint Reactivate deleted inventory item options — Added reactivate field to the PATCH /developer/v1/accounting/inventory-item/options/{option_id} request body, bringing parity with custom field options by letting you restore soft-deleted inventory item options. View endpoint Vendor owner is now optional — The vendor_owner_id field is no longer required when creating a vendor via POST /developer/v1/vendors. Omitting it creates the vendor without an owner. View endpoint Decimal quantity support for bill line items — The unit_quantity field has been replaced with quantity, which now accepts decimal values (e.g., 2.25) instead of only integers. unit_quantity is still accepted for backwards compatibility. The unit_price field also now accepts decimal string or number formats. This applies when creating or updating line items on bills and draft bills. View endpoint New GL account classification types — Added six new enum values for GL account classifications: AR_ACCOUNTS_RECEIVABLE_ACCOUNT, AR_BAD_DEBT_ACCOUNT, AR_CARD_FEES_ACCOUNT, AR_CASH_ACCOUNT_DEFAULT, AR_INCOME_ACCOUNT_DEFAULT, and AR_UNDEPOSITED_FUNDS_ACCOUNT, enabling accounts receivable accounting integrations. Vendor memo support for bills — Added vendor_memo field to create and update bill endpoints, as well as draft bill endpoints, allowing you to set a memo to the vendor (up to 400 characters) on a bill. View endpoint | View endpoint | View endpoint | View endpoint Refresh token expiration info — The token endpoint response now includes a refresh_token_expires_in field indicating how long the refresh token is valid (in seconds), making it easier to manage token lifecycle for clients configured with a refresh token TTL. View endpoint New embedded cards endpoint (beta) — Generate an embed init token for a card to enable embedded card experiences in your application. Requires the embedded_cards:write scope and the card must be activated and active. View endpoint New audit log event type — Added RFX graded to the list of supported audit log event types, allowing you to track when an RFX has been graded. View endpoint Global library field ID on custom record columns — Custom record column responses now include a global_library_field_id field, letting you identify columns that are linked to global library fields. Visibility filter for accounting field options — Filter custom accounting field options by visibility (HIDDEN or VISIBLE) using the new visibility query parameter. View endpoint Bill filtering by ERP sync status — Filter bills by whether they are configured to sync to your ERP using the new is_accounting_sync_enabled query parameter. View endpoint Payment accounts on entities — The entity response now includes a payment_accounts array containing bank accounts eligible for bill payment, with details like account_name, account_number_last_four, currency, and id. View endpoint Custom record fields on vendors — Vendor responses now include a custom_record_fields array with column metadata, display values, and reference row details for custom record data associated with each vendor. View endpoint Policy agent exemption for spend limits — Spend limit responses now include is_exempt_from_policy_agent, and you can update it via PATCH along with existing_expense_policy_agent_exemption_application_rules to control whether the exemption applies retroactively (APPLY_TO_ALL) or only to future transactions (APPLY_TO_NONE). View endpoint Accounting vendor creation flag on transactions — Transaction responses now include requires_accounting_vendor_creation_to_sync, indicating whether your integration must create an accounting vendor before syncing the transaction. View endpoint New webhook event types for unified requests — Added unified_requests.created, unified_requests.modified, unified_requests.node_advanced, unified_requests.override_approved, and unified_requests.updated to the list of subscribable webhook events. View endpoint New transaction decline reasons — Added AUTHORIZER_SPEND_ALLOCATION_MEMBER_SUSPENDED and AUTHORIZER_UNAUTHORIZED_USER enum values for more granular transaction decline details. New custom records reference table types — Added contracts and purchase_order_line_items as valid native reference table types for custom record columns. New custom record text display type — Added numeric_id to the available display types for custom record text columns. New audit log event types — Added ABK agent blocked on user, ABK agent review requested, ABK agent started, Document labeled, Edited contract tracking setting, and Reimbursement bank account updated for more comprehensive audit trail coverage. View endpoint New spend program mapped field type — Added REQUEST_REASON as a mapped field option for spend program configurations. New vendor document types — Added INVOICE and VENDOR_CREDIT to the list of supported vendor document types. Filter bills by payment ID — Added payment_id query parameter to the List Bills endpoint, letting you retrieve all bills belonging to the same batch payment. View endpoint Payment ID on bill responses — Bill payment details now include an id field representing the unique payment identifier. Bills sharing the same payment ID belong to the same batch payment. Draft bill attachment uploads — Upload file attachments to existing draft bills via POST /developer/v1/bills/drafts/{draft_bill_id}/attachments, using multipart/form-data. View endpoint Bank account ID on transfers — Transfer responses now include a bank_account_id field containing the UUID of the bank account used for the transfer payment (or null for wire transfers). Use GET /developer/v1/bank-accounts/{bank_account_id} to look up account details. View endpoint Vendor creation on sync setting for accounting connections — Added transaction_accounting_vendor_creation_on_sync_enabled to accounting connection settings. When enabled, card transactions missing a mapped accounting vendor will require vendor creation before sync. Available on create and update endpoints. View endpoint New INVOICE sync resource type — Added INVOICE as a supported enum value for accounting sync resource types, expanding the types of records you can sync through accounting connections. New webhook event types — Added bills.archived and reimbursements.batch_payment_reimbursed to the list of supported webhook event types, so you can subscribe to notifications when bills are archived or batch reimbursement payments are processed. View endpoint Scheduled deactivation date for new users — Added scheduled_deactivation_date field to the create user request. For guest users, this automatically defaults to 6 months from the invite creation date unless explicitly set to null. View endpoint Date column type for custom records — Custom record tables now support a datetime column type with date display, allowing you to store and display date values in custom and matrix tables. Attachments on custom form fields — Custom form field responses now include an attachments array containing document metadata with download URLs, filenames, and version information. New transaction decline reason — Added AUTHORIZER_SPEND_ALLOCATION_ARCHIVED_FUNDS enum value to transaction decline reasons, indicating a transaction was declined because the associated funds are archived. New OAuth scope — Added comments:write scope for granting write access to comments. New status_summary field on bills — Bill responses now include a status_summary field that provides a more granular view of a bill's lifecycle stage, with values like PAYMENT_SCHEDULED, APPROVAL_PENDING, PAYMENT_PROCESSING, PAYMENT_COMPLETED, and more. This gives you richer insight into exactly where a bill stands beyond the existing OPEN/PAID status. View endpoint Enhanced bill filtering by status_summary — The status_summary query parameter on the List Bills endpoint now uses a refined set of enum values (removing draft-related statuses like DRAFT_MISSING_INFO, DRAFT_PARSING, DRAFT_QUEUED, and DRAFT_READY) to filter bills by their detailed status. View endpoint New NON_ERP accounting field type — Added NON_ERP as a new enum value for accounting field types, allowing you to distinguish fields that are not sourced from an ERP system. View endpoint Clarified currency amount representations for bills and purchase orders — Documentation for amount fields on bills and purchase order line items now specifies that values are represented in the lowest denomination of the currency (e.g., cents for USD), making it easier to correctly interpret amount and unit_price fields. Filter limits by card — Added card_id query parameter to the List Limits endpoint, letting you filter for limits linked to a specific card. View endpoint Draft bill remote_id field — The draft bill response now includes a remote_id field, providing the external ID that identifies the bill on the client's side. View endpoint Custom Records column display types — Number columns now support a display_type field with values currency, number, and percentage. Text columns now support a display_type field with values email, paragraph, phone, plain_text, and url, giving you more control over how column data is presented. New endpoint to fetch accounting connection by ID (beta) — Retrieve details for a specific accounting connection using its connection_id. View endpoint Renamed tax code options request field — The POST /developer/v1/accounting/tax/code/options endpoint now uses options instead of tax_codes as the request body field name for uploading tax code options. View endpoint New item_receipts.created webhook event — Subscribe to item_receipts.created events to get notified when new item receipts are created. View endpoint Transaction functional_currency_amount moved behind query parameter — The functional_currency_amount field is no longer returned by default on transactions. Specify it via a query parameter to include the entity's functional currency amount in the response. View endpoint New tax code options management (beta) — Upload, list, update, and delete tax code options for accounting connections with filtering by remote_id, is_active, and code. View endpoints Enhanced vendor filtering — Added merchant_id query parameter to the List Vendors endpoint for filtering by associated card merchants. View endpoint Draft bill creation and updates — Create and update draft bills with support for accounting fields, line items, and vendor details. View endpoint Bills now include item receipt associations — Added item_receipt_ids field to bill responses showing linked item receipts from matched purchase orders. Accounting connection migration status — Added is_ready_to_migrate field to accounting connections indicating readiness for ERP migration workflows. New inventory item accounting field endpoints (beta) — Create, read, update, and delete inventory item accounting fields for tracking inventory items in your ERP system. View field endpoint Inventory item options management (beta) — Upload, list, update, and delete inventory item options with filtering by remote_id, is_active, code, and is_synced. View options endpoint New tax code accounting field endpoints (beta) — Create, read, update, and delete tax code accounting fields for managing tax codes in your ERP system. View endpoint Transaction sync button setting — Added transaction_sync_button_enabled setting to accounting connections for enabling manual transaction sync functionality in API-based integrations. Extended accounting field requirements — Added VENDOR_CREDIT enum value to is_required_for arrays in accounting fields, allowing fields to be required for vendor credit objects. New vendor awarded audit event — Added Vendor awarded event type to audit logs for tracking vendor award actions. Enhanced transaction data — Added functional_currency_amount field to transaction responses, showing the transaction amount in your entity's functional currency when an ERP with functional currency is configured. View endpoint Tax rate field renamed — The gl_account_id field in tax rate resources has been renamed to accounting_gl_account_id for better clarity across accounting tax rate endpoints. View endpoint New tax rates endpoints (beta) — List, upload, update, and delete tax rates for accounting integrations with support for up to 500 tax rates per batch upload. View list endpoint and View upload endpoint Enhanced bill creation — Added use_default_vendor_contact parameter to automatically use the vendor's default contact when creating bills, making vendor_contact_id optional. View endpoint Ramp category code enums — Category fields now include explicit enum values and descriptions for all Ramp category codes (1-44) across transactions, vendors, cards, and spending restrictions for better validation and documentation. New audit log event types — Added RFX (Request for X) and sourcing event types to audit logs including RFX creation, vendor management, clarification processes, and sourcing event status changes. New purchase order line item management (beta) — Add, update, and delete line items on existing purchase orders. View add endpoint, View update endpoint, View delete endpoint New card vault endpoint (beta) — Retrieve sensitive card details by card ID for vault API access holders. View endpoint Default payment method support for bills — Added use_default_payment_method parameter to create bills using vendor's configured default payment method. View endpoint Enhanced vendor data — Added code field to accounting vendors for ERP system vendor codes. Item receipt line item tracking — Added id field to item receipt line items and item_receipt_line_item_ids arrays to bill line items and bill inventory line items for better purchase order tracking. New audit log event types — Added AI custom field config executed, External ticket created zendesk, and User previewed event types. New webhook events — Added purchase_orders.archived, reimbursements.sync_requested, and transactions.sync_requested webhook event types. Additional managed portfolio accounts — Added new managed portfolio account types: MANAGED_PORTFOLIO_INTEREST_INCOME_ACCOUNT, MANAGED_PORTFOLIO_POSITION_ASSET_ACCOUNT, MANAGED_PORTFOLIO_REALIZED_GAIN_LOSS_ACCOUNT, and MANAGED_PORTFOLIO_UNREALIZED_GAIN_LOSS_ACCOUNT. Enhanced item receipts filtering — Added query parameters for filtering item receipts by entity_id, purchase_order_id, and purchase_order_line_item_id, plus include_archived option to include archived receipts and standard pagination with start and page_size. View endpoint New currency support — Added USDB currency code for USD Basecoin across all endpoints that support currency values. New audit log event types — Added support for tracking blank canvas workflow pause status updates, contract combinations, SFTP authentication events, and vendor management expansion request changes in audit logs. Enhanced user management — Added scheduled_deactivation_date field to user objects for scheduling automatic user deactivation on a specific date. View endpoint New SFTP configurations resource type — Added SFTP Configurations as a supported resource type in audit logs for tracking SFTP-related configuration changes. Enhanced bill filtering — Added status_summaries query parameter to filter bills by multiple status summaries like APPROVAL_PENDING, PAYMENT_COMPLETED, or DRAFT_READY. View endpoint Tracking category metadata in custom records — Custom record accounting field options now include a tracking_category object with metadata like display name, active status, and accounting provider connection status alongside the existing tracking_category_uuid. New accounting connection update endpoint (beta) — Update settings for API-based accounting connections, including vendor credits configuration. View endpoint Enhanced reimbursement filtering — Added state query parameter to filter reimbursements by status including APPROVED, AWAITING_EXPORT, PENDING, REIMBURSED, and other states. View endpoint New vendor credits endpoints (beta) — Retrieve vendor credits across all vendors or for specific vendors with filtering by accounting dates and usage status. View endpoint Individual vendor credit retrieval (beta) — Fetch detailed information about a specific vendor credit including line items, applied bills, and remaining amounts. View endpoint Vendor-specific credit listing (beta) — List vendor credits for a specific vendor with the same filtering options as the global endpoint. View endpoint New audit log event types — Added Card delivered, Reimbursement submitted, Reimbursements disabled, and Reimbursements enabled event types for enhanced audit tracking. Custom form comments support — All custom form field responses now include an optional comment field for additional context on responses. Enhanced custom form entity support — Added vendors to the list of supported entity types for custom forms alongside existing entities like bills, users, and transactions. New webhook event — Added spend_requests.comment_created event type for webhooks to notify when comments are created on spend requests. Enhanced custom records relationships — Added relationship metadata to tracking category fields in custom record line items for improved data linking between tracking categories and custom field options. Custom records tracking category requirement — Added tracking_category_uuid as a required field for native reference column types in custom records, enabling better integration with accounting field options. Multiple purchase orders per bill — Bills can now be linked to multiple purchase orders using the purchase_order_ids array field in both create and update operations, replacing the previous single purchase_order_id field. View endpoint ERP migration tool — Set up a new API-based accounting connection to seamlessly migrate from your current ERP to a new one. View guide Enhanced bills filtering — Added invoice_number query parameter to filter bills by exact invoice number. View endpoint Enhanced receipts filtering — Added reimbursement_id query parameter to filter receipts for a specific reimbursement. View endpoint Enhanced users filtering — Added status query parameter to filter users by status (USER_ACTIVE, USER_INACTIVE, USER_SUSPENDED), replacing the deprecated include_deleted parameter. View endpoint Enhanced accounting field filtering — Added is_active and code query parameters for filtering custom accounting fields and field options by active status and code. View endpoint New vendor bank account archiving — Archive vendor bank accounts with automatic transfer of associated bills, drafts, and recurring templates to a replacement account. View endpoint New currency support — Added CNH (Chinese Yuan Renminbi offshore) to supported currencies across bill and purchase order endpoints. New DATE input type — Added DATE enum value for custom accounting field input types, supporting ISO format (YYYY-MM-DD) in free form text fields. Enhanced audit log events — Added new vendor management agreement event types including document operations (deleted document, linked document, uploaded document) and purchase order operations (linked purchase order, unlinked purchase order). Enhanced attachment types — Added EMAIL and VENDOR_CREDIT enum values for bill attachment types. Provider name fields — Added provider_name field to custom accounting fields, field options, GL accounts, and vendors to identify the accounting connection source. Reimbursement payment tracking — Added payment_batch_id field to reimbursements for tracking payment batch associations. Enhanced vendor filtering — Added external_vendor_id query parameter to filter vendors by customer-defined external identifiers, independent of accounting system remote IDs. View endpoint External vendor ID support — Added external_vendor_id field to vendor creation, updates, and responses for tracking customer-defined identifiers separate from accounting system remote IDs. View endpoint Purchase order line item matching — Added purchase_order_line_item_id field to bill line items for tracking matched purchase order line items. View endpoint Real-time payment support — Added RTP enum value for Real-Time Payment processing method. Same-day bill payments — Added is_same_day parameter to enable same-day delivery for eligible ACH payments when creating bill payments. View endpoint Spend program line item fields — Added line_item_accounting_fields to spend program responses, showing custom accounting fields enabled for line items in each program. View endpoint New audit log event — Added Vendor management agreement notification type switched event type for vendor management tracking. Form 1099 compliance type — Added FORM_1099 enum value to vendor compliance types for tax reporting requirements. Enhanced date filtering — Improved transaction filtering parameters with explicit ISO8601 format specification for synced_after, from_date, and to_date parameters. View endpoint Draft bill tracking — Added draft_bill_created_at field to bill responses for tracking when bills were originally created as drafts. View endpoint Delete matrix table rows — Remove individual rows from custom matrix tables using the delete endpoint. View endpoint Matrix table row IDs — Matrix table rows now include an id field for unique identification and row-level operations. Number column support for custom tables — Create and use number columns in custom tables with the new number column type for numerical data storage. Default entity for vendors — Added default_entity_id field to vendors for associating a default business entity with vendor records. New procurement event type — Added Procurement agent run completed enum value for audit log events tracking procurement automation completion. New limited edition card designs — Added holiday-themed card design options including limited_edition_gifts, limited_edition_gingerbread_man, limited_edition_grinch, limited_edition_hot_cocoa, limited_edition_reindeer, limited_edition_santa, and limited_edition_snowman enum values for card customization. Bill accounting sync control — Added enable_accounting_sync boolean field to bill responses that indicates whether the bill should sync to the ERP system. View endpoint Manual vendor payment method — Added MANUAL enum value to vendor payment method kind field for manually processed payments. New accrual AP account type — Added ACCRUAL_AP_ACCOUNT enum value for accrual accounts payable account usage type. Enhanced custom field values — Custom field values now support number type in addition to boolean and string types. Enhanced bill creation — Added enable_accounting_sync field to control whether bills sync to your ERP system, with additional validation when using remote_id. View endpoint Matrix table column management (beta) — Add result columns to existing matrix tables without modifying input columns via POST /developer/v1/custom-records/matrix-tables/{table_name}/columns. View endpoint Matrix table column renaming (beta) — Change the API name of matrix table columns while preserving human-readable labels via PATCH /developer/v1/custom-records/matrix-tables/{table_name}/columns/{column_name}. View endpoint Number column support for matrix tables (beta) — Matrix tables now support number input columns in addition to reference columns, enabling numeric thresholds and values in matrix configurations. Enhanced vendor data — Vendor accounts now include accounting_connection_id field to identify which accounting connection the vendor is associated with. View endpoint New audit log events — Added "Vendor management agreement status changed" and "Vendor management edited agreement field" event types for tracking vendor agreement modifications. New audit log event type — Added Created fund from purchase order enum value to track fund creation events from purchase orders in audit logs. Enhanced user filtering — Added COORDINATOR role to user role filtering options for better user management capabilities. View endpoint New accounting sync type — Added REPAYMENT_SYNC enum value for repayment synchronization via the object sync endpoint. View endpoint Update purchase order support (beta) — Update existing purchase orders with new accounting field selections, line items, and spend date ranges via PATCH /developer/v1/purchase-orders/{purchase_order_id}. View endpoint Change custom table row external key (beta) — Update the external key identifier for existing custom table rows via PATCH /developer/v1/custom-records/custom-tables/{custom_table_name}/rows/{row_id}. View endpoint Enhanced bill payment methods — Added LOCAL_BANK_TRANSFER payment method for creating bill payments alongside existing options like CHECK, DOMESTIC_WIRE, and SWIFT. Flexible accounting field selections — Accounting field selections now support free_form_text as an alternative to field_option_external_id, allowing custom text values when predefined options aren't available. Improved quantity handling — Line item quantity fields now use number type instead of integer for more precise quantity tracking across bills, purchase orders, and item receipts. Enhanced user validation — Added 50-character limits for first_name and last_name fields, and minimum length validation for vendor names to ensure data quality. New trips endpoints (beta) — List all trips for your business with filtering by user IDs, status, date ranges, amount ranges, and trip names, or fetch individual trips by ID. Includes trip details like locations, spend events, total spend, and travel types. List trips | Get trip Enhanced custom records matrix filtering — Added filters parameter to filter matrix table rows by input column values using the new column filter structure with column_name and one_of matching. View endpoint Enhanced entity filtering — Added hide_inactive parameter to entity endpoints to filter out inactive entities. View endpoint New workflow base type — Added Workflow (Base) enum value for custom record types to distinguish base workflow configurations from standard workflows. Enhanced bill filtering by payment date — Added from_payment_date and to_payment_date parameters to the List Bills endpoint for filtering bills by their payment dates. View endpoint New Matrix tables for Custom Records (beta) — Create and manage lookup tables where unique input combinations map to result values, with endpoints for table creation, row management, and cell operations. View endpoints Enhanced spend program details — The Get Spend Program endpoint now includes custom_form_collection for form requirements and expanded response schema with detailed program information. View endpoint New vendor default payment method — Added default_payment_method field to vendor responses, showing the configured payment policy and update source for each vendor. Enhanced vendor filtering — Added accounting_vendor_remote_ids and vendor_tracking_category_option_ids query parameters to the List Vendors endpoint for filtering by accounting integration data. View endpoint New audit log event types — Added Agent access request resolved, Agent access requested, and Set member limit on shared fund event types for tracking agent access workflows and shared fund member limits. API Updates and Improvements New audit logs endpoint (beta) — Retrieve audit log events with filtering by user IDs, date ranges, event actor types, and event types. Supports pagination and comprehensive event history tracking. View endpoint Enhanced transaction filters — Added has_been_approved, all_requirements_met_and_approved, and has_statement parameters to filter transactions by approval status, requirements completion, and statement presence. The sync_ready parameter is now deprecated in favor of using sync_status with SYNC_READY. Enhanced user endpoints — Added include_deleted parameter to include deleted users in list responses. Enhanced reimbursements filtering — Added has_been_approved parameter to filter reimbursements by approval status. Enhanced purchase orders filtering — Added spend_request_id parameter to filter purchase orders by associated spend request. New accounting sync type — Added AMORTIZATION_ENTRY_SYNC enum value for amortization entry synchronization. New payment method type — Added CRYPTO_WALLET_TRANSFER enum value for cryptocurrency wallet transfers across bills, reimbursements, and transactions. Enhanced spend limit creation — Added accounting_rules parameter to set accounting rules when creating or updating spend limits and vault cards. Enhanced accounting connections — Updated description for creating accounting connections to clarify Universal CSV connection upgrade behavior, and added connection_type field showing connection type details. Vault cards endpoint publicly available — Create virtual cards through the vault endpoint. View endpoint Bill attachment upload support — Upload attachments to existing bills via POST /developer/v1/bills/{bill_id}/attachments. View endpoint Allow negative line items for bill creation — Bills can now include negative line items for credits and adjustments. Enhanced card schema in limits endpoint — Added cardholder_id, cardholder_name, created_at, and display_name fields to card data under the /limits endpoint. User access roles filter for limits — Added user_access_roles query parameter to the List Limits endpoint for role-based filtering. Minor unit conversion factor in currency response — Currency data now includes conversion factors for precise calculations. New entity relationship documentation — Comprehensive guide for understanding data connections across all Ramp objects. View guide Support for querying draft bills — Retrieve bills in draft status before they're finalized for payment processing. Filter archived bills — GET /bills endpoint now includes archived bills in response data. Filter transactions by spend program — Use spend_program_id parameter in GET /transactions to retrieve spend-program-specific transactions. Receipt affidavit URLs — GET /transactions now includes receipt affidavit URLs directly in the response for compliance workflows. Foreign exchange rates in bills — GET /bills now provides FX conversion rates for international payment processing. Vendor payment details management — Add and update vendor bank account information via POST /vendors/{vendor_id}/update-bank-accounts. View endpoint Filter purchase orders by spend request timeframe — Use spend_start_date and spend_end_date to retrieve POs tied to a specific spend window. New endpoint: POST /reimbursement/mileage — Log and submit mileage reimbursements via API. Search accounting vendors and GL accounts by remote_id — Simplifies mapping to ERP systems. Match bills to purchase orders — Enables programmatic linkage between bills and POs. Include is_manager in user invites — Supports setting manager status when inviting a user via API. Filter purchase orders by user_id — Use GET /purchase-orders with user_id to retrieve POs submitted by a specific user. accounting_date now returned in reimbursements — Available via GET /reimbursements for improved reconciliation workflows. New endpoint: POST /reimbursements/submit-receipt — Attach receipts directly to reimbursements via API. Auto-match uploaded receipts using OCR — POST /receipts can now automatically associate receipts with matching transactions. Temporary limit increases — Use PATCH /limits/{limit_id} to implement temporary spending limit boosts. Control declined transaction visibility — GET /transactions now defaults to excluding declines. Use state=DECLINED or state=ALL to include them. Search by accounting field selections — Filter transactions and bills based on assigned accounting fields for better categorization. Custom forms support — Retrieve and manage custom form metadata on Vendors, Purchase Orders, Transactions, and Limits using GET endpoints. API Updates New endpoint POST /connection//reactivate Support for specifying display_name on POST /accounting/fields New field card_present to GET /transactions Filter by employee_id for GET /transactions and GET /reimbursements Support for updating accounting custom field display_name New field accounting_date to GET /bills Support for requesting payment and tax details via email on POST /vendors Deprecated: GET /accounting/connection in favor of GET /accounting/all-connections Filter by awaiting_approval_by_user_id in GET /transactions and GET /reimbursements Support for creating vendors when approval policies are in place Filter bills by payee_id and sync_status parameters Support for managing vendor addresses via vendor APIs Ability to specify employee_id on user creation New fields status and last_linked_at to GET /accounting/connections New field transaction_accounting_date to transactions APIs Filter transactions by approval_status parameter Filter accounting custom field options by remote_code parameter Beta: Procurement API now available for Ramp Plus customers to manage Purchase Orders and Item Receipts for procurement workflows. Contact your Ramp representative for more information New sync_status field to Transactions, Reimbursements, Transfers, and Cashbacks for tracking sync state Filter with sync_status query parameter to retrieve records based on their sync state Query Accounting Custom Fields and Options by remote_id parameter for easier external system mapping Mark Accounting Custom Fields as required to enforce validation before sync-ready status Ramp MCP Server — Enables developers to expose business data through an LLM-friendly SQL interface. Available as a Python package with support for custom tools, data loaders, and SQL execution. View on GitHub or read our blog post Beta: Custom Records now available for Ramp Plus customers to add custom fields to users for advanced workflows (e.g., Cost Center, Division, Custom Approvers). Define and manage custom or native tables via CSV, SCIM, or API. Contact your Ramp representative for more information New endpoint GET /developer/v1/bank-accounts/{bank_account_id} to retrieve linked bank account information Bills and Vendors API Launch New: Manage vendors, bills, and payments via API for your Accounts Payable workflows All endpoints are accessible in both Sandbox and Production environments Support for creating, updating, deleting, and retrieving Vendors, Vendor Contacts, and Bills Deprecation Notice: Cards API Deprecated: Ramp is transitioning from the Cards API to the more flexible Limits API Use the Limits API for card issuance and management functionality The Limits API enables one-to-many relationships between limits and cards and shared limits across users Physical card shipping will continue to be supported via the Cards API until full migration support is provided --- title: CLI source_url: /developer-api/v1/cli text_url: /llms-guides/cli.txt summary: Authenticate with OAuth, manage expenses, approve bills, book travel, and more from your terminal or AI agent. content: Authenticate with OAuth, manage expenses, approve bills, book travel, and more from your terminal or AI agent. The CLI is open source. View the repo at github.com/ramp-public/ramp-cli. This detects your platform, downloads a pre-built binary, and sets up the ramp command. If you already have uv installed: The CLI uses OAuth to authenticate against the Ramp API. Run ramp auth login to open a browser-based OAuth flow. By default, the CLI connects to the Sandbox environment. Switch environments with the --env flag or set a default: Every CLI action runs as the user who authenticated via ramp auth login. This means: Actions are attributed to you. Approving a bill, submitting a reimbursement, or posting a comment will show your name in Ramp, just as if you performed the action in the dashboard. Permissions match your Ramp role. ramp transactions list --transactions_to_retrieve my_transactions returns your own transactions. all_transactions_across_entire_business requires admin access. If you can't see it in the dashboard, you can't see it in the CLI. Data visibility follows your access. Non-admins see only their own transactions, bills, and reimbursements. Admins can query across the business. Run ramp users me to confirm which user the CLI is acting as. The CLI supports two output modes. In a terminal, output defaults to human-readable tables. When piped, it switches to JSON automatically. --human Human-readable table output (default in terminal) --agent Machine-readable JSON output (default when piped) --wide Show all columns in table output The CLI includes a skill system for AI agent frameworks. Skills are structured instructions that teach an agent how to use Ramp for specific workflows like approving expenses, uploading receipts, or making purchases. Commands The CLI is organized into commands and resources. Commands handle setup and configuration. Resources map to API entities, each with their own set of tools. auth Login, logout, check status config Get/set CLI configuration env Show or set default environment (sandbox/production) applications Apply for a Ramp account skills Browse and install agent skill instructions feedback Submit feedback about the CLI Common resources include the following. Usage: ramp [OPTIONS] accounting categories, category-options bills search, get, draft, pending, approve, attachments funds list, activate, creds, lock general comment, explain, help-center, policy purchase_orders search, get receipts upload, attach reimbursements list, pending, submit, approve, edit requests pending, approve transactions list, get, approve, edit, missing, flag-missing, explain-missing, memo-suggestions, trips travel list, create, bookings, locations users me, search, org-chart Run ramp --help to see all available flags for any tool. Global flags These flags work with any command: --env, -e sandbox (default) or production --output, -o Output format: json or table --quiet, -q Suppress progress output --no-input Disable interactive prompts (for CI/scripts) Each tool has its own flags. Common patterns: --json TEXT Raw JSON request body (bypasses flags) --dry_run, -n Print request without sending --page_size N Results per page --next_page_cursor Resume pagination from previous response Common workflows For non-interactive environments, use --no-input to disable prompts and --quiet to suppress progress output: To contribute to the CLI or run it from source: See the LICENSE for details. Need help? Submit a Developer API support ticket and our team will follow up. --- title: Custom Records source_url: /developer-api/v1/custom-records text_url: /llms-guides/custom-records.txt summary: The Custom Records API allows you to extend Ramp's data models with your own custom fields and data. Whether you need to add custom fields to existing Ramp objects or create entirely new data structures, this API provides the flexibility to integrate Ramp with your business processes. content: The Custom Records API allows you to extend Ramp's data models with your own custom fields and data. Whether you need to add custom fields to existing Ramp objects or create entirely new data structures, this API provides the flexibility to integrate Ramp with your business processes. Custom Records are available to Ramp Plus and Ramp Enterprise customers only. For more information, contact your Ramp representative. With the Custom Records API you can: Extend Native Objects: Add custom fields and relationships to Ramp objects such as Users, Locations, Departments, and Accounting Field Options Create Custom Tables: Build your own data structures to store business-specific information Link Data: Create relationships between custom and native data Query and Filter: Search and retrieve data using flexible filtering options At this time, the API supports writes to custom record values, as well as creating and reading table and column definitions. To get started, use the Custom Records Configuration API to set up tables and columns. Then, use the Native Tables and Custom Tables API to manage and manipulate data. Native tables vs custom tables Custom Records track data in either Native Tables or Custom Tables, depending on the type of data. Native tables allow extending core Ramp objects with custom fields These tables use Ramp IDs for row identification, matching rows to the core Ramp object they extend. See the Supported Native Tables section for a list of supported native tables and how to reference them. If a Ramp ID is provided that does not yet exist for a table, the row will not be created and an error will be returned. If a referenced native Ramp object is deleted, the extension row will not be accessible. Queries and references will indicate value not found. If additional extensibility above what a Ramp object provides is required, custom tables can be used. Custom Tables can store arbitrary data, and can help represent data that doesn't fit into the core Ramp objects. Rows that are on Custom Tables are identified using external keys. If an external_key field is provided that does not yet exist for a table, a new row with that external_key will be created. Note that external keys are immutable, case-sensitive, and must be unique within a table. This diagram shows: Users (Native Table) Has one home_state (reference to the States table) Can be a Regional Director for one or more regions (column corresponding to the regional_directors column on the Regions table) Uses Ramp User UUID as primary key Has one home_state (reference to the States table) Can be a Regional Director for one or more regions (column corresponding to the regional_directors column on the Regions table) Uses Ramp User UUID as primary key States (Custom Table) Has one region (reference to the Region table) Has many Users (column corresponding to the home_state column on the Users table) Uses external_key as primary key Has one region (reference to the Region table) Has many Users (column corresponding to the home_state column on the Users table) Uses external_key as primary key Regions (Custom Table) Can have many Regional Directors (reference to the User table) Has many States (column corresponding to the region column on the States table) Uses external_key as primary key Can have many Regional Directors (reference to the User table) Has many States (column corresponding to the region column on the States table) Note how bidirectional relationships are maintained automatically through corresponding columns. The example matches the schema shown in the diagram above, showing how Users can have a home state and be regional directors for multiple regions. Creating tables To add custom fields to existing Ramp objects, you need to first extend the native table. This creates a container for your custom columns on that native object: For a list of supported Ramp tables, see the Supported Native Tables section. Extending the Users table: Custom tables allow you to store arbitrary business data that doesn't fit into Ramp's core objects. To create a custom table, use the /configure/custom-tables endpoint: Let's create the States and Regions tables from our example: Creating the States table: Creating the Regions table: Note: The name (or API name), is used to identify the table across API calls. It must be a lowercase, alpha-only slug. Underscores are permitted, but not at the beginning and end. The table label is displayed to users within Ramp and can be an arbitrary string. Creating columns Once you've created or extended a table, you can add columns to store data. There are two types of columns: reference columns for relationships between tables, and primitive columns for simple values. When creating custom columns, you will need to specify a name (also called an API name) and column label. The API name is used to identify the column across API calls while the column label is displayed to users within Ramp. They have the same value constraints as table API names and labels. Reference columns create relationships between tables. When you create a reference, the API automatically creates a corresponding column on the referenced table to maintain bidirectional relationships. For more information, see the Bidirectional References and has_more section. Adding a home_state column to the Users native table: This creates: A home_state column on Users that references States (many Users can have one State) A residents column on States that shows all Users from that state (automatically maintained) Adding a region column to the States table: Adding regional_directors to the Regions table: Primitive columns store simple data types like text or boolean values, useful for storing properties of an object, like a State's Name. To create a column, use the /columns endpoint for your table: Adding a name column to the States table: Note: Primitive columns are typically less useful in workflows, as it's harder to make conditions based on them. If you would like to create workflow conditions that check for a specific value of a column, you should make a Custom Table and use a reference column instead. Working with tables To get started with either custom or native tables: List available tables using the /custom-tables or /native-tables endpoints Get column definitions for a specific table using the /{table_name}/columns endpoint Use the column information to understand the table's structure and available fields Primitive columns A text column contains simple text/string values A boolean column contains true or false values Reference columns Reference columns are a special type of column that can reference rows on other tables. They can either be: A native_reference to a Native Table, linking to core Ramp objects (users, departments, locations, etc.) When writing a reference value, requires both Ramp column_name and Ramp object value for identification (e.g., {"column_name": "id", "value": ""}) When writing a reference value, requires both Ramp column_name and Ramp object value for identification (e.g., {"column_name": "id", "value": ""}) A custom_reference to a Custom Table, linking to other custom tables you've created Only requires the external key for identification Only requires the external key for identification For custom tables, you can: Create or update rows using PUT /custom-tables/{table_name}/rows Delete rows using DELETE /custom-tables/{table_name}/rows Append or remove individual cells using the -/append and -/remove endpoints For native tables, you can: Read rows using GET /native-tables/{table_name}/rows Update custom field values using PUT /native-tables/{table_name}/rows Append or remove custom field values using the -/append and -/remove endpoints When writing to rows, keep these important points in mind: All rows in a single PUT request must write to the same set of columns. If a row should not have a value for a column, that column must still be included in the request with an explicit null contents value. If a row should not have a value for a column, that column must still be included in the request with an explicit null contents value. For columns that reference multiple items, each reference must be a separate cell entry References to custom tables require only the external key, while references to native tables require both a column name and value Some columns (those with allows_writes=False) do not allow direct writes. In these cases, write to the corresponding, writable column on the other table instead. For more information, see the Bidirectional References and has_more section. PUT operations on columns that reference multiple items (lists) will replace all existing values with the provided values. To modify list contents without replacing everything, use the -/append and -/remove endpoints A PUT operation with a null contents value will remove all values from that field For best performance: Write to one reference column at a time when updating multiple references Or write to multiple columns at once when setting single values Write to one reference column at a time when updating multiple references Or write to multiple columns at once when setting single values Using the example Custom Table schema for Regions from above, let's setup the Northeast region to have one regional director (User email=alice@company.com) and Southwest region to have two regional directors (User id=01956422-6793-7700-adb4-3f1bd635ee49, User email=bob@company.com). Note how: The Northeast region has a single director, referenced by email The Southwest region has two directors, one referenced by UUID and one by email Each director reference is a separate cell entry All references to native tables (Users) include both column_name and value For more information about referencing native tables, including supported column names for identification, see the Supported Native Tables section. Pagination and filtering When listing rows, both custom and native tables support: Page size control (default: 50, max: 100) Cursor-based pagination using the start parameter Filtering by external keys (custom tables) or Ramp IDs (native tables) Column-specific filters using filter.column_name.operation You can filter table rows by specific column values using the format filter.column_name.operation=value. The following operations are supported: one_of: Match any value in a list is_not: Matches no values in a list For columns that reference other tables, use different identifiers based on the table type: Native tables: Use the Ramp ID as the filter value Custom tables: Use the external key as the filter value Example filters: Example query for a information about a specific Ramp user: This response shows: The user's home state (California) The regions they are a director for (West and Northwest) Both relationships are maintained automatically through bidirectional references has_more: false indicates we have all the references for each relationship When you create a reference between tables, the API automatically maintains the reverse relationship by creating a corresponding column: Reference Column: The column you create (e.g., home_state on Users) Corresponding Column: Automatically created on the referenced table (e.g., residents on States) Key points about corresponding columns: The corresponding_column_name is required when creating a reference The corresponding_column_label is optional and will be auto-generated if not provided Corresponding columns have allows_writes=false - you must write to the original reference column This bidirectional relationship allows you to: Navigate data relationships in both directions Maintain data consistency Build complex queries from any starting point When a reference column's contents have has_more as true, it indicates that not all referenced rows are included in the response. To retrieve the complete set of references, you'll need to query the referenced table directly using the corresponding column. To get all states in the West region, query the states table using the corresponding column: This will return all states with the a reference to the West Region in their region column. Supported native tables Note that when provding a contents value that references a ramp object, it should be formatted similarly to: {"column_name": "id", "value": }. Different Native Ramp tables allow other column names to be used as well. id User's Ramp UUID {"column_name": "id", "value": ""} email User's email address {"column_name": "email", "value": "user_email@company.com"} Users endpoint Location's Ramp UUID {"column_name": "id", "value": ""} name Location's name {"column_name": "name", "value": "New York City"} Locations endpoint Department's Ramp UUID {"column_name": "id", "value": ""} Department's name {"column_name": "name", "value": "Engineering"} Departments endpoint Option's Ramp UUID {"column_name": "id", "value": ""} field_id::option_id Combined accounting field remote id and accounting field option remote id {"column_name": "field_id::option_id", "value": "Projects::Project A"} Make sure that if you're using this format, Accounting Field Options endpoint Note: Use the ramp_id from the response to reference the accounting field option in a custom table or row. Entity's Ramp ID {"column_name": "id", "value": ""} Enitity's name {"column_name": "name", "value": "Acme Corp LLC"} Entities Endpoint Bill's Ramp UUID {"column_name": "id", "value": ""} Bills endpoint Transaction's Ramp UUID {"column_name": "id", "value": ""} Transactions endpoint Reimbursement's Ramp UUID {"column_name": "id", "value": ""} Reimbursements endpoint ERP Integrations — sync custom fields between Ramp and your accounting system. Bill Pay, Cards, Reimbursements — native tables that Custom Records can extend. Custom Records Configuration — create and inspect table and column definitions. Native Tables — read and write custom values on Ramp's core objects. Custom Tables — create and manage arbitrary business data. Pagination — paginate rows and columns. Authorization — custom_records:read / custom_records:write scopes. --- title: Customized Approvers source_url: /developer-api/v1/customized-approvers text_url: /llms-guides/customized-approvers.txt summary: Matrix Tables let you define lookup relationships between Ramp objects. A common use case: mapping accounting dimensions (like projects, departments, or cost centers) to specific approvers so that spend is automatically routed to the right person. content: Matrix Tables let you define lookup relationships between Ramp objects. A common use case: mapping accounting dimensions (like projects, departments, or cost centers) to specific approvers so that spend is automatically routed to the right person. This guide walks through building a Project Approver Matrix that maps each project to a designated approver. Once configured, this matrix can drive approval workflows in Ramp — when an employee submits spend tagged to "Marketing Events," Ramp knows to route it to the assigned approver. Marketing Events Robert Gu Services Elizabeth Smith A Ramp Plus or Enterprise account An OAuth client with custom_records:read, custom_records:write, accounting:read, and users:read scopes At least one accounting field with options configured (e.g., a "Project Type" field synced from your ERP) Obtain an access token using client credentials: Use the access_token as a Bearer token in all subsequent requests. Matrix Tables that use accounting dimensions as inputs require the accounting_field_ramp_id — the Ramp UUID of the accounting field whose options you want to map. List your accounting fields to find the right one: Note the ramp_id — you'll need it when creating the matrix table. Step 3: Create the Matrix Table accounting_field_ramp_id is required When referencing accounting_field_options as an input column, you must include accounting_field_ramp_id to specify which accounting field's options to use. many_to_many: Each project can map to one or more approvers. Use PUT to replace all approvers for a row, or -/append and -/remove to modify them individually. many_to_one: Each project maps to exactly one approver. Use PUT to set or replace. For approval routing tables, many_to_many is usually the easier default. It works fine when you only have one approver today, and it gives you room to add backups later without changing the column definition. Step 4: Populate rows Use the PUT endpoint to upsert rows. Each row maps a project (input) to an approver (result). When referencing a user in the results, you can identify them by either their Ramp UUID or their email address: Ramp UUID {"column_name": "id", "value": "23b24cd9-47d2-438b-842e-f81783df0ab3"} Email {"column_name": "email", "value": "robert.gu@company.com"} For the inputs, accounting field options can be referenced by Ramp ID, or by their ERP-backed remote_code / remote_name values using code and name: Option ramp_id {"column_name": "id", "value": "08318be9-9a77-4504-8f0f-70fb5a85a3dd"} ERP code (remote_code) {"column_name": "code", "value": "MKT_EVENTS"} ERP name (remote_name) {"column_name": "name", "value": "Marketing Events"} code and name are often easier because they let you skip the extra field-options lookup, but they only work when the value is unique within the selected accounting field. If multiple options share the same code or name, the API returns an error. See Supported Native Tables for the full list of valid identifiers per object type. The response tells you how many rows were created vs updated. Upserting the same project with a different approver returns "inserted": 0, "updated": 1. To reassign a project to a different approver, PUT the same input with a new result set. For many_to_many columns, PUT replaces the full list of approvers for that row: The "updated": 1 confirms the existing row was modified, not duplicated. Remove a project-to-approver mapping using the row ID from the list-rows response: Returns HTTP 204 on success with no response body. Row ID is required You need the row's UUID to delete it. Get this from the id field in the list-rows response — there's no way to delete by input values directly. You can extend a matrix table with additional result columns without recreating it. For example, adding a secondary approver for backup coverage: Once added, you can populate both columns in a single upsert: Consistent columns in batch upserts All rows in a single PUT request must include the same set of result columns. If one row sets both approver and secondary_approver, every row in that batch must too. If a row doesn't have a secondary approver, you still need to include the column — the API will return an error otherwise. Rename a column or table Column and table API names can be changed without affecting the data. This is useful when refactoring your naming conventions. Returns HTTP 204. The column is now referenced as backup_approver in all subsequent API calls. The display label ("Secondary Approver") is unchanged. Returns HTTP 204. The old table name stops working immediately — update any integrations that reference the previous name. Naming rules API names must contain only lowercase letters and underscores. No hyphens, spaces, or uppercase characters. CUSTOM_RECORDS_7001 Table already exists Duplicate table name CUSTOM_RECORDS_7002 Unknown column name Column doesn't exist on the table CUSTOM_RECORDS_7003 Inconsistent set of columns Rows in batch have different result columns CUSTOM_RECORDS_7005 Cannot find native row Invalid ID or inactive option CUSTOM_RECORDS_7007 Duplicate input combinations Same input combo appears twice in one request CUSTOM_RECORDS_7018 Invalid native object column name Use id not ramp_id for field options CUSTOM_RECORDS_7020 Cannot append to many-to-one column Use PUT instead of -/append for single-value columns --- title: Data Relationships source_url: /developer-api/v1/data-relationships text_url: /llms-guides/data-relationships.txt summary: Relationship information is automatically shown in each resource's documentation. Look for relationship indicators next to UUID fields that reference other resources. content: Relationship information is automatically shown in each resource's documentation. Look for relationship indicators next to UUID fields that reference other resources. Ramp's API resources are interconnected through a rich set of relationships that mirror real-world business processes. Understanding these relationships is crucial for building effective integrations, especially when you need to: Plan complex integrations that span multiple resources Optimize API calls by understanding data dependencies Build comprehensive reporting that connects related data Design user interfaces that reflect business workflows When viewing any API resource, you'll see interactive relationship indicators next to UUID fields that reference other resources. These indicators show the target resource and relationship type, with clickable links for easy navigation. Relationship types The most common relationship type where multiple records reference a single parent record. Examples: Users → Department: Many employees belong to one department Transactions → User: Many transactions are made by one cardholder Bills → Vendor: Many bills are paid to one vendor A single parent record has multiple child records. Department → Users: One department has many employees Vendor → Bills: One vendor receives multiple bills User → Cards: One user can have multiple cards A direct relationship between two specific records. Business → Primary Location: Each business has one primary location Card → Primary User: Each card has one primary cardholder Vendor and counterparty relationships Three distinct entity types in Ramp represent "who you're paying" or "who you bought from." They live in different products, serve different purposes, and connect to each other in specific ways — confusing them is the most common integration error. What it is Card transaction counterparty Bill-pay payee GL coding value Created by Card network (automatic) User / API ERP sync / API Scope Global (all businesses) Per-business Per-business (per ERP connection) Mutable No (read-only) Yes (full CRUD) Has bank accounts No Yes Appears on Card transactions Bills, bill payments Both (as a coding field) API path (on Transaction object) /developer/v1/vendors /developer/v1/accounting/vendors Anchor product Cards Bill Pay ERP Integrations Merchant → Accounting Vendor (auto-match, conditional auto-create). When a card transaction arrives, Ramp attempts to match the merchant to an existing Accounting Vendor by name. If a match is found, the transaction is auto-coded. If no match exists, Ramp can auto-create a new Accounting Vendor from the merchant name — supported for QuickBooks, QuickBooks Desktop, NetSuite REST, and Xero only; defaults to ON; can be disabled per business. Vendor → Accounting Vendor (explicit link). Creating a bill-pay vendor does not auto-create an accounting vendor. Link them explicitly via PATCH /vendors/{id} with accounting_vendor_remote_id, in the Ramp UI when setting up a bill-pay vendor, or during a CSV vendor import. Accounting Vendor → Vendor (opt-in auto-create). When accounting vendors sync from an ERP, Ramp can optionally auto-create bill-pay vendors for them. Off by default; two modes (import all, or only those with bills in the ERP). Merchant ↔ Vendor: no direct link in the API. Ramp's product UI shows a unified payee view that connects these, but the linkage is not available through the Developer API. Ferguson is both a card merchant (technicians buy supplies there) and a bill-pay vendor (the company pays Ferguson invoices via ACH). Card transaction. A technician swipes at Ferguson. The transaction carries merchant_name: "Ferguson Enterprises". Ramp auto-matches it to the "Ferguson Enterprises" Accounting Vendor for GL coding. Bill payment. AP uploads a Ferguson invoice. The bill is assigned to the "Ferguson Enterprises" Vendor (bill pay), which has Ferguson's bank account on file. The vendor is linked to the same "Ferguson Enterprises" Accounting Vendor via accounting_vendor_remote_id. ERP export. Both the card transaction and the bill payment are coded to the same Accounting Vendor. When they export to the ERP, they both land under "Ferguson Enterprises" in the general ledger. The Accounting Vendor is the bridge — it unifies card spend and bill-pay spend for accounting, even though Merchant and Vendor are separate objects in the API. --- title: Support source_url: /developer-api/v1/debugging text_url: /llms-guides/debugging.txt summary: Ramp APIs will return an x-trace-id header in all API responses. The x-trace-id is particularly helpful for debugging, as it enables correlation between logs, metrics, and the API response, providing greater visibility into how the request was processed. content: Ramp APIs will return an x-trace-id header in all API responses. The x-trace-id is particularly helpful for debugging, as it enables correlation between logs, metrics, and the API response, providing greater visibility into how the request was processed. Include the x-trace-id when reaching out to Ramp support for quicker issue resolution. Use the x-trace-id to track specific requests across different systems and identify potential bottlenecks or failures. Make sure to log the x-trace-id in your application for easy reference in case you need to troubleshoot any API interactions. Every API response includes the trace ID in the headers: When contacting support, always include this trace ID for faster resolution. How to submit a Developer API support ticket Open Developer Support and click Connect to Developer Support team to start a ticket directly. You can also follow the in-product steps below. 1. Navigate to Company > Developer In the left-hand navigation, click Company to expand the menu, then select Developer. (You can skip this step if you're accessing directly from the developer console.) 2. Open Developer API Support On the Developer page, click the Developer API Support card. 3. Select "Connect to Developer Support team" In the chat window, select Connect to Developer Support team. 4. Answer the agent's questions The AI assistant will ask you a few questions about your issue. Answer as completely as you can, then review the pre-filled support ticket form to confirm the details look accurate. 5. Click "Submit Ticket" Click Submit Ticket to send your request to the team. Our Developer Support team will follow up with you over email. --- title: Deferred Tasks source_url: /developer-api/v1/deferred-tasks text_url: /llms-guides/deferred-tasks.txt summary: Some API calls, for example requesting for a new card, require asynchronous processing. They are all denoted with /deferred/ in the request URL. content: Some API calls, for example requesting for a new card, require asynchronous processing. They are all denoted with /deferred/ in the request URL. For these tasks, the API will return immediately with a task ID. This ID can then be used to call a GET deferred/status/{id} endpoint to check the status of the corresponding task. For example, let's create a new virtual card. The initial request to POST /developer/v1/cards/deferred/virtual will return an ID. This means that asynchronous task processing has started. Information about the task can be requested by calling the relevant deferred task status endpoint, in this case by calling GET /developer/v1/card/deferred/status/eca553b8-6923-42b2-aea9-8f3c15b079ff. The following information is made available: status: Represented by one of the following - STARTED, IN_PROGRESS, ERROR, SUCCESS. data: Additional details on status. If the task processing succeeded, status="SUCCESS"; in the case of creation tasks, the id field returns the new object ID. If the task processing failed, as indicated by status="ERROR", the error field is populated with information about the error. context: Static information about the initial request such as acting_user_id. For tasks with existing objects, such as card suspension, the ID of the targeted Ramp object is available. You should poll the status endpoint periodically until the task completes: Once the status becomes SUCCESS or ERROR, the task is complete and you can proceed accordingly. --- title: Developer MCP source_url: /developer-api/v1/developer-mcp text_url: /llms-guides/developer-mcp.txt summary: The Developer MCP server is subject to change. Feedback and questions can be submitted via a Developer API support ticket. content: The Developer MCP server is subject to change. Feedback and questions can be submitted via a Developer API support ticket. Developer MCP is Ramp's unauthenticated Model Context Protocol server for developers building with Ramp's API. It gives AI assistants live access to Ramp's developer documentation, API reference, and OpenAPI schemas directly inside your coding workflow. Unlike Ramp MCP servers that access account data, Developer MCP does not require a Ramp account, OAuth login, API key, or developer app. It only serves public Ramp Developer API documentation. Why use Developer MCP? Developer MCP reads from Ramp's published developer docs and OpenAPI exports, so assistants can look up current guides, endpoint reference material, request bodies, response shapes, and parameter definitions. Ask for an endpoint by operation ID, docs URL, HTTP method and path, or natural selector. Developer MCP can return the matching OpenAPI operation, including request and response schemas. Use Developer MCP to answer implementation questions without leaving your editor: authentication setup, pagination, webhooks, required fields, endpoint behavior, and schema details. Getting started Server URL: https://mcp.ramp.com/developer/mcp Open Claude Desktop Navigate to Settings → Developer Click 'Edit config' Add the Developer MCP server: Restart Claude Desktop — Developer MCP works without authentication. Add the Developer MCP server to your Claude Code session: Then run /mcp in your Claude Code session to activate the server and start asking API questions. Cursor Desktop App Required The Cursor desktop app must be installed for this one-click link to work. Add the Developer MCP server to your VS Code MCP settings: Add the Developer MCP server to your Codex CLI configuration (~/.codex/config.toml): Or add it from the terminal: For clients supporting remote MCP connections, use the server URL: https://mcp.ramp.com/developer/mcp Refer to your client's MCP documentation for specific configuration steps. Available tools Developer MCP exposes documentation tools backed by Ramp's public Developer Docs API. Search Ramp Developer API guides and endpoint reference content. Use this first for broad questions like OAuth setup, pagination, webhooks, or finding the right endpoint. Results can include guide pages and API operations. API results include fields like operation_id, method, endpoint_path, and docs_url. Return the OpenAPI operation object for one endpoint. You can select an operation by: Examples: If a selector is ambiguous, the tool returns matching operations so the assistant can retry with a more specific operation ID or method + path. Resolve a pasted docs artifact to a canonical guide, file, or API operation. Accepted inputs include docs URLs, guide slugs, virtual paths, operation IDs, METHOD /developer/v1/..., and bare endpoint paths. Read one exported docs file by virtual path. The response includes the file body plus available metadata such as title, source URL, and content type. List files and directories in the docs virtual filesystem. Useful for browsing guide exports under paths like: Return the docs API root index and top-level directories. This is mainly useful when an assistant needs to orient itself before browsing or reading files. Submit feedback about Developer MCP, Ramp's API docs, or confusing tool results. Use this to report missing docs, incorrect schemas, unexpected behavior, or suggestions for improving the developer experience. Recommended workflow Search with developer_docs_search Read the most relevant guide with developer_docs_read Use developer_docs_schema when exact request or response fields are needed Search by topic or endpoint name Pass the returned operation_id into developer_docs_schema If the schema contains $ref values, read /openapi/developer-api.json with developer_docs_read to resolve shared components Use developer_docs_resolve If the result is a guide or file, use developer_docs_read If the result is an API operation, use developer_docs_schema Troubleshooting Configuration not working: Verify JSON syntax in configuration files Ensure file paths are correct for your operating system Restart your client after making configuration changes Node.js or npm issues: Ensure Node.js is properly installed Try npm install -g mcp-remote to install the required package Remote MCP connection issues: Remote MCP connections are early technology. If connection fails, restart your client and try again Ensure your client supports HTTP-based MCP connections Ambiguous endpoint result: Retry with both HTTP method and path, for example DELETE /developer/v1/bills/{bill_id} Or use the returned operation_id directly with developer_docs_schema No useful search results: Search with more specific terms Use scope=/api for endpoint searches Use scope=/guides for prose documentation searches Schema contains $ref: Read /openapi/developer-api.json with developer_docs_read Resolve references against #/components/schemas/... Support: Submit a Developer API support ticket Feedback Tool: Use developer_submit_feedback directly within the MCP interface --- title: ERP Integrations source_url: /developer-api/v1/erp-integrations text_url: /llms-guides/erp-integrations.txt summary: A working two-way sync between Ramp and your customer's ERP: chart of accounts mirrored from the ERP into Ramp, and transactions, bills, reimbursements, and payments exported back from Ramp once they're ready. content: A working two-way sync between Ramp and your customer's ERP: chart of accounts mirrored from the ERP into Ramp, and transactions, bills, reimbursements, and payments exported back from Ramp once they're ready. An API-based accounting connection — distinct from Ramp's direct integrations (QuickBooks, NetSuite, etc.) — that gives your platform full control over the data exchange. Your service pushes the customer's chart of accounts into Ramp so users can code spend against it, then pulls ready-to-sync objects (transactions, bills, reimbursements, transfers, cashbacks) back out for posting in the ERP. The connection is one customer to one provider; multi-entity customers scope reads with entity_id. End users keep working in Ramp's UI; coding selections you uploaded show up as standard fields on every transaction. Estimated time: 1–2 days for a minimal connection; 1–2 weeks including tax codes, vendor credits, sync button, and production hardening. Prerequisite knowledge: OAuth 2.0 client credentials, webhooks, your ERP's chart-of-accounts model. Required: Ramp account or sandbox, an OAuth app with accounting:read, accounting:write, vendors:read. Reimbursement and transaction flows additionally need reimbursements:read and transactions:read. Recommended: read Bill Pay for the bill and vendor objects you'll be syncing, and Data relationships for how Vendors, Merchants, and Accounting Vendors connect at coding time. Prerequisites: a remote ERP system you can write to, and a webhook receiver if you want event-driven sync. Which objects to sync. Bills, transactions, reimbursements, transfers, and cashbacks all use the same sync_status model. Start with whichever your customers code most; add the rest later — the wiring is identical. Webhooks vs. polling. Webhooks (*.ready_to_sync) push within seconds. Polling (sync_ready=true) is simpler to operate and good enough at 1–4 hours weekdays / 12 hours weekends. Most integrations begin with polling and add webhooks once volume justifies it. Sync-button opt-in. When enabled, customers can trigger syncs from the Ramp UI and you must respond within 5 minutes — only opt in once your worker can guarantee that latency. New build vs. migration. The Implementation steps below assume a fresh, active connection — the right path for new customers. If you're switching a customer off a direct integration (QuickBooks, NetSuite, etc.), skip ahead to Migration tool instead; it's a complete linear walkthrough that preserves historical codings during cutover. The bidirectional sync lifecycle, end-to-end: Implementation Open a Developer-API accounting connection. The remote_provider_name is what your customer sees in Ramp when picking providers. Check for an existing connection with GET /developer/v1/accounting/all-connections; remove one with DELETE /developer/v1/accounting/connection. Disconnecting unlinks the connection Use this before changing providers. See Migration tool for guidance on preserving data during connection changes. Verify: the response includes an id you can GET back with status: "linked". The connection is now live — move on to step 2. Push the ERP's coding surface into Ramp so users can apply it. All four uploads accept batches up to 500, all-or-nothing per batch. GL accounts Required POST /accounting/accounts Custom fields (e.g. Department) Optional POST /accounting/fields Custom field options POST /accounting/field-options Accounting vendors POST /accounting/vendors Entities (subsidiaries) UI only Read-only via API; reads accept entity_id filter Chart of Accounts cannot be modified for Ramp accounts using a direct accounting connection This applies to GL accounts, custom fields, and vendors — they become read-only via API when a direct connection is active. Custom fields and options Custom fields let you import ERP classifications like Department, Cost Center, or Location. Create the field first, then upload its options using the returned ramp_id. Lifecycle: delete vs. hide To remove a GL account, field option, or vendor from cardholder selection, DELETE it (sets is_active: false; reactivate with PATCH { "reactivate": true }). Use PATCH { "visibility": "HIDDEN" } on a field option to hide it from new coding while still syncing historical values. Use when You never want to sync this item again You want to stop new coding but preserve historical values is_active Set to false Remains true Visible to cardholders No Existing codings preserved Yes, but item cannot be synced Yes, and item can still be synced How to reverse PATCH { "reactivate": true }; for custom fields, POST the same field ID PATCH { "visibility": "VISIBLE" } Applies to Fields, field options, GL accounts, vendors Field options only Prefer hide over delete for field options Hiding is less disruptive because it keeps the option active for sync purposes. Only DELETE when you are certain the item should be fully deactivated. Batch upload limits All batch operations use all-or-nothing processing — if any item in a batch fails validation, the entire batch is rejected. Limits apply per API call, not as totals; for 2,000 field options you'd make four 500-option calls. GL Accounts 500 accounts Accounting Vendors 500 vendors Custom Field Options 500 options Accounting Syncs 5,000 successful syncs or 5,000 failed syncs Multi-entity: entities (subsidiaries) are created and managed directly in the Ramp UI. When fetching objects via the API, scope requests to a specific entity using the entity_id parameter. See Ramp support for multi-entity businesses. Accounting vendors are ERP-side identifiers; Ramp vendors are the merchant records cardholders see. After step 2, link them so transactions and bills carry the right remote ID. 1. Create or update the accounting vendor (already covered in step 2 — repeated here for the full linking flow): 2. Link the Ramp vendor to the accounting vendor via accounting_vendor_remote_id on the Ramp vendor: 3. (Optional) Set a vendor code on the accounting vendor when your ERP expects a separate code distinct from the remote ID: See Data relationships for the full vendor / merchant / accounting-vendor data model. Tax code endpoints are in Beta. Endpoints may receive breaking changes (announced in the Changelog). Tax codes attach tax-rate selections to line items. Setup is strictly ordered — rates, then field, then options. After upload, a Tax Code field appears on transaction coding. Tax selections come back in line-item accounting_field_selections with "type": "TAX_CODE". Vendor credits are in Beta. Endpoints may receive breaking changes (announced in the Changelog). Vendor credits let users apply credit memos against bills. Enable per-connection — once on each connection you operate. Users create credits in the Ramp UI: Vendors → pick a vendor → New → Vendor Credit, then fill in the credit details. Fetch credits via GET /vendors/credits, scope to one vendor with GET /vendors/{vendor_id}/credits, or fetch a single credit with GET /vendors/credits/{credit_id}. Response shape: Objects become eligible for export via different paths — some automatic, some after a user marks them ready in the Ramp UI. Bills Approved (or created, depending on settings) and not yet synced Bill payments Bill is fully paid (status: PAID) Transfers, cashbacks Automatic Transactions, reimbursements User marks ready in Ramp UI Direct accounting connections are blocked by default API sync marking is intended for API-based accounting connections. Direct accounting connections cannot mark objects as synced via API. The sync loop is the same regardless of object type: fetch ready-to-sync objects, post them into the ERP, then mark them synced in Ramp. Fetch endpoints Transactions GET /transactions?sync_status=SYNC_READY Reimbursements GET /reimbursements?sync_status=SYNC_READY Transfers GET /transfers?sync_status=SYNC_READY Cashbacks GET /cashbacks?sync_status=SYNC_READY GET /bills?sync_ready=true Post results to POST /accounting/syncs with an idempotency_key, a sync_type (TRANSACTION_SYNC, BILL_SYNC, BILL_PAYMENT_SYNC, REIMBURSEMENT_SYNC, etc.), and either successful_syncs (with each id + your reference_id) or failed_syncs (with id + error.message). Example: transaction response shape. A GET /transactions?sync_status=SYNC_READY response carries everything you need to post into the ERP — accounting categories, line items, and field selections: Automatic Accounting Vendor creation For API-based connections, you can require your integration to create or map missing ERP vendors before a transaction is reported as synced. Enable this by setting transaction_accounting_vendor_creation_on_sync_enabled: true on the accounting connection settings. When this setting is enabled, transaction responses include requires_accounting_vendor_creation_to_sync: true if the transaction is ready to sync but does not have an Accounting Vendor selection. Treat that as a blocker for successful TRANSACTION_SYNC: Create the vendor in the customer's ERP using the transaction merchant details. Upload the ERP vendor to Ramp with POST /accounting/vendors. Code the transaction to that Accounting Vendor with POST /developer/v1/accounting/codings, using object_type: "TRANSACTION", the transaction ID as object_id, and an accounting_field_selections entry for the Accounting Vendor. Optional: re-fetch the transaction and confirm requires_accounting_vendor_creation_to_sync is no longer true. Mark the transaction as synced in Ramp using the POST /developer/v1/accounting/syncs endpoint. Uploading the Accounting Vendor alone does not attach it to the transaction. Ramp checks the transaction's Accounting Vendor coding before accepting a successful transaction sync. Mark the transaction synced once it lands in the ERP: Bills are two-phase. A bill carries a payment, and each phase syncs separately. sync_ready=true returns anything with outstanding export work; decide what to post using sync_status + the bill's status: true NOT_SYNCED OPEN BILL_SYNC only PAID BILL_SYNC, then BILL_PAYMENT_SYNC BILL_SYNCED BILL_PAYMENT_SYNC only sync_ready is a query filter, not a bill response field. A bill with sync_status=NOT_SYNCED can already be paid, so filtering only on sync_status will miss cases where both phases need to sync. To narrow to payment-only candidates, query GET /developer/v1/bills?sync_status=BILL_SYNCED&sync_ready=true. Errors. Use failed_syncs for anything the user needs to see. Categorize for clarity: User-actionable Title + how to fix "Accounting period closed. Reopen in NetSuite and retry." Transient Title + retry prompt "ERP unavailable. We'll retry shortly." Needs integrator Title + your support contact + reference ID "Unexpected sync error. Contact support@example.com, ref abc123." Failures surface in the Accounting tab as Export Errors: Polling vs. webhooks. Both work; pick based on latency requirements. Polling. Periodically hit the fetch endpoints above. Recommended cadence: every 1–4 hours on weekdays, every 12 hours on weekends. Webhooks. Subscribe to transactions.ready_to_sync, reimbursements.ready_to_sync, and bills.ready_to_sync for push-based sync within seconds. See Webhooks for subscription and signature verification. Block UI exports The Ramp UI's manual Export button marks objects as synced without notifying you. Train customers on API-based connections to never click it. Sync Button is in Alpha. Flow and endpoints may receive breaking changes (announced in the Changelog). Once your worker is fast enough to round-trip syncs in under 5 minutes, opt customers into the Sync Button so they can trigger syncs from Accounting → Transactions or Accounting → Reimbursements. When the customer clicks Sync All, Ramp fires a *.sync_requested webhook to your service, you fetch the requested rows, post them into the ERP, and call back into POST /accounting/syncs — the Ramp UI then renders live progress and a summary. The pattern is identical for transactions and reimbursements — only the event name, settings flag, fetch query, and sync type differ: Webhook event transactions.sync_requested reimbursements.sync_requested Settings flag transaction_sync_button_enabled reimbursement_sync_button_enabled Fetch query GET /transactions?requested_to_sync=true GET /reimbursements?requested_to_sync=true Sync type TRANSACTION_SYNC REIMBURSEMENT_SYNC Setup steps (per flow): Subscribe to the webhook event via POST /webhooks, then verify the challenge at POST /webhooks/{id}/verify. Enable the button on the connection by setting the flag in settings (via POST /accounting/connection for new connections or PATCH /accounting/connection/{id} for existing). Respond. On webhook receipt, grab sync_request_id from object, fetch the requested rows, post them into the ERP, then POST /accounting/syncs including sync_request_id in the body. You can make multiple /accounting/syncs calls for one sync_request_id; the UI updates live. 5-minute response window Anything not posted back within 5 minutes is auto-marked as failed. Don't enable the button until your worker can guarantee that. Migration tool For customers switching off a direct integration (QuickBooks, NetSuite, etc.). The flow creates an inactive connection, preloads the customer's chart of accounts against it, marks it ready, and the customer flips to it from the Ramp UI — preserving historical codings against the new provider on day one. Sync outstanding data. Mark every ready-to-sync object on the old connection (transactions, bills, reimbursements) as synced before cutover — anything left ready won't survive the switch. Document rules and automations. Export or note all accounting rules and automations against the old connection; they must be recreated after cutover. See the "Accounting rules and automation" article in the Ramp support center. Back up the chart of accounts. Fetch and store the customer's current GL accounts, custom fields, and vendors via the API before disconnecting — keep a copy in case rollback is needed. Migrating accounting connections drops historical chart-of-accounts codings Fetch and store the customer's existing GL accounts, custom fields, and vendors before initiating a migration. Multiple accounting connections cannot be active simultaneously. Set is_active: false. Save the returned id — every preload call below scopes to it via accounting_connection_id. Response — verify status: UNLINKED and connection_type: API before continuing: Mirror the customer's existing direct-integration chart of accounts against the inactive connection. The endpoints and body shapes match the main flow's step 2 — POST /accounting/accounts, /accounting/fields, /accounting/field-options, /accounting/vendors — except every body must include accounting_connection_id so writes land on the inactive connection rather than the customer's still-active direct integration. If the customer uses tax codes (step 4) or vendor credits (step 5), configure those against the inactive connection now — both flows accept accounting_connection_id the same way. Preconditions: The accounting_connection_id must refer to an inactive API-based connection. The customer must have a separate active accounting connection to migrate from. The inactive connection must not already be marked ready to migrate. The customer cannot already have another ERP migration in progress. The response returns the accounting connection with is_ready_to_migrate set to true, and the inactive connection becomes selectable in the customer's Ramp UI under Switch Providers. The customer navigates to Accounting → Settings → Danger Zone → Switch Providers, picks the new provider by the remote_provider_name you set above, and maps fields from the old connection onto the new one. Once the customer confirms, the inactive connection becomes the active accounting integration. Begin syncing per step 6. Webhooks: subscribe to *.ready_to_sync for push delivery; verify the challenge and signature per Webhooks. Retries: every POST /accounting/syncs carries an idempotency_key. Reuse it on retry — Ramp dedupes server-side. Rate limits: see Rate limits. Stagger chart-of-accounts uploads across customers if you onboard in bulk. Multi-entity reads: scope every list call with entity_id when a customer has subsidiaries. See Ramp support for multi-entity businesses. Monitoring: alert on backlog of sync_status=SYNC_READY over a threshold (sync worker stuck) and failed_syncs per minute (ERP integration broken). Encryption: all Ramp traffic is HTTPS; add payload-level encryption only if your customer contracts require it. Bill Payments — create and pay bills end-to-end; bills then sync through this pipeline. Procurement Intake — receive intake requests and return external approval decisions; downstream POs and bills sync through the same pipeline as transactions. Bill Pay — bills and bill-payment objects. Data relationships — how vendor identity flows between card transactions, bill-pay vendors, and ERP accounting vendors. Cards — transactions originate here. Spend Controls — funds, spend programs, and approvals that gate the spend before it lands in your GL. Reimbursements — out-of-pocket expense objects. Accounting Connection — understand and manage the current state of an account's accounting connection. Accounting Custom Fields — fields used to code transactions, reimbursements, and bills. Accounting GL Accounts — GL accounts used for coding transactions, reimbursements, bills, and purchase orders. Accounting Vendors — vendor options for coding transactions, reimbursements, bills, and purchase orders. Accounting Sync — mark objects as synced after successful addition to the remote accounting system. Accounting Tax — tax rates, codes, and code options. Entities — view business entities associated with a Ramp account. Transactions — fetch accounting codings and metadata from card transactions. Bills — fetch accounting codings and metadata from bills and payments. Reimbursements — fetch accounting codings and metadata from employee reimbursements. Cashbacks — fetch accounting codings and metadata from cashback earned via Ramp cards. Statements — fetch payments for Ramp card statements. Purchase Orders — fetch and create purchase orders. Vendors — manage Ramp vendors and their accounting-vendor links. Webhooks — subscribe to *.ready_to_sync events. Pagination — paginate list endpoints across multi-entity accounts. Rate limits — stagger bulk chart-of-accounts uploads. Deferred tasks — poll deferred sync tasks to completion. FAQ Yes. POs can be fetched and created via the API regardless of accounting connection type — they're a separate feature available to all users with API access. No. Only one connection can be active at a time; this is the known limitation that motivates the Migration tool flow. No. All historical objects are available via API. Yes. Payment details are nested within the bill object. Query bills with sync_ready=true, then use sync_status and the returned bill status together to decide whether to sync the bill, the payment, or both. Yes. In Ramp, users authorize your app with the necessary scopes. In the remote system, users often need to configure endpoints, set up API access, or install connectors to accept data from Ramp. Yes. All API traffic is HTTPS; data at rest is encrypted in Ramp systems. Add payload-level encryption only if customer contracts require it. No. Apps must run on your own infrastructure and integrate with Ramp via API. Submit a Developer API support ticket and our team will follow up. --- title: Errors source_url: /developer-api/v1/error-handling text_url: /llms-guides/error-handling.txt summary: The Ramp API returns detailed error information in the response body along with standard HTTP status codes. This allows you to quickly diagnose and address issues with your API requests. content: The Ramp API returns detailed error information in the response body along with standard HTTP status codes. This allows you to quickly diagnose and address issues with your API requests. Here is an example of an error response: The Ramp API ignores extra request parameters or body fields that are not defined in the endpoint specification. This means: Sending additional query parameters that aren't documented won't cause an error Including extra fields in the request body won't cause validation failures Your requests will succeed as long as all required fields are present and valid This behavior allows for forward compatibility but means you won't receive warnings about misspelled field names or deprecated parameters. We recommend validating your requests against the schema documentation during development. Inspect HTTP Status Codes: Use status codes to identify the category of the error (e.g., 4xx for client errors, 5xx for server errors). Inspect HTTP Status Codes: Use status codes to identify the category of the error (e.g., 4xx for client errors, 5xx for server errors). Utilize the error_v2 Field: Parse the error_code and additional_info to pinpoint the issue and provide actionable feedback in your application. Utilize the error_v2 Field: Parse the error_code and additional_info to pinpoint the issue and provide actionable feedback in your application. Log Errors: Log error responses, including the x-trace-id from the response headers, for easier debugging and communication with Ramp developer support. Log Errors: Log error responses, including the x-trace-id from the response headers, for easier debugging and communication with Ramp developer support. Implement Retry Logic: For transient errors (e.g., 429 Too Many Requests or 5xx), implement exponential backoff to retry requests. Implement Retry Logic: For transient errors (e.g., 429 Too Many Requests or 5xx), implement exponential backoff to retry requests. Provide User Feedback: Use the message field to display clear and concise error messages to users, when applicable. Provide User Feedback: Use the message field to display clear and concise error messages to users, when applicable. 400 Bad Request - Invalid request format 401 Unauthorized - Invalid or missing API token 403 Forbidden - Insufficient permissions 404 Not Found - Resource doesn't exist 422 Unprocessable Entity - Validation errors 429 Too Many Requests - Rate limit exceeded 500 Internal Server Error - Server-side issue 504 Gateway Timeout - Request exceeded the 60-second timeout --- title: Export To A Data Warehouse source_url: /developer-api/v1/export-to-a-data-warehouse text_url: /llms-guides/export-to-a-data-warehouse.txt summary: This Use case is being authored. It covers exporting Ramp transactions, receipts, and metadata into a customer-owned warehouse. content: This Use case is being authored. It covers exporting Ramp transactions, receipts, and metadata into a customer-owned warehouse. Tracked in ADP-2477. --- title: Quickstart source_url: /developer-api/v1/getting-started text_url: /llms-guides/getting-started.txt summary: This guide will help you make your first Ramp API call in just a few minutes. You'll create an access token and call the Transactions API to retrieve transaction data. content: This guide will help you make your first Ramp API call in just a few minutes. You'll create an access token and call the Transactions API to retrieve transaction data. This guide assumes you are a Ramp customer with admin access to your dashboard. Need a test environment for development? Request access to our Sandbox. Don't have a Ramp account yet? Sign up at ramp.com to provision an account, or request a sandbox to start building without one. Sandbox gives you test data and the same API surface as production. First, you'll need to create a developer app to get your API credentials. In your Ramp account, go to Company → Developer (you'll need admin access). Click Create New App. Name your app (e.g., "API Quickstart") and accept the Terms. Under Grant types, click Add new grant type → select Client Credentials. Under Scopes, click Configure allowed scopes and select transactions:read. Copy your Client ID and Client Secret. Store them securely – you'll need them in the next step. For more details on authorization, see the Authorization Guide. With your credentials, request an access token. Ramp authenticates this /developer/v1/token request with HTTP Basic Auth: base64-encode client_id:client_secret and send it in the Authorization header. The token authenticates your API requests. Replace {environment-url} with: https://demo-api.ramp.com for Sandbox https://api.ramp.com for Production API URLs are different from the Ramp app URLs The API base URL is not the same as the URL for the Ramp customer app. Make sure you're pointing your API calls at the API host, not the frontend host. Production https://api.ramp.com https://app.ramp.com Sandbox (demo) https://demo-api.ramp.com https://demo.ramp.com Response: Copy the access_token – you'll use it to make API calls. Tokens expire after 10 days. With your access token, you can now call the Ramp API. Let's retrieve your transactions using the GET /transactions endpoint. Add the header Authorization: Bearer and make a GET request to {environment-url}/developer/v1/transactions. --- title: Welcome source_url: /developer-api/v1/introduction text_url: /llms-guides/introduction.txt summary: Use Ramp at your company, or build for others. content: Use Ramp at your company, or build for others. Use cases End-to-end build journeys that span multiple Ramp products. Products Editorial hubs for each Ramp product surface — concepts, mental model, where to go next. Conventions API rules and cross-cutting patterns. Reference while building. Canonical OpenAPI schema for the Developer API: /openapi/developer-api.json. --- title: MCP source_url: /developer-api/v1/mcp text_url: /llms-guides/mcp.txt summary: The Model Context Protocol (MCP) lets AI assistants talk to your systems directly—no copy-paste, no context switching. Ramp ships three MCP servers, each scoped to a different audience. content: The Model Context Protocol (MCP) lets AI assistants talk to your systems directly—no copy-paste, no context switching. Ramp ships three MCP servers, each scoped to a different audience. The three Ramp MCP servers What you can build with MCP --- title: Monetary Values source_url: /developer-api/v1/monetary-values text_url: /llms-guides/monetary-values.txt summary: In the Ramp API, monetary values are represented by the currency_code and amount. All currency_code values are three-letter acronyms as defined in ISO 4217 (e.g., USD for US Dollars). There are two representations of the amount: content: In the Ramp API, monetary values are represented by the currency_code and amount. All currency_code values are three-letter acronyms as defined in ISO 4217 (e.g., USD for US Dollars). There are two representations of the amount: Canonical representation (Preferred) Ramp's preferred method for representing monetary values is canonical representation, which uses the CurrencyAmount type to group amount and currency_code together. The amount is represented as an integer in the smallest denomination to avoid precision loss. For example: USD: $40 is represented as 4000 (since 1 USD = 100 cents) JPY: ¥5000 is represented as 5000 (since 1 JPY = 1 yen) To calculate the correct amount for different currencies, the canonical representation multiplies the amount by 10 raised to the power of D, where D is the number of decimal places for the currency. You can find the D value for any currency in the ISO 4217 Wikipedia page. USD, EUR, GBP, etc.: D = 2 (i.e., multiply the amount by 100 for cents) JPY: D = 0 (i.e., no decimal places) Formula: For example, for USD: USD 4000 ($40.00) 2 EUR 10000 (€100.00) JPY 5000 (¥5000) 0 GBP 2500 (£25.00) Below is the schema definition of CurrencyAmount type: The legacy representation is an older way of representing amounts. Although this method is still supported for backward compatibility, it is deprecated and will be replaced in future releases. You should migrate to the canonical representation for new development. Date and DateTime are represented using a string that conforms to ISO8601; UTC is assumed if no timezone offset is specified. For example, --- title: Pagination source_url: /developer-api/v1/pagination text_url: /llms-guides/pagination.txt summary: Pagination allows you to retrieve an entire dataset with a series of requests, where each request fetches a portion of the data set. By loading data in smaller chunks, pagination reduces the amount of data transmitted per response and alleviates the load on the servers, ensuring faster loading times and a smoother user experience. content: Pagination allows you to retrieve an entire dataset with a series of requests, where each request fetches a portion of the data set. By loading data in smaller chunks, pagination reduces the amount of data transmitted per response and alleviates the load on the servers, ensuring faster loading times and a smoother user experience. Ramp API uses a mechanism called keyset pagination to divide data into fixed-size pages. Keyset pagination relies on the use of one or more columns with unique, ordered values in the database table. These columns are typically indexed for fast retrieval. How keyset pagination works Here's how keyset pagination works step-by-step: To start, initiate a request for the first page of results. The API response will include a next field, which contains the complete URL for accessing the next page of data. Utilize the URL provided in the next field to send a subsequent request for the next page of results. To construct the query for fetching this subsequent set of records, the client incorporates the start query parameter as a cursor. Repeat the process of requesting subsequent pages using the next URL and updating the start cursor parameter until the API returns a null value for the next field. This indicates that all records have been successfully fetched. --- title: Procurement source_url: /developer-api/v1/procurement text_url: /llms-guides/procurement.txt summary: Bring procurement requests, approvals, and purchase orders into your stack — so the system that already drives intake or approvals stays the source of truth. content: Bring procurement requests, approvals, and purchase orders into your stack — so the system that already drives intake or approvals stays the source of truth. Ramp Procurement is the path from "an employee needs to buy something" to an approved purchase order. Three concepts cover it: Intake. A request — typically a custom form attached to a spend program — that captures what's being bought, the amount, the vendor, and any policy answers. Approvals. The review path the request travels. Reviews can be Ramp-native or routed to an external system via Blank Canvas approvals — see Spend Controls for the approvals surface across Bill Pay, Reimbursements, and Procurement. Purchase orders. The artifact created once the request is approved and ready to be paid. Each piece has an integration surface. You can receive intake requests as webhooks, participate in approvals from your own tool, and read purchase orders after approval. AI Agents — agents can approve or reject unified requests (POs, fund requests) via MCP. Bill Payments — pay against an approved purchase order downstream. Procurement Intake — receive intake requests, return external approval decisions, and sync downstream PO data. Bill Pay — the payment side of an approved PO, and the home of the bill-pay Vendor an intake request resolves against. Spend Controls — funds, spend programs, and the approval workflows that gate intake requests. Unified Requests — read intake and contract requests. Custom Forms — read submitted intake answers. Spend Programs — inspect program configuration and Blank Canvas workflow nodes. Blank Canvas Approvals — upload documents, store metadata, approve or reject workflow steps. Purchase Orders — list and read POs after approval. Spend Requests — sync comments to discussion threads. Webhooks — subscribe to unified_requests.external_approval_request and related events. Authorization — scopes required for Blank Canvas approvals. --- title: Procurement Intake source_url: /developer-api/v1/procurement-intake text_url: /llms-guides/procurement-intake.txt summary: Route Ramp intake requests through your own procurement or contract management system — receive each request via webhook, run your review, and send the approval decision back through Blank Canvas. content: Route Ramp intake requests through your own procurement or contract management system — receive each request via webhook, run your review, and send the approval decision back through Blank Canvas. An integration that makes your system the source of truth for procurement reviews while Ramp continues to drive the intake form, downstream PO, and bill. By the end you'll have: A webhook subscription that fires whenever a Ramp intake request needs an external review. A handler that loads request context — the request itself, the submitted form, the spend program, and your Blank Canvas workflow node. A path to send approve and reject decisions back to Ramp. Optional: comment mirroring back to Ramp's discussion thread and downstream PO reads. Estimated time: 2–4 hours for a working integration. Prerequisite knowledge: OAuth on Ramp, basic webhook handling, the Procurement and Spend Controls mental models. Required scopes: unified_requests:read, custom_forms:read, blank_canvas:write, spend_programs:read. Optional scopes: spend_requests:read — subscribe to spend_requests.comment_created. spend_requests:write — send reviewer comments back to Ramp. purchase_orders:read — read downstream purchase order data after approval. Requires Ramp Plus. spend_requests:read — subscribe to spend_requests.comment_created. spend_requests:write — send reviewer comments back to Ramp. purchase_orders:read — read downstream purchase order data after approval. Requires Ramp Plus. Recommended: Read Procurement for the intake, approvals, and PO mental model and Spend Controls for how Blank Canvas routes approvals. Service key: Ramp shares a service_key during implementation. It identifies your integration's Blank Canvas workflow node. A request submitted in Ramp triggers your integration, which loads context, runs its review, and pushes the decision back through Blank Canvas. Comments and downstream PO reads are optional later steps. If a request is reset upstream (re-routed for additional review), Ramp fires unified_requests.external_approval_request_reset. Reset your external review task and wait for the next approval request before sending a new decision. Implementation Create a webhook subscription for the events that drive the integration. The first two trigger and reset your external review; the comment event is optional and only needed if you want to mirror Ramp discussion updates back into your tool. unified_requests.external_approval_request — a Ramp request needs an external approval decision. unified_requests.external_approval_request_reset — a previously-issued external approval request was reset. spend_requests.comment_created — a comment was added to the request discussion thread. For webhook setup and signature verification, see the Webhooks guide. When you receive unified_requests.external_approval_request, load the request context in this order: GET /developer/v1/unified-requests/{unified_request_id} Read the intake or contract request. /developer/v1/custom-form/collections/responses/{custom_form_collection_response_id} Read the submitted intake answers. /developer/v1/spend-programs/{spend_program_id} Inspect the spend program configuration. /developer/v1/spend-programs/{spend_program_id}/workflow-nodes Fetch your integration's Blank Canvas workflow node by service_key. The webhook payload carries unified_request_id, custom_form_collection_response_id, and spend_program_id. Pass your service_key to the workflow-nodes call to retrieve the approval_trigger_instance_id your integration must act on: Verify: the workflow-nodes response includes an approval_trigger_instance_id that matches the one in the webhook payload. Use the Blank Canvas approval endpoints to upload supporting documents, store your integration's metadata, and approve or reject the workflow step. POST /developer/v1/blank-canvas-approvals/documents Upload supporting files associated with the review. PATCH /developer/v1/blank-canvas-approvals/{approval_trigger_instance_id}/metadata Store integration-specific metadata against the workflow step. /developer/v1/blank-canvas-approvals/{approval_trigger_instance_id} Approve or reject the workflow step. Shape callout — the decision call: Verify: the request status in Ramp moves past the external review step. If you receive unified_requests.external_approval_request_reset for an approval you've already acted on, the workflow has been re-routed upstream. Reset your external review task — clear or close it on your side — and wait for the next unified_requests.external_approval_request event before sending a new decision. If reviewers leave comments in your tool that should appear in Ramp's discussion thread, post them back via POST /developer/v1/comments/spend-requests/{spend_request_id} with object_type=spend-requests. To mirror Ramp discussion updates into your system, use GET /developer/v1/comments/spend-requests/{spend_request_id}. These endpoints require the matching spend_requests:read or spend_requests:write scope and procurement access. If your integration also needs downstream PO data after approval, read it via the Purchase Orders endpoints. These endpoints require purchase_orders:read and Ramp Plus. /developer/v1/comments/spend-requests/{spend_request_id} List comments on a spend request's discussion thread. Post a reviewer comment to Ramp's discussion thread. /developer/v1/purchase-orders List purchase orders. /developer/v1/purchase-orders/{purchase_order_id} Read a single purchase order. Webhook signature verification. Verify the signature on every event. See Webhooks. Idempotent decision submission. A reset event can re-fire external_approval_request after you've already approved. Treat each approval_trigger_instance_id as the unit of work; only post a decision for the latest one. Scope what you actually use. spend_requests:write and purchase_orders:read require Ramp Plus — only request them if your integration calls those endpoints. Confirm your service_key. Ramp provisions the service key during implementation. The wrong key returns an empty workflow-nodes response, which is silent unless you check. AI Agents — when the requester is an agent rather than an employee, intake still routes through the same approval path. Spend programs — spend programs back the intake form templates routed through this Use case. Procurement — the Product hub for intake, approvals, and POs. Spend Controls — Blank Canvas approvals live here. Bill Pay — the downstream of an approved PO. Bill Pay Vendors — the bill-pay Vendor an intake resolves against. Unified Requests — read intake and contract requests. Custom Forms — read submitted intake answers. Spend Programs — inspect program configuration and Blank Canvas workflow nodes. Blank Canvas Approvals — upload documents, store metadata, approve or reject. Comments — list and post discussion-thread comments on a spend request (object_type=spend-requests). Purchase Orders — list and read POs after approval. Webhooks — subscribe to unified_requests.external_approval_request and related events. Authorization — scopes required for Blank Canvas approvals. --- title: Ramp Data MCP source_url: /developer-api/v1/ramp-data-mcp text_url: /llms-guides/ramp-data-mcp.txt summary: The Ramp Data MCP server exposes Ramp's public datasets — Ramp Rate software benchmarks and AI Index business AI adoption metrics — to MCP-compatible clients. No Ramp account or API key required. content: The Ramp Data MCP server exposes Ramp's public datasets — Ramp Rate software benchmarks and AI Index business AI adoption metrics — to MCP-compatible clients. No Ramp account or API key required. Server URL: https://mcp.ramp.com/ramp-data/mcp One MCP connection queries both datasets — the tools live on the same server. For the per-dataset tool list, see AI Index → Available AI Index tools and Ramp Rate → Available Ramp Rate tools. Connect a client Add the Ramp Data MCP server to your Claude Code session: Run /mcp in your session to verify the connection. Cursor desktop app required The Cursor desktop app must be installed for this one-click link to work. Or add manually to ~/.cursor/mcp.json: Add the following to your Claude Desktop config file: macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json For any MCP-compatible client, use the server URL: https://mcp.ramp.com/ramp-data/mcp The server exposes tools for both datasets on one connection. Ramp Rate tools — list categories, fetch category summaries, rank vendors within a category, resolve a vendor name to a slug, get a vendor's full profile, compare 2–10 vendors. Full list: Ramp Rate → Available Ramp Rate tools. AI Index tools — adoption history overall, by sector, by company size (each supports months from 1 to 120). Full list: AI Index → Available AI Index tools. Ramp Rate — public software-adoption benchmarks for category and vendor research. AI Index — business AI adoption metrics. Ramp MCP — Ramp's account-scoped MCP server (separate from this one). Developer MCP — real-time API docs and implementation guidance for coding agents. --- title: Ramp MCP source_url: /developer-api/v1/ramp-mcp text_url: /llms-guides/ramp-mcp.txt summary: Ramp MCP is subject to change. Feedback and questions can be submitted via a Developer API support ticket. content: Ramp MCP is subject to change. Feedback and questions can be submitted via a Developer API support ticket. Ramp MCP allows you to securely connect Ramp with AI assistants like ChatGPT and Claude, so you can query Ramp data and take actions with natural language. Admins can analyze data to identify spend trends and forecasting insights, while employees can check balances, request reimbursements, or get policy answers directly from their daily tools. Tools are grouped here by what the user is trying to accomplish, not by tool name — the underlying surface evolves continuously. Disconnect and reconnect your client to pick up new tools. For the full breakdown including agent purchases and channel-specific guidance, see AI Agents. Read and analyze spend — search transactions, pull spend exports, query vendors and accounting categories, load departments and entities, get treasury balances and the org chart. Process approvals — approve or reject transactions, reimbursements, and unified requests (POs, fund requests). Bill approvals are not yet available via MCP. Edit, submit, and act on workflows — edit transactions (memo, coding, trip), submit reimbursements, post comments, manage cards (lock, unlock, activate), apply GL coding. Answer questions — policy Q&A, Help Center search, decline explanations. Make purchases (alpha) — generate Agent Card credentials. Requires approved Agent Cards access. See AI Agents → Agent Cards for the flow and limits. Manage trips — create trips, view trips, connect transactions to trips, retrieve flight and hotel bookings. Most company-wide data tools (spend exports, vendor management, GL coding) require admin or business-owner permissions. Employees see only their own data; admins see company-wide data. Getting started A Ramp production or sandbox account Access to your chosen AI platform (Claude, ChatGPT, etc.) Using demo data Replace https://mcp.ramp.com/mcp with https://demo-mcp.ramp.com/mcp in any config below to use sample data instead of live Ramp data. Add the Ramp MCP server to your Claude Code session: Run /mcp in your session to verify the connection. Cursor desktop app required The Cursor desktop app must be installed for this one-click link to work. Or add manually to ~/.cursor/mcp.json: Add the following to your Claude Desktop config file: macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Add the following to your VS Code MCP settings: For any MCP-compatible client, use the server URL to configure a connection: Production: https://mcp.ramp.com/mcp Demo: https://demo-mcp.ramp.com/mcp Check your tool's MCP documentation for configuration format. After setup, try a prompt to confirm everything is working: "What Ramp cards do I have?" "Show me my recent transactions" In Claude Code, run /mcp to check that the Ramp server appears in your connected servers list. Off-the-shelf clients (Claude, ChatGPT, Cursor, Claude Code, etc.) work out of the box. Custom MCP clients — and third-party gateways like Glean, MintMCP, or GoSearch — must have their redirect URI allowlisted by Ramp first. Use https:// or localhost/127.0.0.1 only. Exact host required — wildcard subdomains aren't supported. Submit a Developer API support ticket with your client name and redirect URI. Tech partners building a product that connects customers' Ramp accounts apply through the Partner Integrations launch checklist. Microsoft Copilot for 365 Microsoft Copilot for 365 doesn't natively support remote MCP servers. Integrate via Copilot Studio's MCP server integration, or use the Developer API directly through Power Automate. Admins can control which employees have access to Ramp MCP through Integrations: Navigate to Company → Integrations → Ramp MCP in your Ramp dashboard Select 'Manage Access' Set restrictions based on roles, departments, or specific users This provides fine-grained control over who can use AI copilots to access Ramp data and functionality. Employee Tools: Available to all Ramp users, but respect individual user permissions (e.g., users will only see funds and cards available to their account) Admin Tools: Only available to users with admin or business owner permissions Troubleshooting Authentication fails or connection drops: Claude Code: Run /mcp, select Ramp, and choose "Clear authentication" Cursor / Claude Desktop: Remove and re-add the server in your config, then restart the app ChatGPT: Disconnect and reconnect the Ramp app in Settings → Apps Clear cached MCP auth: rm -rf ~/.mcp-auth (if applicable) Ensure you're logged into the correct Ramp account "ETL operation limit reached": Wait for current data operations to complete Ask the AI to clear unused tables to free up resources "Query returned more than 100 rows": The AI will automatically add more specific filters and retry All questions and feedback about Ramp MCP can be submitted via a Developer API support ticket --- title: Ramp Rate source_url: /developer-api/v1/ramp-rate text_url: /llms-guides/ramp-rate.txt summary: Ramp Rate is subject to change. Feedback and questions can be submitted via a Developer API support ticket. content: Ramp Rate is subject to change. Feedback and questions can be submitted via a Developer API support ticket. Ramp Rate gives developers and AI agents a public view into software adoption across Ramp's network. Use it to explore software categories, compare vendors, and add market context to research, prompts, and product experiences. The REST API is public, so you do not need a Ramp account or API key to use it. Ramp Rate surfaces vendor adoption and usage trends based on anonymized, aggregated business spend on Ramp. The dataset is measured over a trailing 12-month window anchored to the latest complete month. For the broader methodology and vendor benchmarks, see Ramp Vendors. Metric definitions Adoption Rate measures the share of businesses that purchased from a vendor, out of all businesses that made purchases in that software category over the past 12 months. It reflects a vendor's market penetration within its category, helping distinguish established leaders from emerging challengers serving the same use case. Growth Rate measures the period-over-period delta in a vendor's Adoption Rate. It captures how quickly a vendor's market share is accelerating, including momentum from new customers, expanding usage within existing customers, or broader market presence. New Adopter Rate measures the percentage of companies that adopted a vendor for the first time over the past 12 months. This helps identify which vendors are most effective at attracting net-new users entering the category. Switch Rate tracks the percentage of companies that moved from one vendor to another within the category over the past 12 months. It shows which vendors are winning competitive evaluations and gaining customers from alternatives. REST API Use the REST API when you want direct HTTP access to Ramp Rate data from your application, notebook, script, or workflow. Base URL: https://api.ramp.com/v1/public/ramp-rate GET /categories List all Ramp Rate software categories. GET /categories/{category}/summary Get adoption stats for a single category. GET /categories/{category}/vendors Get a ranked vendor leaderboard within a category. GET /vendors/resolve?vendor_name={name} Resolve a vendor name to its canonical vendor_slug. GET /vendors/{vendor_slug}/profile Get a vendor's Ramp Rate profile across all of its categories. GET /vendors/compare?vendor_slugs={slug1}&vendor_slugs={slug2} Compare adoption metrics across 2-10 vendors. GET /categories/{category}/vendors supports these query parameters: limit integer 50 Maximum number of vendors to return. Must be between 1 and 200. fte_segment string none Filter by company size segment. min_share_of_spend number Filter out vendors below a spend share threshold. Category summaries include adoption rate, YoY change, MoM change, growth rank, vendor count, and FTE segment breakdowns. Vendor leaderboards include adoption rates, spend share, growth metrics, and competitive rankings. competitor_switch_rate is the share of within-category switchers who chose that vendor. It is a switcher win rate, not a retention or churn metric. MCP Ramp Rate is queryable conversationally via Ramp Data MCP — Ramp's public-data MCP server. One connection queries both Ramp Rate and AI Index; setup matrix and client configs live on that page. ramp_rate_list_categories List all software categories. Call this first to discover valid category names. ramp_rate_get_category_summary Get adoption stats for a category, including adoption rate, YoY change, MoM change, growth rank, vendor count, and FTE segment breakdowns. ramp_rate_get_category_vendors Get a ranked vendor leaderboard within a category, with optional limit, fte_segment, and min_share_of_spend filters. competitor_switch_rate is a switcher win rate, not a retention or churn metric. ramp_rate_resolve_vendor Resolve a human-readable vendor name like Slack to its canonical vendor_slug and list its categories. ramp_rate_get_vendor_profile Get a vendor's full Ramp Rate profile across all categories. ramp_rate_compare_vendors Compare adoption metrics side by side for 2-10 vendors. The same MCP server also exposes AI Index tools — see AI Index → Available AI Index tools. AI Index — business AI adoption metrics. Shares the same MCP server. GET /v1/public/ramp-rate/categories — list software categories. GET /v1/public/ramp-rate/categories/{category}/summary — category-level adoption stats. GET /v1/public/ramp-rate/categories/{category}/vendors — ranked vendor leaderboard within a category. GET /v1/public/ramp-rate/vendors/resolve — resolve a vendor name to a canonical slug. GET /v1/public/ramp-rate/vendors/{vendor_slug}/profile — full vendor profile across categories. GET /v1/public/ramp-rate/vendors/compare — compare 2–10 vendors head-to-head. --- title: Rate Limits and Timeouts source_url: /developer-api/v1/rate-limiting text_url: /llms-guides/rate-limiting.txt summary: API requests that take longer than 60 seconds will be terminated and return a 504 Gateway Timeout response. Most API requests complete well within this limit, but if you're working with large datasets or complex queries: content: API requests that take longer than 60 seconds will be terminated and return a 504 Gateway Timeout response. Most API requests complete well within this limit, but if you're working with large datasets or complex queries: Use pagination to break large requests into smaller chunks. Implement retry logic with exponential backoff for any 504 responses. To ensure reliable and equitable access to our API, we enforce rate limiting. By default, API requests are limited as follows, applied per source IP address: Limit: 200 requests per 10-second rolling window. Reset Mechanism: The window operates on a rolling basis, meaning every new request resets the 10-second timer for that particular request. When the rate limit is exceeded, the API responds with a 429 Too Many Requests status code. This indicates that further requests should be paused until the limit resets. Implement backoff strategies: When receiving a 429 Too Many Requests response: Implement exponential backoff (e.g., 1s, 2s, 4s) before retrying. Avoid immediate retries, as this could worsen delays. Implement exponential backoff (e.g., 1s, 2s, 4s) before retrying. Avoid immediate retries, as this could worsen delays. Optimize API calls: Consolidate requests wherever possible, such as using batch endpoints or minimizing redundant calls. If you make 200 requests at 10:00:00, the limit will be reached, and subsequent requests will return a 429 response. If no further requests are made, the limit will reset by 10:00:10. However, if you continue making requests during the window, the rolling timer will extend accordingly. If your application requires a higher limit, you can request an increase. To do so: Analyze and document your expected API usage. Submit a Developer API support ticket with your account details and usage requirements. Providing clear information about your use case and anticipated volume will help expedite the review process. Syncing data Pagination is the mechanism for moving through a result set, but building a reliable sync pipeline also requires knowing which records to fetch and how often. This section covers how to do an initial bulk pull and keep your local data up to date efficiently. The first time you sync a dataset, you will need to paginate through all records without any date filter. Expect this to be slow for large datasets — a business with years of transaction history may require hundreds of requests. Recommendation: persist the data locally (in a database or cache) rather than fetching it on every app load. Once you have a local copy, you only need to fetch new or changed records on subsequent syncs. After the initial seed, store a high-water mark (the timestamp of your last successful sync) and pass it to the appropriate date-filter parameter on subsequent requests. This avoids re-fetching records you already have. Different endpoints expose different filtering capabilities: GET /transactions synced_after Yes Best delta sync support. Filters by sync time, not transaction time, so status changes and late-posted transactions are included automatically. GET /bills from_created_at New records only No updated-at filter. Periodic full re-pulls are needed to catch status changes such as payments and approvals. GET /purchase-orders Same as bills. Re-pulls are needed to pick up status updates. Weekdays Every 1–4 hours Weekends Every 12 hours Adjust based on how time-sensitive your integration is. Real-time use cases should consider webhooks instead of polling. With the default limit of 200 requests per 10-second window and a page size of 100 items, you can pull approximately 12,000 records per minute. For most integrations this is more than sufficient for incremental syncs, and even large initial seed pulls will complete within a few minutes. --- title: Reimbursements source_url: /developer-api/v1/reimbursements text_url: /llms-guides/reimbursements.txt summary: Pay employees back for out-of-pocket expenses — manual submissions, OCR'd receipts, and mileage — gated by funds, routed through approvals, and synced to your ERP. content: Pay employees back for out-of-pocket expenses — manual submissions, OCR'd receipts, and mileage — gated by funds, routed through approvals, and synced to your ERP. A reimbursement is an expense an employee paid out of pocket that the business pays back. Submissions enter Ramp from the app, from a receipt upload (Ramp OCRs a draft), or from a mileage post. Each one walks two parallel state machines. State — DRAFT → PENDING (review) → APPROVED → REIMBURSED. Edge cases: REJECTED, CANCELED, FAILED_REIMBURSEMENT, plus payment-specific states (AWAITING_PAYMENT, PROCESSING, REIMBURSED_VIA_PUSH). Sync status — NOT_SYNC_READY → SYNC_READY → SYNCED. The same accounting pipeline used by transactions and bills. Drives the ERP export. Direction — BUSINESS_TO_USER is the default (Ramp pays the employee). USER_TO_BUSINESS flows the other way and covers amounts an employee owes the business back. Policy — funds gate which categories and amounts are reimbursable when no card is in play. Approvals route submissions to the right reviewer, Ramp-native or via Blank Canvas. Both live in Spend Controls. AI Agents — agents can submit reimbursements, approve/reject them, and answer policy questions through MCP. ERP Integrations — sync reimbursements via the shared sync_status pipeline. Add the Sync Button once round-trips are fast enough. Spend Controls — funds gate reimbursable categories and amounts; approvals route submissions through review. Bill Pay — pay vendors directly when the spend belongs to a vendor invoice, not an employee out-of-pocket. Cards — issue a card backed by a fund to pre-fund spend rather than reimbursing after the fact. Reimbursements — list and fetch reimbursements with state, approval state, and sync status. Create mileage reimbursements (POST /reimbursements/mileage) and upload receipts (POST /reimbursements/submit-receipt, which drafts via OCR when no reimbursement_id is supplied). Webhooks — subscribe to reimbursements.ready_to_sync and reimbursements.sync_requested for the ERP pipeline. Authorization — reimbursements:read / reimbursements:write scopes. --- title: Sandbox source_url: /developer-api/v1/sandbox text_url: /llms-guides/sandbox.txt summary: The Ramp sandbox is a testing environment where developers and partners can safely build, test, and experiment with Ramp's API without affecting live production data. content: The Ramp sandbox is a testing environment where developers and partners can safely build, test, and experiment with Ramp's API without affecting live production data. Key features: Safe testing environment: Test integrations and applications before deploying to production API development: Access Ramp's Developer API for building custom integrations No real money movement: Demo accounts cannot process actual financial transactions How to get sandbox access Developers/Partners: Submit a request through the Ramp technology partnerships page to receive both sandbox and developer console access Existing customers: Request a sales sandbox through your Account Manager Ramp frontend https://demo.ramp.com Access the Ramp user interface for testing API https://demo-api.ramp.com Base URL for API calls in the Sandbox environment Test demo actions While building with the dev API, we support simulation actions to support testing within the Ramp sandbox environment. You can simulate user events through the demo actions panel. You can open the demo actions panel directly within the Ramp sandbox with ⌘ J. To mark a bill as paid, navigate to Bill Pay via the UX, then open the bill you want to mark as paid. Press ⌘ J to open the demo actions panel and select 'pay current bill'. Note: This demo action depends on your Bill Pay payment release setting. When enabled, it only works for bills that are approved and scheduled. When disabled, it works for all bills. For more information, see Bill Pay payment release documentation. To mark a reimbursement as paid, navigate to the reimbursements tab and select "needs review" to find pending reimbursements. Open the reimbursement you want to mark as paid, then press ⌘ J to open the demo actions panel and select "Mark reimbursement as paid". To create a transaction, you can do this from any page within the sandbox environment. Press ⌘ J to open the demo actions panel and click on "add transactions". Each demo action requires specific permissions to work properly: Admin or Business Owner role, or the AP Clerk permission Mark reimbursement as approved The direct manager of the employee who submitted the reimbursement (or a manager in their reporting chain), Admin, or Bookkeeper role Employee role or higher (Manager, Admin, or Bookkeeper). The Employee role allows users to request spend, receive cards, make purchases, and submit reimbursements. View-only Admins and Guests cannot create transactions. --- title: Spend Controls source_url: /developer-api/v1/spend-controls text_url: /llms-guides/spend-controls.txt summary: The policy layer behind every dollar spent on Ramp — budgets, templates, and approval workflows that apply equally to cards, reimbursements, bills, and agent purchases. content: The policy layer behind every dollar spent on Ramp — budgets, templates, and approval workflows that apply equally to cards, reimbursements, bills, and agent purchases. Three primitives compose every spend control on Ramp. They're independent objects with their own APIs, but they're designed to plug into each other. Funds. A budget with restrictions — amount, interval (daily, monthly, total), allowed merchant categories, allowed merchants, allowed countries. A fund issues a virtual card automatically and can be attached to physical cards. Funds also gate reimbursements when no card is in play. Funds are created via the Limits API — "limit" is the API name; "fund" is the brand and what they're called in the product. Spend programs. Templates that mass-produce funds with consistent policy. Use one when the same shape of budget recurs — quarterly offsites, per-employee SaaS allowances, contractor stipends, monthly travel funds. Mint a fund from a program and the policy comes along for free. Approvals. The review path a spend action travels before it's allowed. Approvals route bills, reimbursements, purchase orders, and fund-creation requests through configured policy. Reviews can stay Ramp-native or hop to your own system via Blank Canvas approvals. A spend control is rarely a single primitive — it's a composition. A typical "team travel budget" is a spend program template producing funds, with optional approvals for amounts above a threshold. A "vendor SaaS allowance" is a single fund with no template. A "$50K capex approval" is an approvals workflow with no budget object yet. Spend controls cut across every Product that puts money in motion. Cards Funds define the budget every virtual card draws against. Multiple cards can share the same fund; a primary physical card can draw from multiple active, linkable funds through automatic routing (when primary card spending is enabled). Spend programs stamp out consistent policy for groups. Reimbursements Funds gate reimbursable spend by category and amount. Approvals route submissions to the right reviewer. Bill Pay Approvals route bills through configured policy before payment. Reviewers can sign off in Ramp or in your system via Blank Canvas. Procurement Approvals gate intake requests. Spend programs back the request templates that capture what's being bought. AI Agents Funds constrain what an agent can spend, per merchant and per amount. Approvals can route agent purchases above a threshold to a human. Spend programs — compose funds, programs, transactions, and webhooks to manage a recurring budget end-to-end. Virtual cards — issue cards backed by funds, expose them to your servers (Vault) or to the user's browser (iframe). AI Agents — constrain agent spend with funds and route high-value purchases through approvals. Procurement Intake — receive intake requests, return external approval decisions via Blank Canvas, and sync downstream PO data. Bill Payments — create approved bills via API and pay vendors. Approvals gate bills before payment. Cards — every card draws against a fund. Reimbursements — gated by funds, routed through approvals. Bill Pay — bills route through approvals before payment. Procurement — intake requests gated by approvals; spend programs back the request templates. Limits — funds. Create, update, suspend, terminate. Virtual cards are issued here. Spend Programs — templates that drive consistent fund creation and back configured approval workflows. Blank Canvas Approvals — participate in approvals from your own system. Upload documents, store metadata, approve or reject. Spend Requests — sync reviewer comments back to Ramp. Webhooks — subscribe to unified_requests.external_approval_request and transactions.cleared for spend-control events. Deferred tasks — polling pattern used by fund creation. Authorization — limits:read / limits:write, spend_programs:read / spend_programs:write, blank_canvas:write scopes. --- title: Spend Programs source_url: /developer-api/v1/spend-programs text_url: /llms-guides/spend-programs.txt 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. Funds are created via Ramp's Limits API — "limit" is the API name, "fund" is the brand. They're the same object. Required: A Ramp account with API access. An OAuth token with spend_programs:write, limits:write, limits: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 Limits API; field names use limit_id and spend_limit_id. Transactions — settled spend against the fund, retrievable filtered by limit_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, an initial user_id, and an idempotency_key. Fund creation is asynchronous — you'll get back a task_id. Poll GET /developer/v1/limits/deferred/status/{task_id} every 1–2 seconds until status is SUCCESS. The terminal response contains the spend_limit_id — that's the fund's ID. See Deferred tasks for the polling pattern. Verify: GET /developer/v1/limits/$LIMIT_ID returns the fund with the inherited policy and the auto-issued virtual 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/limits/{limit_id}/remove-users 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. Idempotency on fund creation. Always pass idempotency_key when minting funds — duplicate task submissions otherwise create duplicate funds. Ramp rejects duplicate keys with 400 DEVELOPER_7005; generate a fresh key per attempt. 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. Polling fallback for deferred tasks. Network blips can drop webhook deliveries. Poll deferred-task status with a backoff (1s → 2s → 5s, max 30s) until SUCCESS or ERROR. 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. AI Agents — spend programs and funds constrain what an AI agent can spend per merchant and per amount. Virtual cards — every fund issues a virtual card; this Use case covers Vault and iframe exposure patterns. Procurement Intake — 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. Limits — mint funds, add/remove users, suspend, terminate. Transactions — read settled spend, filtered by limit_id. Webhooks — subscribe to transactions.cleared for real-time spend, refunds, and reversals. Deferred tasks — polling pattern used by fund creation and termination. Authorization — spend_programs:write, limits:write, limits: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. --- title: User lifecycle source_url: /developer-api/v1/user-lifecycle text_url: /llms-guides/user-lifecycle.txt summary: Onboard, update, deactivate, reactivate, and stage draft users through the Users API. Three scenarios cover the common provisioning paths between Ramp and your HRIS or IdP. content: Onboard, update, deactivate, reactivate, and stage draft users through the Users API. Three scenarios cover the common provisioning paths between Ramp and your HRIS or IdP. End-to-end user provisioning between your HRIS, IdP, or onboarding tool and Ramp. Three common paths: Onboard, update, and deprovision a user — invite a new hire on day one, sync profile changes, and deactivate on offboarding. Deactivate and reactivate a user — pause and resume access without losing the user record. Stage a draft user and schedule their invite for later — pre-create a user today and have Ramp send the invite on a specific date. For the user concept itself — status model, identity, async creation — see Users. Full endpoint schemas live in the Users API reference. Works on users from any source Users created outside the Developer API — via HRIS or SCIM sync, a manual invite from the Ramp app, etc. — can still be deactivated, scheduled for deactivation, and reactivated through these endpoints. GET /developer/v1/users/{user_id} (or the list endpoint) to see their current state, then apply the relevant scenario below. You need an OAuth access token with the users:read and users:write scopes. See the Authorization guide for how to obtain one. If you plan to set a department, location, or manager on new users, look those up first via GET /departments, GET /locations, and GET /users. User creation is asynchronous. All three scenarios that create users hit the same deferred-task pattern. A terminal status response looks like: On SUCCESS, data.user_id is the UUID of the created user. Most tasks finish in under 5 seconds. The pattern is shared with Deferred tasks. Scenario 1: Onboard, update, and deprovision a user Invite a new hire, keep their profile in sync as the org changes around them, and deactivate them when they leave. The three endpoints here are POST /users/deferred, PATCH /users/{user_id}, and PATCH /users/{user_id}/deactivate. For an employee starting today, call POST /developer/v1/users/deferred with role and their profile fields. This sends the invite email immediately. A typical request body: The response is the deferred-task handle: { "id": "165c7dc4-7b6b-4ee5-baa6-1f28701b075e" }. Only email, first_name, last_name, role, and idempotency_key are required — if you omit department and location, Ramp assigns the business's defaults. The fields you can send on create: role One of BUSINESS_USER, BUSINESS_ADMIN, BUSINESS_BOOKKEEPER, IT_ADMIN, AUDITOR, GUEST_USER. BUSINESS_OWNER cannot be invited via the API. department_id, location_id Ramp UUIDs. location_id also determines the user's business entity (entity_id on the response). direct_manager_id Ramp UUID of an existing user. The request uses direct_manager_id; the response calls it manager_id. is_manager Whether this user can approve spend and manage reports. scheduled_deactivation_date In YYYY-MM-DD format. Useful if you already know the user's end date — see Schedule their last day. Cannot be set for admins or owners. idempotency_key A client-generated unique string. Ramp rejects duplicate keys with 400 DEVELOPER_7005; generate a new key for every create attempt. Poll the deferred task until it reports SUCCESS, then GET /developer/v1/users/{user_id} to fetch the user: The user starts in INVITE_PENDING. They transition to USER_ACTIVE once they click the invite link and complete onboarding — you'll receive the users.invite_accepted webhook at that point (see the Webhooks guide). Guest users get an automatic 6-month expiration When role is GUEST_USER, Ramp auto-populates scheduled_deactivation_date 6 months out from the invite date. To opt out, pass "scheduled_deactivation_date": null explicitly on create. Role changes, reorgs, moves between locations or entities, and manager changes all go through PATCH /developer/v1/users/{user_id}. Only the fields you include are updated; everything else is left untouched. A representative body: A successful PATCH returns 200 OK with an empty body — re-fetch the user to see the applied changes. Patchable fields: first_name, last_name, role, department_id, location_id, direct_manager_id, is_manager, scheduled_deactivation_date, auto_promote. Any other field — including email, scheduled_invitation_date, and status — is silently ignored. To clear a nullable field like direct_manager_id or scheduled_deactivation_date, send null explicitly. If you know someone's end date ahead of time — a fixed-term contractor, a resignation with notice — PATCH scheduled_deactivation_date on the user. Ramp flips them to USER_INACTIVE automatically on that date; until then they keep working normally. PATCH /developer/v1/users/{user_id} with {"scheduled_deactivation_date": "2027-01-15"}. A subsequent GET shows the date populated: To reschedule, PATCH again with a new date. To cancel, PATCH with {"scheduled_deactivation_date": null}. Date vs. datetime You submit scheduled_deactivation_date as a plain date (YYYY-MM-DD), but Ramp returns it as a full ISO-8601 datetime with a time-of-day derived from the business's local timezone. Compare against the date portion only when reading it back. To deactivate a user synchronously, PATCH /developer/v1/users/{user_id}/deactivate with no body. The response is 200 OK, empty body. The user is now USER_INACTIVE: Once a user is USER_INACTIVE: All of their cards are frozen and new transactions decline. They can't log in to Ramp or receive notifications. Their historical transactions, receipts, and audit trail remain intact for admins. Deactivation is idempotent — calling /deactivate on an already-inactive user is a no-op and still returns 200 OK. Scenario 2: Deactivate and reactivate a user When deactivation isn't permanent — a leave of absence, a contractor pausing between engagements, a mistaken offboarding — Ramp preserves the user record so you can bring them back with a single call. They keep the same user_id, cards, department, location, manager, role, and custom fields. PATCH /developer/v1/users/{user_id}/deactivate with no body returns 200 OK and an empty body. The user becomes USER_INACTIVE; cards freeze and logins stop working. Historical data stays visible to admins. PATCH /developer/v1/users/{user_id}/reactivate with no body returns 200 OK and an empty body. A subsequent GET shows them back as USER_ACTIVE: Previously issued cards are unfrozen and notifications resume. If their role or reporting line changed during the leave, follow up with PATCH /users/{user_id} to update those fields. Reactivate instead of re-creating Do not call POST /users/deferred for a returning user. Reactivation preserves their spend history and configuration; creating a new record with the same email just returns the existing user_id anyway. Scenario 3: Stage a draft user and schedule their invite For new hires who start in the future — a class of interns starting next Monday, a contractor kicking off on the first of the month — you can stage the user in Ramp as a draft today and have Ramp send the invite automatically on a specific date and time. Drafts: Exist as records in your business (you can assign department, location, manager up front). Do not receive an invite email. Cannot log in or spend. Appear in GET /users?status=USER_DRAFT. POST /developer/v1/users/deferred with is_draft: true in the body: Poll the deferred task, then fetch the user — they start in USER_DRAFT: POST /developer/v1/users/{user_id}/invite with action: SCHEDULE and the time you want the invite to go out. invitation_time is an ISO-8601 datetime — include a timezone offset so there's no ambiguity. Response: 200 OK, empty body. The user stays in USER_DRAFT with the scheduled time populated: When the scheduled time arrives, Ramp sends the invite email automatically and moves the user to INVITE_PENDING. Once they accept it, they become USER_ACTIVE and you can PATCH, deactivate, or reactivate them as normal. Plans change. POST /developer/v1/users/{user_id}/invite takes three actions: SCHEDULE {"action": "SCHEDULE", "invitation_time": ""} Sets or updates scheduled_invitation_date. Calling it again overwrites the previous scheduled time. User stays USER_DRAFT. DESCHEDULE {"action": "DESCHEDULE"} Clears the scheduled invitation. User stays USER_DRAFT. Idempotent — no-op if nothing is pending. SEND_NOW {"action": "SEND_NOW"} Sends the invite email immediately and transitions the user to INVITE_PENDING. Invite actions only apply to draft users SCHEDULE, DESCHEDULE, and SEND_NOW are only valid when the target user is USER_DRAFT. Calling them on a user in any other state returns 400 DEVELOPER_7154. GET /developer/v1/users supports filtering by role, status, department_id, location_id, entity_id, email, and employee_id. Useful patterns: GET /users?status=USER_DRAFT — every user staged as a draft. GET /users?status=USER_INACTIVE — deactivated users, e.g. for offboarding audits. GET /users?email=... — lookup by email. URL-encode + as %2B and @ as %40. GET /users?role=GUEST_USER — every guest in the business. Results are paginated with page_size (between 2 and 100, default 20) and start (the cursor from the previous page's page.next). A filtered response: Follow page.next until it returns null. For the underlying status enum, see Users → Status model. Users — concept model for users: status, async creation, identity fields. Cards — cards are issued to and frozen on user lifecycle transitions. Spend Controls — funds and spend programs reference user IDs as members. Users — full lifecycle: create, update, deactivate, reactivate, schedule invites. Departments — lookups for department_id. Locations — lookups for location_id; determines entity_id. Deferred tasks — polling pattern for asynchronous user creation. Webhooks — subscribe to users.invite_accepted and related events. Authorization — users:read / users:write scopes. --- title: Users source_url: /developer-api/v1/users text_url: /llms-guides/users.txt summary: The people on a Ramp account — provisioned, updated, deactivated through the Users API. Users are the principal behind every spend object. content: The people on a Ramp account — provisioned, updated, deactivated through the Users API. Users are the principal behind every spend object. How users work A user is a person with access to a Ramp account. Every transaction, card, reimbursement, and approval traces back to a user; provisioning and deprovisioning are the touchpoints between Ramp and your HRIS, IdP, or onboarding tool. The status field on a user tells you where they are in the lifecycle. USER_DRAFT The user record exists, but no invite has been sent. They can't log in or spend. Use this to pre-stage users (e.g., new hires starting next month). INVITE_PENDING An invite email has been sent but the user hasn't accepted it yet. USER_ACTIVE The user has accepted the invite, is onboarded, and can use Ramp. USER_INACTIVE The user has been deactivated. Cards are frozen, spend is blocked, and they cannot log in. The record is preserved for history and reactivation. USER_SUSPENDED Ramp has suspended the user for risk or policy reasons. This is rare and cannot be set by API callers. User creation is asynchronous. POST /developer/v1/users/deferred returns a task id; poll GET /developer/v1/users/deferred/status/{task_id} every 1–2 seconds until status is SUCCESS (possible values: STARTED, IN_PROGRESS, ERROR, SUCCESS). Most tasks finish in under 5 seconds. On SUCCESS, data.user_id is the UUID of the created user. The polling pattern is shared with Deferred tasks. Users carry a role, department_id, location_id, direct_manager_id, and entity_id. Departments and locations are managed through their own endpoints; a user's entity_id is derived from their location_id and determines which legal entity their spend belongs to. Roles are BUSINESS_USER, BUSINESS_ADMIN, BUSINESS_BOOKKEEPER, IT_ADMIN, AUDITOR, GUEST_USER. BUSINESS_OWNER exists but cannot be invited via the API. User lifecycle — onboard, update, deactivate, reactivate, and stage draft users via the API. Three scenarios cover the common provisioning paths between Ramp and your HRIS or IdP. Cards — cards are issued to and frozen on user lifecycle transitions. Spend Controls — funds and spend programs reference user IDs as members. Users — full lifecycle: create, update, deactivate, reactivate, schedule invites. Departments — lookups for department_id. Locations — lookups for location_id; determines entity_id. Deferred tasks — polling pattern for asynchronous user creation. Webhooks — subscribe to users.invite_accepted and related events. Authorization — users:read / users:write scopes. --- title: Virtual Cards source_url: /developer-api/v1/virtual-cards text_url: /llms-guides/virtual-cards.txt summary: Issue virtual cards backed by Ramp funds and expose them where they need to land — to your end users' browsers via a Ramp-served iframe, or to your servers for vendor automation. content: Issue virtual cards backed by Ramp funds and expose them where they need to land — to your end users' browsers via a Ramp-served iframe, or to your servers for vendor automation. A virtual card program where Ramp handles issuance and policy enforcement, and you pick how card details are surfaced: Embedded iframe (browser-side) — your backend mints a short-lived token; your frontend loads a Ramp-served iframe; the iframe renders card details directly to the user. Your servers never touch the PAN. Use when end users in your product need to see and use card numbers themselves. Vault API (server-side) — your backend creates a card and retrieves the PAN, CVV, and expiration in one synchronous call. Use when your service pays vendors directly, automates AP/travel bookings, or executes payments from a backend workflow. Both patterns share the same issuance step — a fund — and differ only on the exposure mechanism. Pick one or run both side-by-side. Vault API requires Ramp approval Vault API access in production is gated behind PCI qualification — Ramp has to approve your app before you can retrieve full PANs and CVVs server-side. All customers see full data in Sandbox. Submit a Developer API support ticket to begin the qualification. Pattern A (embedded iframe) does not require this approval. Estimated time: 1–3 hours for a working prototype. Prerequisite knowledge: OAuth on Ramp; basic backend for both patterns, basic frontend for the iframe pattern. Card data flows to The end user's browser, via Ramp iframe Your backend PCI scope Your service is out of scope on the data plane Your service is in scope on the data plane When to use End user needs to see the card and use it themselves Backend pays a vendor, books travel, runs agent purchases Status Beta GA (pending qualification) Requires embedded_cards:write scope, parent_origin whitelisting cards:read_vault scope, PCI qualification Required: A Ramp account, an app with the appropriate scope, and at least one fund you can issue cards against. Recommended: Read Cards for the conceptual model and Spend Controls for fund configuration. Funds are created via Ramp's Limits API — "limit" is the API name, "fund" is the brand. Prerequisites for Embedded: A domain you control (parent_origin); whitelisting by Ramp before production. Prerequisites for Vault: PCI qualification for production. Sandbox works without qualification. Pattern A: Embedded iframe Surface card details inside your own product so end users see and use card numbers without your servers ever touching the data. Beta feature Embedded Cards is in beta. Submit a Developer API support ticket to whitelist your parent_origin before generating embed tokens. A four-step handshake: your backend mints an embed token for a specific card; your frontend loads a Ramp-served iframe; the iframe renders card data directly to the user. Security: token handling Never store embed tokens client-side. Mint them on demand from your backend. Tokens are short-lived but should still be treated as bearer credentials. 1. Enable the embedded_cards:write scope Demo: enable embedded_cards:write in the developer dashboard. Production: the scope requires explicit approval. Contact developer support with the client ID of the app to enable it for. 2. Issue a card Create a fund using the Limits API; a virtual card is issued automatically. Capture its card_id to mint embed tokens for it. 3. Build the backend embed-token endpoint Your backend needs an endpoint your frontend can call to mint a token. It accepts a card_id and parent_origin, calls Ramp, and returns the token. POST /developer/v1/embedded/cards/{card_id}/embed Mint a short-lived embed token for a card. Shape callout: Your backend route is a thin pass-through: accept card_id and parent_origin from your frontend, forward to Ramp with your bearer token, return the embed_init_token. Never expose your Ramp access token to the browser. Verify: call your backend endpoint with a real card_id and your origin; you should get back an embed_init_token. 4. Render the iframe on the frontend Fetch the token from your backend and post it into a Ramp-hosted iframe. Shape callout — the iframe handshake: The parent_origin you pass when minting the token must match window.location.origin of the page hosting the iframe — exact protocol, host, and port. See What is parent_origin? below. 5. Test the integration Navigate to the Embedded Card Demo, paste an embed_init_token, and press Load Embed. The domain hosting the iframe — must exactly match window.location.origin of the page loading the embed. Ramp validates the origin server-side, blocking unauthorized domains from rendering your users' card details. Examples: Production: "https://your-app-domain.com" Local development: "http://localhost:3000" Match must be exact — protocol (https:// vs http://) and port both count. Mismatched origins fail to load. Pattern B: Vault API Issue a card and retrieve PAN, CVV, and expiration in a single synchronous request. Your backend holds the data and passes it to a vendor, travel partner, or supplier. Production access requires Ramp approval The Vault API needs PCI qualification before it can return full PANs and CVVs in production. All customers see full data in Sandbox. Submit a Developer API support ticket to begin the qualification. 1. Enable the Vault scopes Enable cards:read_vault and limits:write (and optionally users:read) on your application. In Sandbox these work immediately; for production, qualify via a Developer API support ticket. 2. Build the client The Vault API uses a different base URL than the standard Developer API: https://demo-vault-api.ramp.com for Sandbox, https://vault-api.ramp.com for production. Copy your Client ID and Client Secret into a .env: 3. Issue a card and retrieve its details /vault/cards Create a fund, issue a virtual card, and return full card details in one request. Verify: call /vault/cards in Sandbox; the response should include a full card_number and cvv. 4. Pass card details to the vendor Use the returned PAN, CVV, and expiration to submit payment to the vendor, travel system, or processor. Treat card data as PCI-scoped: don't log, store at rest unencrypted, or pass through endpoints outside qualified scope. 5. Terminate the card Virtual cards created via POST /vault/cards return both a spend_limit_id and a card.id. To permanently terminate, use the fund termination endpoint on the Limits API, not the cards termination endpoint: ✅ Correct: POST /developer/v1/limits/{spend_limit_id}/deferred/termination ❌ Incorrect: POST /developer/v1/cards/{card_id}/deferred/termination The Vault API creates a fund with an associated virtual card. Terminating the fund terminates the card. Termination is irreversible and processed asynchronously. Whitelist your production parent_origin (Embedded) or qualify for PCI access (Vault) before launching. Mint embed tokens and Vault card details just-in-time. Never cache PANs or tokens client-side. Subscribe to transactions.cleared webhooks to track spend, refunds, and reversals on virtual cards. Refunds fire on locked or terminated cards too — watch for negative amount values. Plan card lifecycle. For embedded cards, terminate when the user-facing flow ends. For Vault cards, terminate the underlying fund (not the card directly) when winding down. Idempotency. Pass an idempotency_key when creating funds programmatically to avoid duplicate issuance on retries. AI Agents — agents need scoped, per-merchant cards; the Vault and embedded patterns apply. Spend programs — programs template the funds that auto-issue virtual cards. Cards — card variants and lifecycle. Spend Controls — funds, spend programs, and approvals that back every card. Limits — create funds, which auto-issue virtual cards. Cards — physical card management. Transactions — settled spend per card and per fund. Webhooks — transactions.cleared for spend events. Deferred tasks — polling pattern used by fund creation and termination. Authorization — embedded_cards:write, cards:read_vault, limits:write scopes. FAQ From the Limits API — every fund has an associated card with a card_id. Yes, after contacting developer support to enable embedded_cards:write for your production app and whitelist your origin. The embed fails to load. Match must be exact, including protocol and port. Yes. Refunds and reversals route to the original card even after lock or termination. Subscribe to transactions.cleared and watch for negative amount values. Technically yes, but it's unusual. Pick one exposure mechanism per card so the operational model stays clear. --- title: Webhooks source_url: /developer-api/v1/webhooks text_url: /llms-guides/webhooks.txt summary: Webhooks allow your application to receive real-time notifications about events that occur in your Ramp account. Instead of polling our API, webhooks push notifications to your specified endpoint whenever an event happens. content: Webhooks allow your application to receive real-time notifications about events that occur in your Ramp account. Instead of polling our API, webhooks push notifications to your specified endpoint whenever an event happens. Key benefits: Instant notification of events like transactions, approvals, or reimbursements Reduces the need for polling APIs to check for updates Enables automation of downstream workflows (e.g., syncing with accounting software) Subscribe to the event types below for business workflows and mock testing. Request the OAuth scope for the underlying resource so your integration can read the object after receiving the event. Applications applications:read applications.status_updated Application status has changed, such as approved or rejected. Bills bills:read bills.approved Bill has been approved. bills.archived Bill has been archived. bills.created Bill has been created. bills.paid Bill payment has been completed. bills.ready_to_sync Bill is ready to sync to an accounting system. bills.rejected Bill has been rejected. Entities entities:read entities.created Business entity has been created. Item Receipts item_receipts:read item_receipts.created Item receipt has been created. Payments payments.updated Bill payment has been updated. Purchase Orders purchase_orders:read purchase_orders.archived Purchase order has been archived. purchase_orders.created Purchase order has been created. purchase_orders.updated Purchase order has been modified. Reimbursements reimbursements:read reimbursements.batch_payment_reimbursed Reimbursement batch payment has been reimbursed. reimbursements.ready_for_review Reimbursement needs review. reimbursements.ready_to_sync Reimbursement is ready to sync to an accounting system. reimbursements.sync_requested Reimbursement sync has been requested. Spend Requests spend_requests:read spend_requests.comment_created Comment has been added to a spend request. Transactions transactions:read transactions.authorized Transaction has been authorized. transactions.cleared Transaction has settled. This also fires for refunds and reversals. transactions.declined Transaction has been declined. transactions.ready_for_review Transaction needs review or coding. transactions.ready_to_sync Transaction is ready to sync to an accounting system. transactions.sync_requested Transaction sync has been requested. transactions.synced Transaction has been marked as synced. Unified Requests unified_requests:read unified_requests.created Unified request has been created. unified_requests.external_approval_request Unified request is ready for external approval. unified_requests.external_approval_request_reset External approval request on a unified request has been reset. unified_requests.modified Unified request has been modified. unified_requests.node_advanced Unified request advanced to another workflow node. unified_requests.override_approved Unified request override has been approved. unified_requests.updated Unified request has been updated. Users users:read users.invite_accepted User has accepted an invitation. Vendors vendors:read vendors.activated Vendor has been activated. vendors.updated Vendor has been updated. Testing None tests.test_event Test event for mock webhook delivery. Ramp also sends webhooks.verification during endpoint verification. You do not need to subscribe to it for business workflows; see Verify your webhook for the verification flow. Getting started Set up an HTTPS endpoint (URL) on your server that can receive POST requests from Ramp. Your endpoint must: Be publicly accessible Use HTTPS Return a 2xx status code for successful receipt Process requests within 10 seconds Create a webhook subscription using the /webhooks endpoint. You must have the appropriate scopes in your access token. Ramp will send a POST request with a challenge to your endpoint during setup. Receive the challenge string from Ramp Respond by making a verification API call: Webhook payload format All webhook payloads follow this consistent structure: Payload fields: id: Unique event ID (constant across retries) type: Event type from the available events table created_at: Event timestamp in ISO 8601 format business_id: Identifies which business the event belongs to object: Contains the affected resource ID Transaction event: Bill event: Purchase order event: To get the full resource details, use the resource ID to fetch from the appropriate API endpoint (e.g., /transactions/{id} for transaction events, /reimbursements/{id} for reimbursement events). Verifying webhook signatures To help ensure the security of your integration, Ramp includes a cryptographic signature with every webhook event we send. This allows you to verify that the payload was sent by Ramp and hasn't been modified in transit. While payload validation is optional, we recommend implementing it for any production environment. Using a no-code or low-code platform? If you're using a no-code or low-code platform (like Zapier, Make, or Pipedream), you may not have access to custom code for signature verification — and that's okay. Validation is encouraged, but not required for webhooks to work. When you create a webhook subscription, Ramp provides a secret field in the response. You'll use this secret to verify the authenticity of all subsequent webhook events. Every webhook request from Ramp includes an X-Ramp-Signature header, which contains an HMAC-SHA256 hash of the raw request body, signed with your webhook secret. Sample X-Ramp-Signature from Ramp: Delivery and retry logic Webhook delivery throughput is not limited on Ramp's end. However, if your endpoint returns a 429 Too Many Requests status, Ramp has built-in mitigations to handle rate limiting gracefully. Ramp's retry behavior depends on the HTTP status code returned by your webhook endpoint: 2xx Delivery successful - no retries 3xx, 4xx (except 429) Instant delivery failure - no retries 429, 5xx (including timeouts) Retry up to 10 times with exponential backoff Retry Timing: Failed deliveries use exponential backoff with jitter, starting between 0-60 seconds and growing exponentially with each failed attempt. Webhook requests timeout after 10 seconds. Important: The same event id is used for all retry attempts, allowing you to implement idempotency checks. Event Ordering: Webhooks may arrive out of order. For example: transactions.authorized might be delayed or retried transactions.cleared may arrive earlier if successful Design your system to handle out-of-order events gracefully by checking the event timestamp and fetching the latest resource state when needed. Best practices Implement idempotency checks using the event id to handle duplicate deliveries Return 2xx responses within 10 seconds to avoid timeout retries Process payloads asynchronously to respond quickly Log raw payloads for debugging and audit trails Handle retries gracefully - the same event may be delivered up to 10 times for 429/5xx responses Always verify webhook signatures before processing Use HTTPS endpoints to encrypt data in transit Validate event types against your expected events Implement proper error handling for malformed payloads Monitor for failed webhook deliveries Set up alerting for webhook endpoint downtime Managing webhook subscriptions Use the same /webhooks endpoints to manage subscriptions for multi-customer applications. The webhook payload always includes a business_id, which can be used to identify the associated business: Troubleshooting Need help? Submit a Developer API support ticket and our team will follow up. Verify your endpoint is publicly accessible and returns 2xx status codes Check that your webhook subscription includes the correct event types Ensure your access token has the required scopes for the events Confirm your endpoint responds within 10 seconds Ramp will retry webhook deliveries with exponential backoff Missed events during extended downtime may not be recoverable Consider implementing a fallback polling mechanism for critical events Delete the existing webhook subscription Create a new subscription with the updated URL Re-verify the new endpoint Use tools like ngrok to expose your local server Use webhook.site to get a temporary URL for testing webhook delivery Test with a small subset of event types initially Monitor webhook logs for successful delivery and processing A developer dashboard for webhook monitoring is coming soon For now, implement comprehensive logging in your webhook handlers Ready to implement webhooks in your integration? Here are some related guides: ERP Integrations: Learn how ready_to_sync webhooks can replace polling in your ERP integration Getting started: Set up authentication and make your first API calls with our Setup guide Bill Pay: Automate bill payment workflows with our Bill Pay guide If you have questions or feedback about webhooks, submit a Developer API support ticket – we're here to help make your integration successful. ## API Reference title: List general ledger accounts path: /developer/v1/accounting/accounts description: No description request: none response: { data: { accounting_connection_id: string classification?: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' code?: string created_at: string /* date */ gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string ramp_id: string updated_at?: string /* date */ }[] page: { next: string } } --- title: Upload general ledger accounts path: /developer/v1/accounting/accounts description: You can upload up to 500 general ledger accounts in an all-or-nothing fashion. If a general ledger accounts within a batch is malformed or violates a database constraint, the entire batch containing that account will be disregarded. To have a successful upload, please sanitize the data and ensure the general ledger accounts that you are trying to upload do not already exist on Ramp. If a general ledger account is already on Ramp but you want to update its attributes, please use the PATCH developer/v1/accounting/accounts/{id} endpoint instead. request: { accounting_connection_id?: string gl_accounts: { classification: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' code?: string id: string name: string }[] } response: none --- title: Delete a general ledger account path: /developer/v1/accounting/accounts/{gl_account_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch a general ledger account path: /developer/v1/accounting/accounts/{gl_account_id} description: No description request: none response: { accounting_connection_id: string classification?: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' code?: string created_at: string /* date */ gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string ramp_id: string updated_at?: string /* date */ } --- title: Update a general ledger account path: /developer/v1/accounting/accounts/{gl_account_id} description: This endpoint can be used to update the name or code of a GL account; request: { accounting_connection_id?: string code?: string name?: string reactivate?: boolean } response: { accounting_connection_id: string classification?: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' code?: string created_at: string /* date */ gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string ramp_id: string updated_at?: string /* date */ } --- title: Fetch all accounting connections for the current business path: /developer/v1/accounting/all-connections description: No description request: none response: { connections: { connection_type: 'API' | 'CSV' | 'DIRECT' created_at: string /* date */ id: string is_active: boolean is_ready_to_migrate: boolean last_linked_at: string /* date */ remote_provider_name: string settings: { reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' }[] } --- title: Post accounting coding selections to an object path: /developer/v1/accounting/codings description: No description request: { accounting_coding_selections: { accounting_field_id: string accounting_field_option_id?: string free_form_text?: string }[] object_id: string object_type: 'TRANSACTION' } response: none --- title: Disconnect an accounting connection path: /developer/v1/accounting/connection description: This endpoint only allows disconnecting API based connections. request: none response: none --- title: Fetch the current active accounting connection path: /developer/v1/accounting/connection description: This endpoint is now deprecated. Please use the `/all-connections` endpoint instead here. request: none response: { connection_type: 'API' | 'CSV' | 'DIRECT' created_at: string /* date */ id: string is_active: boolean is_ready_to_migrate: boolean last_linked_at: string /* date */ remote_provider_name: string settings: { reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } | { message?: string } --- title: Register a new API based accounting connection path: /developer/v1/accounting/connection description: A connection is required in order to use our accounting API functionality. If a Universal CSV connection already exists, it will be upgraded to an API based connection. request: { reactivate?: boolean remote_provider_name: string settings?: { reimbursement_sync_button_enabled?: boolean transaction_accounting_vendor_creation_on_sync_enabled?: boolean transaction_sync_button_enabled?: boolean vendor_credits_enabled?: boolean } } response: none --- title: Fetch an accounting connection by ID path: /developer/v1/accounting/connection/{connection_id} description: No description request: none response: { connection_type: 'API' | 'CSV' | 'DIRECT' created_at: string /* date */ id: string is_active: boolean is_ready_to_migrate: boolean last_linked_at: string /* date */ remote_provider_name: string settings: { reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } --- title: Update an accounting connection path: /developer/v1/accounting/connection/{connection_id} description: This endpoint is restricted to Accounting API based connections. request: { settings?: { reimbursement_sync_button_enabled?: boolean transaction_accounting_vendor_creation_on_sync_enabled?: boolean transaction_sync_button_enabled?: boolean vendor_credits_enabled?: boolean } } response: { connection_type: 'API' | 'CSV' | 'DIRECT' created_at: string /* date */ id: string is_active: boolean is_ready_to_migrate: boolean last_linked_at: string /* date */ remote_provider_name: string settings: { reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } --- title: Reactivate a previously unlinked accounting connection path: /developer/v1/accounting/connection/{connection_id}/reactivate description: This endpoint allows reactivating a previously disconnected accounting connection by changing its status back to linked. This preserves all previous accounting field configurations and settings. The business must not have any other active accounting connections. request: none response: { connection_type: 'API' | 'CSV' | 'DIRECT' created_at: string /* date */ id: string is_active: boolean is_ready_to_migrate: boolean last_linked_at: string /* date */ remote_provider_name: string settings: { reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } --- title: List options for a given custom accounting field path: /developer/v1/accounting/field-options description: No description request: none response: { data: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string id?: string is_active?: boolean provider_name: string ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' }[] page: { next: string } } --- title: Upload new options path: /developer/v1/accounting/field-options description: You can upload up to 500 new field options for a given custom accounting field in an all-or-nothing fashion. If a field option within a batch is malformed or violates a database constraint, the entire batch containing that field option will be disregarded. To have a successful upload, please sanitize the data and ensure the field options that you are trying to upload do not already exist on Ramp. If a field option is already on Ramp but you want to update its attributes, please use the PATCH developer/v1/accounting/field-options/{id} endpoint instead. request: { accounting_connection_id?: string field_id: string options: { code?: string display_name?: string entity_remote_ids?: string[] id: string value: string }[] } response: none --- title: Delete a custom accounting field option path: /developer/v1/accounting/field-options/{field_option_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch a custom accounting field option path: /developer/v1/accounting/field-options/{field_option_id} description: No description request: none response: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string id?: string is_active?: boolean provider_name: string ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' } --- title: Update a custom accounting field option path: /developer/v1/accounting/field-options/{field_option_id} description: No description request: { code?: string display_name?: string entity_remote_ids?: string[] reactivate?: boolean value?: string visibility?: 'HIDDEN' | 'VISIBLE' } response: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string id?: string is_active?: boolean provider_name: string ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' } --- title: Update a custom accounting field option path: /developer/v1/accounting/field-options/{field_option_id} description: No description request: { code?: string display_name?: string entity_remote_ids?: string[] reactivate?: boolean value?: string visibility?: 'HIDDEN' | 'VISIBLE' } response: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string id?: string is_active?: boolean provider_name: string ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' } --- title: List custom accounting fields path: /developer/v1/accounting/fields description: No description request: none response: { data: { accounting_connection_id: string created_at?: string /* date */ display_name: string id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name?: string provider_name: string ramp_id?: string updated_at?: string /* date */ }[] page: { next: string } } --- title: Create a new custom accounting field path: /developer/v1/accounting/fields description: If a custom field with the same id already exists on Ramp, then that existing one will be returned instead of creating a new one; If the existing custom field is inactive, it will be reactivated. If you want to update the existing custom field, please use the PATCH developer/v1/accounting/fields/{id} endpoint instead. request: { accounting_connection_id?: string display_name?: string id: string input_type: 'BOOLEAN' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_required_for?: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name: string } response: none --- title: Delete a custom accounting field path: /developer/v1/accounting/fields/{field_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch a custom accounting field path: /developer/v1/accounting/fields/{field_id} description: No description request: none response: { accounting_connection_id: string created_at?: string /* date */ display_name: string id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name?: string provider_name: string ramp_id?: string updated_at?: string /* date */ } --- title: Update a custom accounting field path: /developer/v1/accounting/fields/{field_id} description: No description request: { accounting_connection_id?: string display_name?: string is_splittable?: boolean name?: string } response: { accounting_connection_id: string created_at?: string /* date */ display_name: string id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name?: string provider_name: string ramp_id?: string updated_at?: string /* date */ } --- title: Delete inventory item accounting field path: /developer/v1/accounting/inventory-item description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch inventory item accounting field path: /developer/v1/accounting/inventory-item description: Returns the inventory item accounting field for the current accounting connection. request: none response: { accounting_connection_id: string display_name: string id: string name: string ramp_id: string } --- title: Update inventory item accounting field path: /developer/v1/accounting/inventory-item description: No description request: { accounting_connection_id?: string display_name?: string name?: string } response: { accounting_connection_id: string display_name: string id: string name: string ramp_id: string } --- title: Create a new inventory item accounting field path: /developer/v1/accounting/inventory-item description: There can only be one active inventory item accounting field per accounting connection. request: { accounting_connection_id?: string display_name?: string name: string } response: none --- title: List inventory item options path: /developer/v1/accounting/inventory-item/options description: No description request: none response: { data: { accounting_connection_id: string gl_account_id: string id: string is_active: boolean name: string ramp_id: string }[] page: { next: string } } --- title: Upload inventory item options path: /developer/v1/accounting/inventory-item/options description: There must be an active inventory item accounting field for the accounting connection. request: { accounting_connection_id?: string options: { gl_account_id?: string id: string name: string }[] } response: none --- title: Delete an inventory item option path: /developer/v1/accounting/inventory-item/options/{option_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Update an inventory item option path: /developer/v1/accounting/inventory-item/options/{option_id} description: No description request: { accounting_connection_id?: string gl_account_id?: string name?: string reactivate?: boolean } response: { accounting_connection_id: string gl_account_id: string id: string is_active: boolean name: string ramp_id: string } --- title: Upload new options for a Ramp-only field path: /developer/v1/accounting/ramp-field-options description: No description request: { accounting_connection_id: string field_id: string options: { code?: string display_name?: string id: string value: string }[] } response: none --- title: Delete a Ramp-only field option path: /developer/v1/accounting/ramp-field-options/{field_option_id} description: No description request: { accounting_connection_id: string } response: none --- title: Update a Ramp-only field option path: /developer/v1/accounting/ramp-field-options/{field_option_id} description: No description request: { accounting_connection_id: string code?: string display_name?: string reactivate?: boolean value?: string visibility?: 'HIDDEN' | 'VISIBLE' } response: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string id?: string is_active?: boolean provider_name: string ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' } --- title: List Ramp-only accounting fields path: /developer/v1/accounting/ramp-fields description: No description request: none response: { data: { accounting_connection_id: string created_at?: string /* date */ display_name: string id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name?: string provider_name: string ramp_id?: string updated_at?: string /* date */ }[] page: { next: string } } --- title: Create a Ramp-only accounting field path: /developer/v1/accounting/ramp-fields description: No description request: { accounting_connection_id?: string display_name?: string id: string input_type: 'BOOLEAN' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_required_for?: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name: string } response: none --- title: Delete a Ramp-only accounting field path: /developer/v1/accounting/ramp-fields/{field_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch a Ramp-only accounting field path: /developer/v1/accounting/ramp-fields/{field_id} description: No description request: none response: { accounting_connection_id: string created_at?: string /* date */ display_name: string id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name?: string provider_name: string ramp_id?: string updated_at?: string /* date */ } --- title: Update a Ramp-only accounting field path: /developer/v1/accounting/ramp-fields/{field_id} description: No description request: { accounting_connection_id?: string display_name?: string is_splittable?: boolean name?: string } response: { accounting_connection_id: string created_at?: string /* date */ display_name: string id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: 'BILL' | 'BILL_PAYMENT' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT'[] is_splittable?: boolean name?: string provider_name: string ramp_id?: string updated_at?: string /* date */ } --- title: Post ready to sync status path: /developer/v1/accounting/ready-to-sync description: This endpoint allows customers to mark a list of objects as ready to sync by their object IDs. request: { object_ids: string[] object_type: 'TRANSACTION' } response: none --- title: Post sync status path: /developer/v1/accounting/syncs description: This endpoint allows customers to notify Ramp of a list of sync results. An idempotency key is required to ensure that subsequent requests are properly handled. request: { failed_syncs?: { error: { message: string } id: string }[] idempotency_key: string successful_syncs?: { deep_link_url?: string id: string reference_id: string }[] sync_type: 'BILL_PAYMENT_SYNC' | 'BILL_SYNC' | 'BROKERAGE_ORDER_SYNC' | 'REIMBURSEMENT_SYNC' | 'STATEMENT_CREDIT_SYNC' | 'TRANSACTION_SYNC' | 'TRANSFER_SYNC' | 'WALLET_TRANSFER_SYNC' } response: none --- title: Delete tax code accounting field path: /developer/v1/accounting/tax/code description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch tax code accounting field path: /developer/v1/accounting/tax/code description: Returns the tax code accounting field for the current accounting connection. request: none response: { accounting_connection_id: string display_name: string id: string name: string ramp_id: string } --- title: Update tax code accounting field path: /developer/v1/accounting/tax/code description: No description request: { accounting_connection_id?: string display_name?: string name?: string } response: { accounting_connection_id: string display_name: string id: string name: string ramp_id: string } --- title: Create a new tax code accounting field path: /developer/v1/accounting/tax/code description: There can only be one active tax code accounting field per accounting connection. request: { accounting_connection_id?: string display_name?: string name: string } response: none --- title: List tax code options path: /developer/v1/accounting/tax/code/options description: No description request: none response: { data: { accounting_connection_id: string id: string is_active: boolean name: string ramp_id: string tax_rate_ids: string[] }[] page: { next: string } } --- title: Upload tax code options path: /developer/v1/accounting/tax/code/options description: There must be an active tax code accounting field for the accounting connection. request: { accounting_connection_id?: string options: { id: string name: string tax_rate_ids?: string[] }[] } response: none --- title: Delete a tax code option path: /developer/v1/accounting/tax/code/options/{option_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Update a tax code option path: /developer/v1/accounting/tax/code/options/{option_id} description: No description request: { accounting_connection_id?: string name?: string tax_rate_ids?: string[] } response: { accounting_connection_id: string id: string is_active: boolean name: string ramp_id: string tax_rate_ids: string[] } --- title: List tax rates path: /developer/v1/accounting/tax/rates description: No description request: none response: { data: { accounting_connection_id: string accounting_gl_account_id: string id: string name: string ramp_id: string rate: string }[] page: { next: string } } --- title: Upload tax rates path: /developer/v1/accounting/tax/rates description: You can upload up to 500 tax rates in an all-or-nothing fashion. If a tax rate within a batch is malformed or violates a database constraint, the entire batch will be disregarded. To have a successful upload, please sanitize the data and ensure the tax rates that you are trying to upload do not already exist on Ramp. request: { accounting_connection_id?: string tax_rates: { accounting_gl_account_id?: string id: string name: string rate: string | number }[] } response: none --- title: Delete a tax rate path: /developer/v1/accounting/tax/rates/{tax_rate_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Update a tax rate path: /developer/v1/accounting/tax/rates/{tax_rate_id} description: No description request: { accounting_connection_id?: string accounting_gl_account_id?: string name?: string rate?: string | number } response: { accounting_connection_id: string accounting_gl_account_id: string id: string name: string ramp_id: string rate: string } --- title: List vendors path: /developer/v1/accounting/vendors description: No description request: none response: { data: { accounting_connection_id: string code?: string created_at: string /* date */ id?: string is_active: boolean is_synced: boolean name: string provider_name: string ramp_id: string updated_at: string /* date */ vendor_category_info?: { id?: string name?: string ramp_id?: string } }[] page: { next: string } } --- title: Upload vendors path: /developer/v1/accounting/vendors description: You can upload up to 500 vendors in an all-or-nothing fashion. If a vendors within a batch is malformed or violates a database constraint, the entire batch containing that vendors will be disregarded. To have a successful upload, please sanitize the data and ensure the vendors that you are trying to upload do not already exist on Ramp. If a vendors is already on Ramp but you want to update its attributes, please use the PATCH developer/v1/accounting/vendors/{id} endpoint instead. request: { accounting_connection_id?: string vendors: { code?: string id: string name: string }[] } response: none --- title: Delete a vendor path: /developer/v1/accounting/vendors/{vendor_id} description: No description request: { accounting_connection_id?: string } response: none --- title: Fetch a vendor path: /developer/v1/accounting/vendors/{vendor_id} description: No description request: none response: { accounting_connection_id: string code?: string created_at: string /* date */ id?: string is_active: boolean is_synced: boolean name: string provider_name: string ramp_id: string updated_at: string /* date */ vendor_category_info?: { id?: string name?: string ramp_id?: string } } --- title: Update a vendor path: /developer/v1/accounting/vendors/{vendor_id} description: No description request: { accounting_connection_id?: string code?: string name?: string reactivate?: boolean } response: { accounting_connection_id: string code?: string created_at: string /* date */ id?: string is_active: boolean is_synced: boolean name: string provider_name: string ramp_id: string updated_at: string /* date */ vendor_category_info?: { id?: string name?: string ramp_id?: string } } --- title: Fetch a financing application path: /developer/v1/applications description: Since each business can only have one active financing application, this endpoint will only ever return a single application. request: none response: { applicant: { email: string first_name: string last_name: string phone?: string } beneficial_owners: { address?: { apt_suite?: string city?: string country?: string postal_code?: string state?: string street_address?: string } birth_date?: string email?: string first_name?: string last_name?: string passport_last_4?: string phone?: string ssn_last_4?: string title?: string }[] business: { address?: { apt_suite?: string city?: string postal_code?: string state?: string street_address?: string } business_description?: string business_name_dba?: string business_name_legal?: string business_name_on_card?: string business_website?: string incorporation?: { date_of_incorporation?: string /* date */ ein_number?: string entity_type?: 'COOPERATIVE' | 'CORPORATION' | 'LLC' | 'NON_PROFIT_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'SOLE_PROPRIETORSHIP' state_of_incorporation?: string } phone?: string } controlling_officer: { address?: { apt_suite?: string city?: string country?: string postal_code?: string state?: string street_address?: string } birth_date?: string email?: string first_name?: string is_beneficial_owner?: boolean last_name?: string passport_last_4?: string phone?: string ssn_last_4?: string title?: string } financial_details: { estimated_monthly_ap_spend_amount?: number estimated_monthly_spend_amount?: number } id: string status: 'APPROVED' | 'FOLLOW_UPS_REQUIRED' | 'IN_REVIEW' | 'REJECTED' | 'STARTED' | 'WITHDRAWN' } --- title: Create a financing application path: /developer/v1/applications description: This endpoint will create a new business for the applicant and email them with instructions to sign up and continue the application. If the applicant email already exists in Ramp, an invitation email will be re-sent if the business is still in the application stage. If the business is already approved, this operation will be a no-op. Note this endpoint returns success regardless of whether the email exists in Ramp. request: { applicant: { email: string first_name: string last_name: string phone?: string } beneficial_owners?: { address?: { apt_suite?: string city?: string country?: string postal_code?: string state?: string street_address?: string } birth_date?: string email?: string first_name?: string last_name?: string passport_last_4?: string phone?: string ssn_last_4?: string title?: string }[] business?: { address?: { apt_suite?: string city?: string postal_code?: string state?: string street_address?: string } business_description?: string business_name_dba?: string business_name_legal?: string business_name_on_card?: string business_website?: string incorporation?: { date_of_incorporation?: string /* date */ ein_number?: string entity_type?: 'COOPERATIVE' | 'CORPORATION' | 'LLC' | 'NON_PROFIT_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'SOLE_PROPRIETORSHIP' state_of_incorporation?: string } phone?: string } controlling_officer?: { address?: { apt_suite?: string city?: string country?: string postal_code?: string state?: string street_address?: string } birth_date?: string email?: string first_name?: string is_beneficial_owner?: boolean last_name?: string passport_last_4?: string phone?: string ssn_last_4?: string title?: string } financial_details?: { estimated_monthly_ap_spend_amount?: number estimated_monthly_spend_amount?: number } oauth_authorize_params?: { redirect_uri: string state: string } } response: none --- title: Get audit log events path: /developer/v1/audit-logs/events description: No description request: none response: { data: { actor_details: { actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' } | { actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' } | { actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' id: string } | Record actor_id: string actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' additional_details: string event_details: { references: { label: string resource_name: 'Approvals' | 'Bill payment' | 'Bill template' | 'Card' | 'Cash Manager recommendation' | 'Forecast custom input' | 'Fund request' | 'Investment account' | 'Managed portfolio transfer' | 'Payment run' | 'Reimbursement' | 'SFTP Configurations' | 'Separation of duties' | 'Spend allocation' | 'Spend event' | 'Transaction' | 'Travel (Booking request)' | 'Travel (Trip)' | 'Treasury account' | 'User' | 'Vendor / Merchant' | 'WBX Policy' | 'WBX Request' | 'Wallet automation policy' | 'Wallet transfer' | 'Workflow (Base)' | 'Workflow' url: string }[] } event_time: string /* date */ event_type: 'ABK agent blocked on user' | 'ABK agent review requested' | 'ABK agent schedule failed' | 'ABK agent started' | 'AI custom field config executed' | 'Account closed' | 'Account details previewed' | 'Account details viewed' | 'Account document downloaded' | 'Account number deleted' | 'Account number generated' | 'Account number renamed' | 'Account opened' | 'Account renamed' | 'Accounting ai auto mark ready' | 'Accounting coding rules updated' | 'Accounting fields updated' | 'Accounting provider access changed' | 'Accounting settings updated' | 'Accounting split templates updated' | 'Activated card' | 'Added bill field' | 'Added card acceptance policy' | 'Added procurement field' | 'Added user to funds' | 'Added vendor field' | 'Admin changed email' | 'Admin changed phone' | 'Agent access request resolved' | 'Agent access requested' | 'Agent created' | 'Agent current version changed' | 'Agent permissions updated' | 'Agent version created' | 'Agent version published' | 'Approval chain updated' | 'Approval step added' | 'Approval step approved' | 'Approval step rejected' | 'Approval step skipped' | 'Approval step terminated' | 'Approved by manager' | 'Approved card edit request with modifications' | 'Approved card edit request' | 'Approved funds edit request with modifications' | 'Approved funds edit request' | 'Approved new card request with modifications' | 'Approved new card request' | 'Approved procurement change request' | 'Approved request for new funds with modifications' | 'Approved request for new funds' | 'Ascenda credit redeemed' | 'Attendee split' | 'Authorization letter downloaded' | 'Automation deleted' | 'Bank account ACH details viewed' | 'Bank account sensitive details viewed' | 'Bank account updated' | 'Bank letter downloaded' | 'Bill linked to PO' | 'Bill linked to contract' | 'Bill linked' | 'Bill pay AP coworker questions answered' | 'Bill pay accepted sync for bank account from vendor network' | 'Bill pay accepted sync for vendor card acceptance policy from vendor network' | 'Bill pay accepted sync for vendor check mailing address from vendor network' | 'Bill pay accepted sync for vendor information from vendor network' | 'Bill pay accepted sync for vendor tax info from vendor network' | 'Bill pay accounting manual user action' | 'Bill pay accounting sync triggered' | 'Bill pay approval policy updated' | 'Bill pay automatic card payment no longer eligible' | 'Bill pay automatic card payment' | 'Bill pay bank account updated' | 'Bill pay batch payment initiated' | 'Bill pay business vendor unlinked from vendor network' | 'Bill pay card delivery' | 'Bill pay check address update' | 'Bill pay check tracking update' | 'Bill pay deleted bill' | 'Bill pay delivered payment' | 'Bill pay dismissed fraud alert' | 'Bill pay edited payee address' | 'Bill pay edited payment method' | 'Bill pay initiated payment refund' | 'Bill pay mailed check payment' | 'Bill pay marked as paid' | 'Bill pay matched transaction to bill' | 'Bill pay payment failed' | 'Bill pay payment posted' | 'Bill pay recurrence info changed for recurring series' | 'Bill pay rejected PDR bank account ownership match' | 'Bill pay rejected sync for bank account from vendor network' | 'Bill pay rejected sync for vendor card acceptance policy from vendor network' | 'Bill pay rejected sync for vendor check mailing address from vendor network' | 'Bill pay rejected sync for vendor information from vendor network' | 'Bill pay rejected sync for vendor tax info from vendor network' | 'Bill pay retried payment' | 'Bill pay returned funds' | 'Bill unlinked from PO' | 'Bill unlinked from contract' | 'Bill unlinked' | 'Billing config updated' | 'Blank canvas workflow execution updated' | 'Blank canvas workflow pause status updated' | 'Booking request approval policy updated' | 'Brokerage order updated' | 'Business bank account added' | 'Business bank account changed' | 'Business bank account removed' | 'Cancel revision request' | 'Cancelled by customer' | 'Cancelled by ramp' | 'Card delivered' | 'Card payment initiated (audit)' | 'Card payment initiated' | 'Cash Manager settings updated' | 'Cash agent recommendation updated' | 'Cash manager recommendation reviewed' | 'Cashback redeemed' | 'Change order workflow restarted due to change order request modification' | 'Changed bank account on bill' | 'Changed card holder' | 'Changed funds user' | 'Checking Account terms accepted' | 'Combined contracts with this contract' | 'Communication sent' | 'Complete revision' | 'Counterparty created' | 'Counterparty details changed' | 'Created accounting split line item' | 'Created card' | 'Created fund from purchase order' | 'Created merchant error' | 'Created unrecognized charge' | 'Created' | 'Debit settings updated' | 'Deleted bill field' | 'Deleted card acceptance policy' | 'Deleted procurement field' | 'Deleted vendor field' | 'Deleted' | 'Demoted co-owner to member' | 'Detached funds from spend program' | 'Document labeled' | 'Document updated' | 'Docusign envelope updated' | 'Draft vendor created' | 'Draft vendor deleted' | 'Draft vendor published' | 'Edited bill field' | 'Edited card acceptance policy' | 'Edited contract tracking setting' | 'Edited custom field' | 'Edited procurement field' | 'Edited spend intent' | 'Edited tin' | 'Edited vendor field' | 'Edited wallet automation' | 'Email updated' | 'Emailed purchase order' | 'Exception given from dispute resolution' | 'Exception given from repayment' | 'Exception request approved' | 'Exception request cancelled' | 'Exception request denied' | 'Exception requested' | 'External agent key created' | 'External agent key revoked' | 'External agent key updated' | 'External ticket created asana' | 'External ticket created jira' | 'External ticket created linear' | 'External ticket created zendesk' | 'Flexible limits default changed' | 'Forecast custom input added' | 'Forecast custom input deleted' | 'Forecast custom input updated' | 'Forecast settings updated' | 'Funds activated from reissued virtual card' | 'Generated renewal brief for contract' | 'HRIS integration setting updated' | 'Identity locked' | 'Identity unlocked' | 'Impersonation upgraded to read-write' | 'Initiated digital wallet provisioning (audit)' | 'International payment initiated' | 'Investment Account closed' | 'Investment Account opened' | 'Investment Account renamed' | 'Investment Account terms accepted' | 'Investment Account updated' | 'Ironclad workflow updated' | 'Issued funds' | 'Item receipt accounting sync' | 'Large transfer initiated' | 'Linked funds to spend program' | 'Locked access to funds' | 'Locked card' | 'Managed portfolio transfer updated' | 'Manager updated' | 'Mark as accidental' | 'Mass payout initiated' | 'Matched purchase order to transaction' | 'Matched transaction to purchase order' | 'Memo updated' | 'Merged vendors' | 'Name updated hris' | 'Name updated' | 'New virtual card issued for currency migration' | 'Notification sent due to change order request modification' | 'Notification sent due to purchase order request modification' | 'Passkey created' | 'Passkey deleted' | 'Password reset required' | 'Password reset user' | 'Password updated user' | 'Payback cancelled' | 'Payback payment failed' | 'Payback payment manually paid' | 'Payback payment retried' | 'Payback payment succeeded' | 'Payback request approved by user' | 'Payback request cancelled by manager' | 'Payback request rejected by user' | 'Payback requested by manager' | 'Payback triggered by user' | 'Payee linked to accounting' | 'Payment approval overridden' | 'Payment run action' | 'Payment run updated' | 'Payment to new counterparty' | 'Payment updated' | 'Phone updated' | 'Points exchange redeemed' | 'Policy agent suggestion feedback submitted' | 'Post spend approval policy updated' | 'Procurement unmatched purchase order from transaction' | 'Procurement unmatched transaction from purchase order' | 'Procurement agent run completed' | 'Procurement change request approval policy updated' | 'Procurement send global form' | 'Procurement submit global form response' | 'Procurement vendor onboarding submitted' | 'Procurement vendor onboarding triggered' | 'Promoted member to co-owner' | 'Purchase order accounting sync created vendor' | 'Purchase order accounting sync failed' | 'Purchase order accounting sync success' | 'Question created' | 'Question deleted' | 'Question updated' | 'RFX clarification answered' | 'RFX clarification question submitted' | 'RFX close date changed' | 'RFX closed' | 'RFX collaborator added' | 'RFX collaborator removed' | 'RFX created' | 'RFX graded' | 'RFX publish approval rejected' | 'RFX published' | 'RFX response deadline changed' | 'RFX response redacted' | 'RFX response submitted' | 'RFX returned to draft' | 'RFX submitted for publish approval' | 'RFX vendor accepted' | 'RFX vendor added' | 'RFX vendor contact changed' | 'RFX vendor declined' | 'RFX vendor removed' | 'Receipt created' | 'Receipt deleted' | 'Receipt downloaded for transfer' | 'Receipt matched' | 'Refund cleared' | 'Refund paid' | 'Reimbursement bank account updated' | 'Reimbursement field changed' | 'Reimbursement from user' | 'Reimbursement policy agent suggestion feedback submitted' | 'Reimbursement submitted' | 'Reimbursement to user' | 'Reimbursements disabled' | 'Reimbursements enabled' | 'Reissued card' | 'Rejected card edit request' | 'Rejected funds edit request' | 'Rejected new card request' | 'Rejected procurement change request' | 'Rejected request for new funds' | 'Reminded to approve items' | 'Reminded to upload missing items' | 'Removed user from funds' | 'Request revision' | 'Requested an edit to these funds' | 'Requested new card' | 'Requested new funds' | 'Resolved by ramp' | 'Review needed' | 'Reviewed by ramp' | 'Role updated' | 'SFTP Authentication Failed' | 'SFTP Authentication IP and Username Matched' | 'SFTP Configuration Changed' | 'SaaS fee redeemed' | 'Separation of duties disabled' | 'Separation of duties enabled' | 'Set member limit on shared fund' | 'Shortfall coverage updated' | 'Sourcing event created' | 'Sourcing event status changed' | 'Spend allocation change request approval policy updated' | 'Spend approved' | 'Spend outcome recorded' | 'Spend rejected' | 'Spend request approval policy updated' | 'Status updated' | 'Strict MFA setting updated' | 'Submitted procurement change request' | 'Tango gift card redeemed' | 'Temporarily unlocked access to funds' | 'Terminated card' | 'Terminated funds' | 'Test' | 'Third party risk management vendor review updated' | 'This contract was combined with another contract' | 'Ticket assignee updated' | 'Ticket status updated' | 'Totp authenticator created' | 'Totp authenticator deleted' | 'Totp authenticator updated' | 'Transaction approval policy updated' | 'Transaction cleared' | 'Transaction entity changed' | 'Transaction missing item reminder event' | 'Transaction paid' | 'Transaction receipt updated' | 'Transaction submission policy exemption event' | 'Transfer created' | 'Transfer initiated' | 'Transferred ownership of funds' | 'Travel policy selection updated' | 'Trip changed' | 'Undid marking transaction as accidental' | 'Unlocked access to funds' | 'Unlocked card temporarily' | 'Unlocked card' | 'Unmark as accidental' | 'Updated card program' | 'Updated card' | 'Updated funds' | 'Updated spend program' | 'User accepted invite' | 'User assigned by external firm' | 'User assigned through external firm merge' | 'User created' | 'User deactivated' | 'User deleted' | 'User invited' | 'User locked' | 'User logged out of all sessions' | 'User logged out' | 'User login' | 'User previewed' | 'User reactivated' | 'User undeleted' | 'User unlocked' | 'Vendor Network updates enabled' | 'Vendor added to group' | 'Vendor awarded' | 'Vendor credit action' | 'Vendor hold released' | 'Vendor imported from erp' | 'Vendor management vendor added to managed list' | 'Vendor management vendor removed from managed list' | 'Vendor management agreement deleted document' | 'Vendor management agreement deleted' | 'Vendor management agreement linked document' | 'Vendor management agreement linked purchase order' | 'Vendor management agreement notification type switched' | 'Vendor management agreement status changed' | 'Vendor management agreement unlinked document' | 'Vendor management agreement unlinked purchase order' | 'Vendor management agreement uploaded document' | 'Vendor management edited agreement field' | 'Vendor management expansion request status changed' | 'Vendor management vendor network invite sent' | 'Vendor payment approval policy updated' | 'Vendor placed on hold' | 'Vendor profile access created' | 'Vendor profile access denied' | 'Vendor profile access edited' | 'Vendor profile access email sent' | 'Vendor profile access requested' | 'Vendor profile access revoked' | 'Vendor profile all documents downloaded' | 'Vendor profile document downloaded' | 'Vendor removed from group' | 'Vendor sync failure' | 'Viewed sensitive card details' | 'Violation from manager' | 'Violation from rule' | 'Violation from user' | 'Virtual card reissued' | 'Voided check downloaded' | 'WBX approval approved' | 'WBX approval attachment added' | 'WBX approval attachment removed' | 'WBX approval fields updated' | 'WBX approval opened' | 'WBX approval rejected' | 'WBX approver approved' | 'WBX approver rejected' | 'WBX policy created' | 'WBX policy deleted' | 'WBX policy draft discarded' | 'WBX policy draft published' | 'WBX policy draft started' | 'WBX policy renamed' | 'WBX policy workflow generated from draft' | 'WBX request admin approved entire workflow' | 'WBX request archived' | 'WBX request attachment added' | 'WBX request attachment removed' | 'WBX request created' | 'WBX request deleted' | 'WBX request fields updated' | 'WBX request submitted' | 'Wallet redeemed' | 'Workflow restarted due to purchase order request modification' id: string primary_reference: { id: string label: string resource_name: 'Approvals' | 'Bill payment' | 'Bill template' | 'Card' | 'Cash Manager recommendation' | 'Forecast custom input' | 'Fund request' | 'Investment account' | 'Managed portfolio transfer' | 'Payment run' | 'Reimbursement' | 'SFTP Configurations' | 'Separation of duties' | 'Spend allocation' | 'Spend event' | 'Transaction' | 'Travel (Booking request)' | 'Travel (Trip)' | 'Treasury account' | 'User' | 'Vendor / Merchant' | 'WBX Policy' | 'WBX Request' | 'Wallet automation policy' | 'Wallet transfer' | 'Workflow (Base)' | 'Workflow' url: string } user_details: { actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' id: string } }[][] page: { next: string } } --- title: List bank accounts path: /developer/v1/bank-accounts description: No description request: none response: { data: { account_name: string account_number_last_four: string financial_institution_name: string id: string }[] page: { next: string } } --- title: Get bank account details path: /developer/v1/bank-accounts/{bank_account_id} description: No description request: none response: { account_name: string account_number_last_four: string financial_institution_name: string id: string } --- title: List bills path: /developer/v1/bills description: No description request: none response: { data: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' archived_at: string /* date */ bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ draft_bill_id: string due_at: string /* date */ enable_accounting_sync?: boolean entity_id: string fx_conversion_rate: string id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] invoice_number?: string invoice_urls: string[] issued_at: string /* date */ item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } customer_friendly_payment_id: string details: ApiCardPaymentDetailsResource | ApiManualPaymentDetailsResource | ApiVendorPaymentDetailsResource effective_date: string /* date */ id: string payment_date: string /* date */ payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' trace_id: { descriptor?: string trace_id?: string } } posting_date?: string /* date */ purchase_order_id?: string remote_id?: string status: 'OPEN' | 'PAID' status_summary: 'APPROVAL_PENDING' | 'APPROVAL_REJECTED' | 'ARCHIVED' | 'AWAITING_RELEASE' | 'BLOCKED' | 'HELD_BY_PROVIDER' | 'ON_HOLD' | 'PAYMENT_COMPLETED' | 'PAYMENT_DETAILS_MISSING' | 'PAYMENT_ERROR' | 'PAYMENT_NOT_INSTRUCTED' | 'PAYMENT_PROCESSING' | 'PAYMENT_READY' | 'PAYMENT_SCHEDULED' | 'PENDING_VENDOR_APPROVAL' | 'WAITING_FOR_TRANSACTION_MATCH' | 'WAITING_FOR_VENDOR' sync_status: 'BILL_AND_PAYMENT_SYNCED' | 'BILL_SYNCED' | 'NOT_SYNCED' vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } vendor_contact_id: string vendor_memo?: string }[] page: { next: string } } --- title: Create a bill path: /developer/v1/bills description: Batch payments cannot be created in the API. request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] attachment_id?: string due_at: string /* date */ enable_accounting_sync?: boolean entity_id: string inventory_line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] memo?: string quantity: string | number unit_price: string | number }[] invoice_currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' invoice_number: string issued_at: string /* date */ line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] amount: string | number memo?: string }[] memo?: string payment_date?: string /* date */ payment_details?: { is_same_day?: boolean payment_arrival_date: string /* date */ source_bank_account_id: string vendor_account_id: string } | { is_same_day?: boolean payment_arrival_date: string /* date */ source_bank_account_id: string } | { spend_limit_id: string transaction_id?: string } | { manual_payment_method: 'CASH' | 'CHECK' | 'CROSS_BORDER_PAYMENT' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE_TRANSFER' | 'NON_RAMP_CREDIT_CARD' | 'OTHER' | 'PAID_IN_ERP' payment_date: string /* date */ } payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ purchase_order_ids?: string[] remote_id?: string use_default_payment_method?: boolean use_default_vendor_contact?: boolean vendor_contact_id?: string vendor_id: string vendor_memo?: string } response: none --- title: List draft bills path: /developer/v1/bills/drafts description: No description request: none response: { data: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ due_at: string /* date */ entity_id: string id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] invoice_number: string invoice_urls: string[] issued_at: string /* date */ line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string }[] memo: string posting_date: string /* date */ remote_id: string status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } vendor_memo: string }[] page: { next: string } } --- title: Create a draft bill path: /developer/v1/bills/drafts description: No description request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] due_at?: string /* date */ enable_accounting_sync?: boolean entity_id?: string inventory_line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] memo?: string purchase_order_line_item_id?: string quantity: string | number unit_price: string | number }[] invoice_currency?: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' invoice_number?: string issued_at?: string /* date */ line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] amount: string | number memo?: string purchase_order_line_item_id?: string }[] memo?: string payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ purchase_order_ids?: string[] remote_id?: string use_default_payment_method?: boolean vendor_contact_id?: string vendor_id: string } response: none --- title: Fetch a draft bill path: /developer/v1/bills/drafts/{draft_bill_id} description: No description request: none response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ due_at: string /* date */ entity_id: string id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] invoice_number: string invoice_urls: string[] issued_at: string /* date */ line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string }[] memo: string posting_date: string /* date */ remote_id: string status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } vendor_memo: string } --- title: Update a draft bill path: /developer/v1/bills/drafts/{draft_bill_id} description: No description request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] due_at?: string /* date */ enable_accounting_sync?: boolean entity_id?: string inventory_line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] memo?: string purchase_order_line_item_id?: string quantity: string | number unit_price: string | number }[] invoice_currency?: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' invoice_number?: string issued_at?: string /* date */ line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] amount: string | number memo?: string purchase_order_line_item_id?: string }[] memo?: string payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ purchase_order_ids?: string[] remote_id?: string use_default_payment_method?: boolean vendor_contact_id?: string vendor_id?: string } response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ due_at: string /* date */ entity_id: string id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] invoice_number: string invoice_urls: string[] issued_at: string /* date */ line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string }[] memo: string posting_date: string /* date */ remote_id: string status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } vendor_memo: string } --- title: Upload a file attachment to an existing draft bill path: /developer/v1/bills/drafts/{draft_bill_id}/attachments description: Upload a file as an attachment to a draft bill. INVOICE type attachments cannot be uploaded if one already exists on the draft bill. This endpoint accepts the [multipart/form-data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) format. Include the file as a part named 'file' with `Content-Disposition: attachment`. Include the attachment_type as a form field. request: none response: none --- title: Archive a bill path: /developer/v1/bills/{bill_id} description: This is a destructive action. Associated inflight payments will be cancelled if possible or any attached one-time-card will be terminated. Paid bills and bills belonging to a batch payment cannot be deleted. request: none response: none --- title: Fetch a bill path: /developer/v1/bills/{bill_id} description: No description request: none response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' archived_at: string /* date */ bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ draft_bill_id: string due_at: string /* date */ enable_accounting_sync?: boolean entity_id: string fx_conversion_rate: string id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] invoice_number?: string invoice_urls: string[] issued_at: string /* date */ item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } customer_friendly_payment_id: string details: { spend_limit_id?: string transaction_ids?: string[] } | { manual_payment_method: 'CASH' | 'CHECK' | 'CROSS_BORDER_PAYMENT' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE_TRANSFER' | 'NON_RAMP_CREDIT_CARD' | 'OTHER' | 'PAID_IN_ERP' } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' is_same_day: boolean source_bank_account_id: string vendor_account_id: string } effective_date: string /* date */ id: string payment_date: string /* date */ payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' trace_id: { descriptor?: string trace_id?: string } } posting_date?: string /* date */ purchase_order_id?: string remote_id?: string status: 'OPEN' | 'PAID' status_summary: 'APPROVAL_PENDING' | 'APPROVAL_REJECTED' | 'ARCHIVED' | 'AWAITING_RELEASE' | 'BLOCKED' | 'HELD_BY_PROVIDER' | 'ON_HOLD' | 'PAYMENT_COMPLETED' | 'PAYMENT_DETAILS_MISSING' | 'PAYMENT_ERROR' | 'PAYMENT_NOT_INSTRUCTED' | 'PAYMENT_PROCESSING' | 'PAYMENT_READY' | 'PAYMENT_SCHEDULED' | 'PENDING_VENDOR_APPROVAL' | 'WAITING_FOR_TRANSACTION_MATCH' | 'WAITING_FOR_VENDOR' sync_status: 'BILL_AND_PAYMENT_SYNCED' | 'BILL_SYNCED' | 'NOT_SYNCED' vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } vendor_contact_id: string vendor_memo?: string } --- title: Update a bill path: /developer/v1/bills/{bill_id} description: Only approved bills can be updated. request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] due_at?: string /* date */ entity_id?: string inventory_line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] memo?: string purchase_order_line_item_id?: string quantity: string | number unit_price: string | number }[] invoice_number?: string issued_at?: string /* date */ line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] amount: string | number memo?: string purchase_order_line_item_id?: string }[] memo?: string payment_date?: string /* date */ payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ purchase_order_ids?: string[] remote_id?: string vendor_contact_id?: string vendor_id?: string vendor_memo?: string } response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' archived_at: string /* date */ bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ draft_bill_id: string due_at: string /* date */ enable_accounting_sync?: boolean entity_id: string fx_conversion_rate: string id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] invoice_number?: string invoice_urls: string[] issued_at: string /* date */ item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } customer_friendly_payment_id: string details: { spend_limit_id?: string transaction_ids?: string[] } | { manual_payment_method: 'CASH' | 'CHECK' | 'CROSS_BORDER_PAYMENT' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE_TRANSFER' | 'NON_RAMP_CREDIT_CARD' | 'OTHER' | 'PAID_IN_ERP' } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' is_same_day: boolean source_bank_account_id: string vendor_account_id: string } effective_date: string /* date */ id: string payment_date: string /* date */ payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' trace_id: { descriptor?: string trace_id?: string } } posting_date?: string /* date */ purchase_order_id?: string remote_id?: string status: 'OPEN' | 'PAID' status_summary: 'APPROVAL_PENDING' | 'APPROVAL_REJECTED' | 'ARCHIVED' | 'AWAITING_RELEASE' | 'BLOCKED' | 'HELD_BY_PROVIDER' | 'ON_HOLD' | 'PAYMENT_COMPLETED' | 'PAYMENT_DETAILS_MISSING' | 'PAYMENT_ERROR' | 'PAYMENT_NOT_INSTRUCTED' | 'PAYMENT_PROCESSING' | 'PAYMENT_READY' | 'PAYMENT_SCHEDULED' | 'PENDING_VENDOR_APPROVAL' | 'WAITING_FOR_TRANSACTION_MATCH' | 'WAITING_FOR_VENDOR' sync_status: 'BILL_AND_PAYMENT_SYNCED' | 'BILL_SYNCED' | 'NOT_SYNCED' vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } vendor_contact_id: string vendor_memo?: string } --- title: Upload a file attachment to an existing bill path: /developer/v1/bills/{bill_id}/attachments description: Upload a file as an attachment to a bill. INVOICE type attachments cannot be uploaded if one already exists on the bill. This endpoint accepts the [multipart/form-data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) format. Include the file as a part named 'file' with `Content-Disposition: attachment`. Include the attachment_type as a form field. request: none response: none --- title: Upload a document for a blank canvas workflow step path: /developer/v1/blank-canvas-approvals/documents description: This endpoint accepts the [multipart/form-data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) format. Include the document as a part with `Content-Disposition: attachment`. Include metadata as parts with `Content-Disposition: form-data`. request: none response: none --- title: Approve or reject a blank canvas workflow step path: /developer/v1/blank-canvas-approvals/{approval_trigger_instance_id} description: No description request: { action: 'approve' | 'reject' } response: { message: string } --- title: Update metadata for a blank canvas external approval request path: /developer/v1/blank-canvas-approvals/{approval_trigger_instance_id}/metadata description: No description request: { recipients?: { email: string name: string }[] status?: string url?: string } response: { approval_trigger_instance_id: string recipients?: { email: string name: string }[] status?: string url?: string } --- title: Fetch the company information path: /developer/v1/business description: No description request: none response: { active?: boolean billing_address?: Record business_name_legal?: string business_name_on_card?: string created_time?: string /* date */ enforce_sso?: boolean id?: string initial_approved_limit?: number is_integrated_with_slack?: boolean is_reimbursements_enabled: boolean limit_locked?: boolean phone?: string website?: string } --- title: Fetch the company balance information path: /developer/v1/business/balance description: No description request: none response: { available_card_limit?: number available_card_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } available_flex_limit?: number available_flex_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } balance_including_pending?: number balance_including_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } card_balance_excluding_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } card_balance_including_pending?: number card_balance_including_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } card_limit?: number card_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } flex_balance?: number flex_balance_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } flex_limit?: number flex_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } float_balance_excluding_pending?: number float_balance_excluding_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } global_limit?: number global_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } max_balance?: number max_balance_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } next_billing_date?: string prev_billing_date?: string statement_balance?: number statement_balance_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } } --- title: List cards path: /developer/v1/cards description: No description request: none response: { data: { card_program_id: string cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string entity_id?: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: CardPersonalizationNameLine name_line_2?: CardPersonalizationNameLine } } cardholder_uuid?: string fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string recipient_address?: { address1: string address2?: string city: string country: string first_name: string last_name: string phone?: string postal_code: string state?: string } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' return_address?: CardShippingAddress } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } has_program_overridden: boolean id?: string is_physical?: boolean last_four: string spending_restrictions: { amount?: number auto_lock_date: string /* date */ blocked_categories?: number[] categories?: number[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' suspended?: boolean transaction_amount_limit?: number } state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' }[] page: { next: string } } --- title: Create a physical card path: /developer/v1/cards/deferred/physical description: Call this endpoint to create an async task to request for new physical card. request: { display_name?: string entity_id?: string fulfillment?: { card_personalization?: { text?: { name_line_1?: { value?: string } name_line_2?: { value?: string } } } cardholder_uuid?: string shipping?: { method?: string recipient_address?: { address1: string address2?: string city: string country: string first_name: string last_name: string phone?: string postal_code: string state?: string } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' return_address?: { address1: string address2?: string city: string country: string first_name: string last_name: string phone?: string postal_code: string state?: string } } } idempotency_key: string is_temporary?: boolean spending_restrictions?: { amount: string | number blocked_mcc_codes?: string[] card_accounting_rules?: { tracking_category_id: string tracking_category_option_id: string tracking_category_option_remote_name: string }[] categories?: number[] categories_blacklist?: number[] categories_whitelist?: number[] currency?: string interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' lock_date?: string /* date */ policy_id?: string transaction_amount_limit?: string | number vendor_blacklist?: string[] vendor_whitelist?: string[] } user_id: string } response: { id: string } --- title: Fetch deferred task status path: /developer/v1/cards/deferred/status/{task_id} description: No description request: none response: { context?: { acting_user_id?: string card_id?: string } data?: { card_id?: string error?: string } id?: string status?: string } --- title: Create a virtual card path: /developer/v1/cards/deferred/virtual description: Call this endpoint to create an async task to request for new virtual card. request: { display_name?: string entity_id?: string idempotency_key: string is_temporary?: boolean spending_restrictions?: { amount: string | number blocked_mcc_codes?: string[] card_accounting_rules?: { tracking_category_id: string tracking_category_option_id: string tracking_category_option_remote_name: string }[] categories?: number[] categories_blacklist?: number[] categories_whitelist?: number[] currency?: string interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' lock_date?: string /* date */ policy_id?: string transaction_amount_limit?: string | number vendor_blacklist?: string[] vendor_whitelist?: string[] } user_id: string } response: { id: string } --- title: Fetch a card path: /developer/v1/cards/{card_id} description: No description request: none response: { card_program_id: string cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string entity_id?: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: { value?: string } name_line_2?: { value?: string } } } cardholder_uuid?: string fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string recipient_address?: { address1: string address2?: string city: string country: string first_name: string last_name: string phone?: string postal_code: string state?: string } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' return_address?: { address1: string address2?: string city: string country: string first_name: string last_name: string phone?: string postal_code: string state?: string } } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } has_program_overridden: boolean id?: string is_physical?: boolean last_four: string spending_restrictions: { amount?: number auto_lock_date: string /* date */ blocked_categories?: number[] categories?: number[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' suspended?: boolean transaction_amount_limit?: number } state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' } --- title: Update a card path: /developer/v1/cards/{card_id} description: This endpoint allow you update the owner, display name, and spend restrictions of a card. request: { display_name?: string entity_id?: string has_notifications_enabled?: boolean new_user_id?: string spending_restrictions?: { amount?: string | number blocked_mcc_codes?: string[] categories?: number[] categories_blacklist?: number[] categories_whitelist?: number[] currency?: string interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' lock_date?: string /* date */ policy_id?: string transaction_amount_limit?: string | number vendor_blacklist?: string[] vendor_whitelist?: string[] } } response: none --- title: Suspend a card path: /developer/v1/cards/{card_id}/deferred/suspension description: Call this endpoint to create an async task to suspend a card so that it is locked from use. The suspension is revertable. request: { idempotency_key: string } response: { id: string } --- title: Terminate a card path: /developer/v1/cards/{card_id}/deferred/termination description: Call this endpoint to create an async task to terminate a card permanently. Please note that this action is irreversible. request: { idempotency_key: string } response: { id: string } --- title: Unlock a card path: /developer/v1/cards/{card_id}/deferred/unsuspension description: Call this endpoint to create an async task to remove a card's suspension so that it may be used again. request: { idempotency_key: string } response: { id: string } --- title: List cashback payments path: /developer/v1/cashbacks description: No description request: none response: { data: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } created_at?: string /* date */ entity_id?: string id?: string sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' }[] page: { next: string } } --- title: Fetch a cashback payment path: /developer/v1/cashbacks/{cashback_id} description: No description request: none response: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } created_at?: string /* date */ entity_id?: string id?: string sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' } --- title: List comments on an object's discussion thread path: /developer/v1/comments/{object_type}/{object_id} description: Requires `{resource_name}:read` scope and may require additional access. See `object_type` description for more information. request: none response: { data: { created_at: string /* date */ id: string message: string user_id: string }[] page: { next: string } } --- title: Create a comment on an object's discussion thread path: /developer/v1/comments/{object_type}/{object_id} description: Requires `{resource_name}:write` scope and may require additional access. See `object_type` description for more information. request: { mention_user_ids?: string[] message: string message_format?: 'MARKDOWN' | 'PLAIN_TEXT' } response: none --- title: Fetch a custom form collection response by ID path: /developer/v1/custom-form/collections/responses/{custom_form_collection_response_id} description: No description request: none response: { custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: CustomFormFieldResponseWrapperDumpSchemaV2[] label: string }[] label: string } } id: string } --- title: Create Custom Table path: /developer/v1/custom-records/configure/custom-tables description: No description request: { table_label: string table_name: string type?: 'custom_table' } response: none --- title: Create Custom Table column path: /developer/v1/custom-records/configure/custom-tables/{custom_table_name}/columns description: No description request: { column_type_name: 'boolean' | 'number' | 'text' label: string name: string } | { column_type_name: 'custom_reference' | 'native_reference' label: string name: string reference_args: { cardinality: 'many_to_many' | 'many_to_one' corresponding_column_label?: string corresponding_column_name?: string foreign_table: { table_name: string type?: 'custom_table' } | { table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type?: 'native_table' } } } response: { column_id: string } --- title: Change the API name of a Custom Table's Column path: /developer/v1/custom-records/configure/custom-tables/{custom_table_name}/columns/{column_name} description: No description request: { new_name: string } response: none --- title: Extend Native Ramp table path: /developer/v1/custom-records/configure/native-tables description: No description request: { table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type?: 'native_table' } response: none --- title: Create Native Ramp table field path: /developer/v1/custom-records/configure/native-tables/{native_table_name}/columns description: No description request: { column_type_name: 'boolean' | 'number' | 'text' label: string name: string } | { column_type_name: 'custom_reference' | 'native_reference' label: string name: string reference_args: { cardinality: 'many_to_many' | 'many_to_one' corresponding_column_label?: string corresponding_column_name?: string foreign_table: { table_name: string type?: 'custom_table' } | { table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type?: 'native_table' } } } response: { column_id: string } --- title: Change the API name of a Native Table's Custom Record Column path: /developer/v1/custom-records/configure/native-tables/{native_table_name}/columns/{column_name} description: No description request: { new_name: string } response: none --- title: List Custom Tables path: /developer/v1/custom-records/custom-tables description: No description request: none response: { data: { table_label: string table_name: string type: 'custom_table' }[] page: { next: string } } --- title: List Custom Table columns path: /developer/v1/custom-records/custom-tables/{custom_table_name}/columns description: No description request: none response: { data: { allows_writes: boolean display_name: string id: string name: string type: { type: 'boolean' } | { cardinality: 'many_to_many' | 'many_to_one' | 'one_to_many' | 'one_to_one' corresponding_column_id: string table_display_name: string table_id: string table_name: string type: 'custom_reference' } | { display_type: 'date' type: 'datetime' } | { cardinality: 'many_to_many' | 'many_to_one' | 'one_to_many' | 'one_to_one' corresponding_column_id: string table_id: string table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' tracking_category: { accounting_provider_is_connected: boolean display_name: string id: number is_active: boolean uuid: string } type: 'native_reference' } | { display_type: 'currency' | 'number' | 'percentage' type: 'number' } | { display_type: 'email' | 'numeric_id' | 'paragraph' | 'phone' | 'plain_text' | 'url' type: 'text' } }[] page: { next: string } } --- title: Delete rows from a Custom Table path: /developer/v1/custom-records/custom-tables/{custom_table_name}/rows description: No description request: { data: { external_key: string }[] } response: { metadata: { deleted: number } } --- title: List Custom Table rows path: /developer/v1/custom-records/custom-tables/{custom_table_name}/rows description: No description request: none response: { data: { cells: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: CustomTableRowForDisplay[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: NativeTableRowForDisplay[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] display_name: string external_key: string id: string }[] page: { next: string } } --- title: Set values for rows of a Custom Table path: /developer/v1/custom-records/custom-tables/{custom_table_name}/rows description: No description request: { data: { cells: { contents: { column_name: string value: string } | string /* date */ | boolean | number | string name: string }[] external_key: string }[] } response: { metadata: { inserted: number updated: number } } --- title: Change the external key of a Custom Table row path: /developer/v1/custom-records/custom-tables/{custom_table_name}/rows/{row_id} description: No description request: { new_external_key: string } response: none --- title: Append cells to a Custom Table path: /developer/v1/custom-records/custom-tables/{table_name}/rows/-/append description: No description request: { data: { cells: { contents: { column_name: string value: string } | string /* date */ | boolean | number | string name: string }[] external_key: string }[] } response: { metadata: { inserted: number } } --- title: Remove cells from a Custom Table path: /developer/v1/custom-records/custom-tables/{table_name}/rows/-/remove description: No description request: { data: { cells: { contents: { column_name: string value: string } | string /* date */ | boolean | number | string name: string }[] external_key: string }[] } response: { metadata: { deleted: number } } --- title: List all Matrix tables for the business path: /developer/v1/custom-records/matrix-tables description: No description request: none response: { data: { id: string input_columns: { display_name: string id: string name: string type: { column_type?: 'native_reference' native_table: DeveloperApiNativeTableReference } | { column_type?: 'number' } }[] label: string name: string result_columns: { display_name: string id: string name: string type: { cardinality: PydanticCardinalityEnum column_type?: 'native_reference' native_table: DeveloperApiResultNativeTableReference } }[] }[] } --- title: Create a Matrix table path: /developer/v1/custom-records/matrix-tables description: Matrix tables are special-purpose lookup tables where unique combinations of input values map to result values. request: { input_columns: { column_type: { accounting_field_ramp_id?: string table_name: 'accounting_field_options' | 'business_entities' | 'departments' | 'locations' | 'users' type?: 'native_table' } | { type?: 'number' } label: string name?: string }[] label: string name?: string result_columns: { cardinality: 'many_to_many' | 'many_to_one' label: string name?: string native_table: { accounting_field_ramp_id?: string table_name: 'accounting_field_options' | 'users' type?: 'native_table' } }[] } response: none --- title: Add a result column to an existing Matrix table path: /developer/v1/custom-records/matrix-tables/{table_name}/columns description: Allows adding result columns to already-created matrix tables without modifying the input columns. Only result columns (users and accounting_field_options) can be added. Input columns cannot be added after table creation. request: { cardinality: 'many_to_many' | 'many_to_one' label: string name?: string native_table: { accounting_field_ramp_id?: string table_name: 'accounting_field_options' | 'users' type?: 'native_table' } } response: none --- title: Change the API name of a Matrix table column (input or result) path: /developer/v1/custom-records/matrix-tables/{table_name}/columns/{column_name} description: This changes the internal name used in API calls while preserving the human-readable label. Both input and result columns can be renamed. request: { new_name: string } response: none --- title: List Matrix table rows path: /developer/v1/custom-records/matrix-tables/{table_name}/list-rows description: Returns rows with inputs and results separated. Inputs are always complete (all input columns), results are sparse (only set values). request: { external_keys?: string[] filters?: { column_name: string one_of: string[] }[] page_size?: number start?: string } response: { data: { id: string inputs: { column_name: string display_name: string identifier?: { column_name: string value: string } | { value: number } }[] results: { column_name: string display_name: string identifier: { column_name: string value: string } }[] }[] page: { next: string } total_count: number } --- title: Change the API name of a Matrix table path: /developer/v1/custom-records/matrix-tables/{table_name}/rename description: No description request: { new_name: string } response: none --- title: Upsert Matrix table rows path: /developer/v1/custom-records/matrix-tables/{table_name}/rows description: Creates new rows or updates existing rows based on input values. Input values define row identity (via external_key). Result values are mutable and can be partially updated. request: { data: { inputs: { column_name: string identifier?: { column_name: string value: string } number_identifier?: number | string }[] results: { column_name: string identifier: { column_name: string value: string } }[] }[] } response: { metadata: { inserted: number updated: number } } --- title: Append cells to Matrix table rows path: /developer/v1/custom-records/matrix-tables/{table_name}/rows/-/append description: Adds values to many-to-many result columns without replacing existing values. Only works on many-to-many result columns. Set ignore_duplicates=true to skip existing duplicate cells instead of erroring. request: { data: { inputs: { column_name: string identifier?: { column_name: string value: string } number_identifier?: number | string }[] results: { column_name: string identifier: { column_name: string value: string } }[] }[] ignore_duplicates?: boolean } response: { metadata: { cells_appended: number } } --- title: Remove cells from Matrix table rows path: /developer/v1/custom-records/matrix-tables/{table_name}/rows/-/remove description: Removes specific values from many-to-many result columns without affecting other values. request: { data: { inputs: { column_name: string identifier?: { column_name: string value: string } number_identifier?: number | string }[] results: { column_name: string identifier: { column_name: string value: string } }[] }[] } response: { metadata: { cells_removed: number } } --- title: Delete a single Matrix table row by ID path: /developer/v1/custom-records/matrix-tables/{table_name}/rows/{row_id} description: Deletes the matrix row with the specified ID from the matrix table. request: none response: none --- title: List Native Ramp tables path: /developer/v1/custom-records/native-tables description: No description request: none response: { data: { table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' }[] page: { next: string } } --- title: List Custom Columns for a Native Ramp table path: /developer/v1/custom-records/native-tables/{native_table_name}/columns description: No description request: none response: { data: { allows_writes: boolean display_name: string id: string name: string type: { type: 'boolean' } | { cardinality: 'many_to_many' | 'many_to_one' | 'one_to_many' | 'one_to_one' corresponding_column_id: string table_display_name: string table_id: string table_name: string type: 'custom_reference' } | { display_type: 'date' type: 'datetime' } | { cardinality: 'many_to_many' | 'many_to_one' | 'one_to_many' | 'one_to_one' corresponding_column_id: string table_id: string table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' tracking_category: { accounting_provider_is_connected: boolean display_name: string id: number is_active: boolean uuid: string } type: 'native_reference' } | { display_type: 'currency' | 'number' | 'percentage' type: 'number' } | { display_type: 'email' | 'numeric_id' | 'paragraph' | 'phone' | 'plain_text' | 'url' type: 'text' } }[] page: { next: string } } --- title: List Custom Column values for rows of a Native Ramp table path: /developer/v1/custom-records/native-tables/{native_table_name}/rows description: No description request: none response: { data: { cells: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] display_name: string external_key: string id: string }[] page: { next: string } } --- title: Set values for rows of a Native Ramp table path: /developer/v1/custom-records/native-tables/{native_table_name}/rows description: No description request: { data: { cells: { contents: { column_name: string value: string } | string /* date */ | boolean | number | string name: string }[] row: { column_name: string value: string } }[] } response: { metadata: { inserted: number updated: number } } --- title: Append cells to a Native Ramp table path: /developer/v1/custom-records/native-tables/{native_table_name}/rows/-/append description: No description request: { data: { cells: { contents: { column_name: string value: string } | string /* date */ | boolean | number | string name: string }[] row: { column_name: string value: string } }[] } response: { metadata: { inserted: number } } --- title: Remove cells from a Native Ramp table path: /developer/v1/custom-records/native-tables/{native_table_name}/rows/-/remove description: No description request: { data: { cells: { contents: { column_name: string value: string } | string /* date */ | boolean | number | string name: string }[] row: { column_name: string value: string } }[] } response: { metadata: { deleted: number } } --- title: List departments path: /developer/v1/departments description: No description request: none response: { data: { id: string name: string }[] page: { next: string } } --- title: Create a department path: /developer/v1/departments description: No description request: { name: string } response: none --- title: Fetch a department path: /developer/v1/departments/{department_id} description: No description request: none response: { id: string name: string } --- title: Update a department path: /developer/v1/departments/{department_id} description: No description request: { name: string } response: { id: string name: string } --- title: Create an embed init token for a card path: /developer/v1/embedded/cards/{card_id}/embed description: The specified card must be activated and currently active request: { parent_origin: string } response: { embed_init_token: string } --- title: List business entities path: /developer/v1/entities description: No description request: none response: { data: { accounts: { bank_account_id: string classification: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' created_at: string /* date */ external_id: string external_name: string internal_id: string usage_type: 'ACCRUAL_AP_ACCOUNT' | 'ACCRUAL_LIABILITY_ACCOUNT' | 'AR_ACCOUNTS_RECEIVABLE_ACCOUNT' | 'AR_BAD_DEBT_ACCOUNT' | 'AR_CARD_FEES_ACCOUNT' | 'AR_CASH_ACCOUNT_DEFAULT' | 'AR_CHARGEBACK_CLEARING_ACCOUNT' | 'AR_INCOME_ACCOUNT_DEFAULT' | 'AR_REFUNDS_CLEARING_ACCOUNT' | 'AR_UNDEPOSITED_FUNDS_ACCOUNT' | 'BILL_PAY_ACCOUNTS_PAYABLE_ACCOUNT' | 'BILL_PAY_BANK_ACCOUNT' | 'BILL_PAY_FX_GAIN_LOSS_ACCOUNT' | 'BOOKKEEPING_AUTOMATION_BANK_ACCOUNT' | 'BOOKKEEPING_AUTOMATION_CLEARING_ACCOUNT' | 'BROKERAGE_ACCOUNT' | 'BROKERAGE_DIVIDEND_ACCOUNT' | 'CARD_LIABILITY_ACCOUNT' | 'CARD_TRANSACTION_BILLS_ACCOUNTS_PAYABLE_ACCOUNT' | 'CASHBACK_ACCOUNT' | 'CASH_ACCOUNT' | 'INTERCOMPANY_ACCOUNTS_PAYABLE_ACCOUNT' | 'INTERCOMPANY_ACCOUNTS_RECEIVABLE_ACCOUNT' | 'INTERCOMPANY_TRANSFER_CLEARING_ACCOUNT' | 'MANAGED_PORTFOLIO_CASH_ACCOUNT' | 'MANAGED_PORTFOLIO_INTEREST_INCOME_ACCOUNT' | 'MANAGED_PORTFOLIO_POSITION_ASSET_ACCOUNT' | 'MANAGED_PORTFOLIO_REALIZED_GAIN_LOSS_ACCOUNT' | 'MANAGED_PORTFOLIO_UNREALIZED_GAIN_LOSS_ACCOUNT' | 'REIMBURSEMENT_ACCOUNTS_PAYABLE_ACCOUNT' | 'REIMBURSEMENT_BANK_ACCOUNT' | 'TRANSFER_BANK_ACCOUNT' | 'UNDEPOSITED_FUNDS' | 'WALLET_ACCOUNT' | 'WALLET_BANK_ACCOUNT' | 'WALLET_YIELD_ACCOUNT' }[] connected_subsidiary: { external_id: string id: string name: string } currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' entity_name: string id: string is_primary: boolean location_ids: string[] payment_accounts: { account_name: string account_number_last_four: string currency: string id: string }[] }[] page: { next: string } } --- title: Get a business entity path: /developer/v1/entities/{entity_id} description: No description request: none response: { accounts: { bank_account_id: string classification: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' created_at: string /* date */ external_id: string external_name: string internal_id: string usage_type: 'ACCRUAL_AP_ACCOUNT' | 'ACCRUAL_LIABILITY_ACCOUNT' | 'AR_ACCOUNTS_RECEIVABLE_ACCOUNT' | 'AR_BAD_DEBT_ACCOUNT' | 'AR_CARD_FEES_ACCOUNT' | 'AR_CASH_ACCOUNT_DEFAULT' | 'AR_CHARGEBACK_CLEARING_ACCOUNT' | 'AR_INCOME_ACCOUNT_DEFAULT' | 'AR_REFUNDS_CLEARING_ACCOUNT' | 'AR_UNDEPOSITED_FUNDS_ACCOUNT' | 'BILL_PAY_ACCOUNTS_PAYABLE_ACCOUNT' | 'BILL_PAY_BANK_ACCOUNT' | 'BILL_PAY_FX_GAIN_LOSS_ACCOUNT' | 'BOOKKEEPING_AUTOMATION_BANK_ACCOUNT' | 'BOOKKEEPING_AUTOMATION_CLEARING_ACCOUNT' | 'BROKERAGE_ACCOUNT' | 'BROKERAGE_DIVIDEND_ACCOUNT' | 'CARD_LIABILITY_ACCOUNT' | 'CARD_TRANSACTION_BILLS_ACCOUNTS_PAYABLE_ACCOUNT' | 'CASHBACK_ACCOUNT' | 'CASH_ACCOUNT' | 'INTERCOMPANY_ACCOUNTS_PAYABLE_ACCOUNT' | 'INTERCOMPANY_ACCOUNTS_RECEIVABLE_ACCOUNT' | 'INTERCOMPANY_TRANSFER_CLEARING_ACCOUNT' | 'MANAGED_PORTFOLIO_CASH_ACCOUNT' | 'MANAGED_PORTFOLIO_INTEREST_INCOME_ACCOUNT' | 'MANAGED_PORTFOLIO_POSITION_ASSET_ACCOUNT' | 'MANAGED_PORTFOLIO_REALIZED_GAIN_LOSS_ACCOUNT' | 'MANAGED_PORTFOLIO_UNREALIZED_GAIN_LOSS_ACCOUNT' | 'REIMBURSEMENT_ACCOUNTS_PAYABLE_ACCOUNT' | 'REIMBURSEMENT_BANK_ACCOUNT' | 'TRANSFER_BANK_ACCOUNT' | 'UNDEPOSITED_FUNDS' | 'WALLET_ACCOUNT' | 'WALLET_BANK_ACCOUNT' | 'WALLET_YIELD_ACCOUNT' }[] connected_subsidiary: { external_id: string id: string name: string } currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' entity_name: string id: string is_primary: boolean location_ids: string[] payment_accounts: { account_name: string account_number_last_four: string currency: string id: string }[] } --- title: List item receipts path: /developer/v1/item-receipts description: No description request: none response: { data: { archived_at: string /* date */ created_at: string /* date */ documents: string[] id: string item_receipt_number: string line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string memo: string purchase_order_line_item_id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string purchase_order_id: string received_at: string /* date */ remote_id: string }[] page: { next: string } } --- title: Create an item receipt path: /developer/v1/item-receipts description: No description request: { item_receipt_line_items: { purchase_order_line_item_id: string unit_quantity?: number }[] item_receipt_number: string memo?: string purchase_order_id: string received_at: string /* date */ } response: none --- title: Delete an item receipt path: /developer/v1/item-receipts/{item_receipt_id} description: No description request: none response: none --- title: Fetch an item receipt path: /developer/v1/item-receipts/{item_receipt_id} description: No description request: none response: { archived_at: string /* date */ created_at: string /* date */ documents: string[] id: string item_receipt_number: string line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string memo: string purchase_order_line_item_id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string purchase_order_id: string received_at: string /* date */ remote_id: string } --- title: List limits path: /developer/v1/limits description: No description request: none response: { data: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] }[] page: { next: string } } --- title: Create a limit path: /developer/v1/limits/deferred description: Limit may either be created with spend program id (can provide display name and spending restrictions, cannot permitted spend types) or without (must provide display name, spending restrictions, and permitted spend types). request: { accounting_rules?: { field_id: string field_option_id: string }[] display_name?: string idempotency_key: string is_shareable?: boolean permitted_spend_types?: { primary_card_enabled: boolean reimbursements_enabled: boolean } spend_program_id?: string spending_restrictions?: { allowed_categories?: number[] allowed_vendors?: string[] blocked_categories?: number[] blocked_mcc_codes?: string[] blocked_vendors?: string[] interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code?: string } lock_date?: string /* date */ transaction_amount_limit?: { amount: number currency_code?: string } } user_id: string } response: { id: string } --- title: Fetch deferred task status path: /developer/v1/limits/deferred/status/{task_id} description: No description request: none response: { context: { acting_user_id: string spend_limit_id: string } data: { error: string spend_limit_id: string } id: string status: string } --- title: Fetch a limit path: /developer/v1/limits/{spend_limit_id} description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: { attachments?: RampDocumentSchema[] conditions: WorkflowsCondition description: string field: CustomFormFieldResponseDumpSchemaV2 field_id: string global_library_field_id?: string is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string }[] label: string }[] label: string } } display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: Update a limit path: /developer/v1/limits/{spend_limit_id} description: No description request: { accounting_rules?: { field_id: string field_option_id: string }[] display_name?: string existing_expense_policy_agent_exemption_application_rules?: 'APPLY_TO_ALL' | 'APPLY_TO_NONE' is_exempt_from_policy_agent?: boolean is_shareable?: boolean new_user_id?: string permitted_spend_types?: { primary_card_enabled: boolean reimbursements_enabled: boolean } spend_program_id?: string spending_restrictions?: { allowed_categories?: number[] allowed_vendors?: string[] blocked_categories?: number[] blocked_mcc_codes?: string[] blocked_vendors?: string[] interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' is_one_time_edit?: boolean limit: { amount: number currency_code?: string } lock_date?: string /* date */ transaction_amount_limit?: { amount: number currency_code?: string } } } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: Update a limit path: /developer/v1/limits/{spend_limit_id} description: No description request: { accounting_rules?: { field_id: string field_option_id: string }[] display_name?: string existing_expense_policy_agent_exemption_application_rules?: 'APPLY_TO_ALL' | 'APPLY_TO_NONE' is_exempt_from_policy_agent?: boolean is_shareable?: boolean new_user_id?: string permitted_spend_types?: { primary_card_enabled: boolean reimbursements_enabled: boolean } spend_program_id?: string spending_restrictions?: { allowed_categories?: number[] allowed_vendors?: string[] blocked_categories?: number[] blocked_mcc_codes?: string[] blocked_vendors?: string[] interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' is_one_time_edit?: boolean limit: { amount: number currency_code?: string } lock_date?: string /* date */ transaction_amount_limit?: { amount: number currency_code?: string } } } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: Add new users into a shared limit path: /developer/v1/limits/{spend_limit_id}/add-users description: No description request: { user_ids?: string[] } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: Terminate a limit path: /developer/v1/limits/{spend_limit_id}/deferred/termination description: This endpoint creates an async task to terminate a limit permanently. request: { idempotency_key: string } response: { id: string } --- title: Remove users from a shared limit path: /developer/v1/limits/{spend_limit_id}/delete-users description: No description request: { user_ids?: string[] } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: Suspend a limit path: /developer/v1/limits/{spend_limit_id}/suspension description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: Unsuspend a limit path: /developer/v1/limits/{spend_limit_id}/unsuspension description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number } pending: { amount: number currency_code: string minor_unit_conversion_rate: number } total: { amount: number currency_code: string minor_unit_conversion_rate: number } } cards: { card_id: string cardholder_id: string created_at: string /* date */ display_name: string expiration: string is_ap_card: boolean last_four: string via_new_product_or_service: boolean }[] created_at: string /* date */ display_name: string entity_id: string has_program_overridden: boolean id: string is_exempt_from_policy_agent: boolean is_shareable: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } spend_program_id: string state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { acting_user_id: string inserted_at: string /* date */ suspended_by_ramp: boolean } users: { user_id: string }[] } --- title: List locations path: /developer/v1/locations description: No description request: none response: { data: { entity_id: string id: string name: string }[] page: { next: string } } --- title: Create a location path: /developer/v1/locations description: No description request: { entity_id?: string name: string } response: none --- title: Fetch a location path: /developer/v1/locations/{location_id} description: No description request: none response: { entity_id: string id: string name: string } --- title: Update a location path: /developer/v1/locations/{location_id} description: No description request: { entity_id?: string name: string } response: { entity_id: string id: string name: string } --- title: List memos path: /developer/v1/memos description: No description request: none response: { data: { id?: string memo?: string }[] page: { next: string } } --- title: Fetch a transaction memo path: /developer/v1/memos/{transaction_id} description: No description request: none response: { id?: string memo?: string } --- title: Upload a new memo for a transaction path: /developer/v1/memos/{transaction_id} description: No description request: { is_memo_recurring?: boolean memo: string } response: { id?: string memo?: string } --- title: List merchants path: /developer/v1/merchants description: No description request: none response: { data: { id: string is_auto_approved: boolean merchant_name: string sk_category_name: string }[] page: { next: string } } --- title: List purchase orders path: /developer/v1/purchase-orders description: No description request: none response: { data: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } archived_at: string /* date */ bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' entity_id: string external_id: string id: string item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } description: string external_id: string id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string name: string net_payment_terms: number owner_id: string promise_date: string /* date */ purchase_order_number: string ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string ship_to_address: { address1: string address2: string city: string country: string postal_code: string state: string } ship_to_company_name: string shipping_contact_email: string shipping_contact_first_name: string shipping_contact_last_name: string shipping_contact_phone_number: string spend_end_date: string /* date */ spend_program_id: string spend_request_id: string spend_start_date: string /* date */ spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } three_way_match_enabled: boolean transaction_ids: string[] user_id: string vendor_id: string }[] page: { next: string } } --- title: Create a purchase order path: /developer/v1/purchase-orders description: No description request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' entity_id: string external_id?: string line_items: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] description?: string external_id?: string unit_price: string | number unit_quantity: number }[] memo?: string net_payment_terms?: number promise_date?: string /* date */ purchase_order_number?: string spend_end_date?: string /* date */ spend_start_date?: string /* date */ three_way_match_enabled: boolean vendor_id?: string } response: none --- title: Fetch a purchase order path: /developer/v1/purchase-orders/{purchase_order_id} description: No description request: none response: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } archived_at: string /* date */ bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: { attachments?: RampDocumentSchema[] conditions: WorkflowsCondition description: string field: CustomFormFieldResponseDumpSchemaV2 field_id: string global_library_field_id?: string is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string }[] label: string }[] label: string } } entity_id: string external_id: string id: string item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } description: string external_id: string id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string name: string net_payment_terms: number owner_id: string promise_date: string /* date */ purchase_order_number: string ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string ship_to_address: { address1: string address2: string city: string country: string postal_code: string state: string } ship_to_company_name: string shipping_contact_email: string shipping_contact_first_name: string shipping_contact_last_name: string shipping_contact_phone_number: string spend_end_date: string /* date */ spend_program_id: string spend_request_id: string spend_start_date: string /* date */ spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } three_way_match_enabled: boolean transaction_ids: string[] user_id: string vendor_id: string } --- title: Update a purchase order path: /developer/v1/purchase-orders/{purchase_order_id} description: Purchase order must be approved. request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] memo?: string spend_end_date?: string /* date */ spend_start_date?: string /* date */ } response: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } archived_at: string /* date */ bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: { attachments?: RampDocumentSchema[] conditions: WorkflowsCondition description: string field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string }[] label: string }[] label: string } } entity_id: string external_id: string id: string item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } description: string external_id: string id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string name: string net_payment_terms: number owner_id: string promise_date: string /* date */ purchase_order_number: string ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string ship_to_address: { address1: string address2: string city: string country: string postal_code: string state: string } ship_to_company_name: string shipping_contact_email: string shipping_contact_first_name: string shipping_contact_last_name: string shipping_contact_phone_number: string spend_end_date: string /* date */ spend_program_id: string spend_request_id: string spend_start_date: string /* date */ spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } three_way_match_enabled: boolean transaction_ids: string[] user_id: string vendor_id: string } --- title: Archive a purchase order path: /developer/v1/purchase-orders/{purchase_order_id}/archive description: No description request: { archived_reason?: string } response: none --- title: Add line items to an existing purchase order path: /developer/v1/purchase-orders/{purchase_order_id}/line-items description: No description request: { line_items: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] description?: string external_id?: string unit_price: string | number unit_quantity: number }[] } response: none --- title: Delete a single line item from an existing purchase order path: /developer/v1/purchase-orders/{purchase_order_id}/line-items/{line_item_id} description: Purchase order must be approved. request: none response: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } archived_at: string /* date */ bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: { attachments?: RampDocumentSchema[] conditions: WorkflowsCondition description: string field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string }[] label: string }[] label: string } } entity_id: string external_id: string id: string item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } description: string external_id: string id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string name: string net_payment_terms: number owner_id: string promise_date: string /* date */ purchase_order_number: string ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string ship_to_address: { address1: string address2: string city: string country: string postal_code: string state: string } ship_to_company_name: string shipping_contact_email: string shipping_contact_first_name: string shipping_contact_last_name: string shipping_contact_phone_number: string spend_end_date: string /* date */ spend_program_id: string spend_request_id: string spend_start_date: string /* date */ spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } three_way_match_enabled: boolean transaction_ids: string[] user_id: string vendor_id: string } --- title: Update a single line item on an existing purchase order path: /developer/v1/purchase-orders/{purchase_order_id}/line-items/{line_item_id} description: Purchase order must be approved. request: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string free_form_text?: string }[] description?: string unit_price?: string | number unit_quantity?: number } response: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } archived_at: string /* date */ bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: { attachments?: RampDocumentSchema[] conditions: WorkflowsCondition description: string field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string }[] label: string }[] label: string } } entity_id: string external_id: string id: string item_receipt_ids: string[] line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } description: string external_id: string id: string quantity: number remote_id: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] memo: string name: string net_payment_terms: number owner_id: string promise_date: string /* date */ purchase_order_number: string ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string ship_to_address: { address1: string address2: string city: string country: string postal_code: string state: string } ship_to_company_name: string shipping_contact_email: string shipping_contact_first_name: string shipping_contact_last_name: string shipping_contact_phone_number: string spend_end_date: string /* date */ spend_program_id: string spend_request_id: string spend_start_date: string /* date */ spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } three_way_match_enabled: boolean transaction_ids: string[] user_id: string vendor_id: string } --- title: List emails opted out of receipt integrations path: /developer/v1/receipt-integrations/opt-out description: No description request: { email?: string id?: string } response: { email?: string id?: string } --- title: Add a new email to receipt integrations opt-out list path: /developer/v1/receipt-integrations/opt-out description: No description request: { business_id: number email: string } response: none --- title: Remove an email from receipt integration opt-out list path: /developer/v1/receipt-integrations/opt-out/{mailbox_opted_out_email_uuid} description: Successful request will opt-in email to receipt integrations. request: none response: none --- title: List receipts path: /developer/v1/receipts description: No description request: none response: { data: { created_at?: string /* date */ id?: string ocr?: { currency_code?: string line_items?: { item_date?: string /* date */ item_name?: string item_quantity?: number item_total_price?: number item_unit_price?: number }[] } receipt_url: string transaction_id?: string user_id?: string }[] page: { next: string } } --- title: Upload a receipt path: /developer/v1/receipts description: image and optionally associate it with a transaction. If a `transaction_id` is provided, the receipt will be linked directly to that transaction. If not, Ramp will attempt to automatically match the receipt to the most relevant transaction based on context. This endpoint accepts the [multipart/form-data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) format. Include the receipt image as a part with `Content-Disposition: attachment`. Include metadata as parts with `Content-Disposition: form-data`. request: { idempotency_key: string transaction_id?: string user_id: string } response: none --- title: Fetch a receipt path: /developer/v1/receipts/{receipt_id} description: No description request: none response: { created_at?: string /* date */ id?: string ocr?: { currency_code?: string line_items?: { item_date?: string /* date */ item_name?: string item_quantity?: number item_total_price?: number item_unit_price?: number }[] } receipt_url: string transaction_id?: string user_id?: string } --- title: List reimbursements path: /developer/v1/reimbursements description: No description request: none response: { data: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code: string external_id: string id: string name: string provider_name: string source: { type?: string } type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: number approved_at: string /* date */ attendees: { name: string user_id: string }[] created_at: string /* date */ currency: string direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number employee_id: string end_location: string entity_id: string id: string line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code: string external_id: string id: string name: string provider_name: string source: { type?: string } type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string }[] memo: string merchant: string merchant_id: string original_reimbursement_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } payment_batch_id: string payment_id: string payment_processed_at: string /* date */ receipts: string[] spend_limit_id: string start_location: string state: 'APPROVED' | 'AWAITING_EXPORT' | 'AWAITING_PAYMENT' | 'AWAITING_PUSH_PAYMENT' | 'CANCELED' | 'DELETED' | 'DRAFT' | 'EXPORTED' | 'EXPORT_FAILED' | 'EXPORT_INITIATED' | 'EXPORT_MARKED_AS_FAILED' | 'EXPORT_SUCCESSFUL' | 'FAILED_REIMBURSEMENT' | 'INIT' | 'MANUALLY_REIMBURSED' | 'MISSING_ACH' | 'PENDING' | 'PROCESSING' | 'PUSH_PAYMENT_FAILED' | 'PUSH_PAYMENT_INITIATED' | 'REIMBURSED' | 'REIMBURSED_VIA_PUSH' | 'REJECTED' submitted_at: string /* date */ sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ trace_id?: { descriptor: string trace_id: string } transaction_date: string /* date */ trip_id: string type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ user_email: string user_full_name: string user_id: string waypoints: string[] }[] page: { next: string } } --- title: Create a mileage reimbursement path: /developer/v1/reimbursements/mileage description: No description request: { distance: string | number distance_units?: 'KILOMETERS' | 'MILES' end_location?: string memo?: string reimbursee_id: string spend_allocation_id?: string start_location?: string trip_date: string /* date */ waypoints?: string[] } response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code: string external_id: string id: string name: string provider_name: string source: { type?: string } type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: number approved_at: string /* date */ attendees: { name: string user_id: string }[] created_at: string /* date */ currency: string direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number employee_id: string end_location: string entity_id: string id: string line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code: string external_id: string id: string name: string provider_name: string source: { type?: string } type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string }[] memo: string merchant: string merchant_id: string original_reimbursement_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } payment_batch_id: string payment_id: string payment_processed_at: string /* date */ receipts: string[] spend_limit_id: string start_location: string state: 'APPROVED' | 'AWAITING_EXPORT' | 'AWAITING_PAYMENT' | 'AWAITING_PUSH_PAYMENT' | 'CANCELED' | 'DELETED' | 'DRAFT' | 'EXPORTED' | 'EXPORT_FAILED' | 'EXPORT_INITIATED' | 'EXPORT_MARKED_AS_FAILED' | 'EXPORT_SUCCESSFUL' | 'FAILED_REIMBURSEMENT' | 'INIT' | 'MANUALLY_REIMBURSED' | 'MISSING_ACH' | 'PENDING' | 'PROCESSING' | 'PUSH_PAYMENT_FAILED' | 'PUSH_PAYMENT_INITIATED' | 'REIMBURSED' | 'REIMBURSED_VIA_PUSH' | 'REJECTED' submitted_at: string /* date */ sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ trace_id?: { descriptor: string trace_id: string } transaction_date: string /* date */ trip_id: string type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ user_email: string user_full_name: string user_id: string waypoints: string[] } --- title: Upload a receipt for a reimbursement path: /developer/v1/reimbursements/submit-receipt description: If a `reimbursement_id` is provided, the receipt will be linked directly to that reimbursement. If not, Ramp will attempt to automatically create a draft reimbursement via OCR. This endpoint accepts the [multipart/form-data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) format. Include the receipt image as a part with `Content-Disposition: attachment`. Include metadata as parts with `Content-Disposition: form-data`. request: { idempotency_key: string reimbursee_id: string reimbursement_id?: string } response: none --- title: Fetch a reimbursement path: /developer/v1/reimbursements/{reimbursement_id} description: No description request: none response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code: string external_id: string id: string name: string provider_name: string source: { type?: string } type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: number approved_at: string /* date */ attendees: { name: string user_id: string }[] created_at: string /* date */ currency: string direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number employee_id: string end_location: string entity_id: string id: string line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code: string external_id: string id: string name: string provider_name: string source: { type?: string } type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo: string }[] memo: string merchant: string merchant_id: string original_reimbursement_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } payment_batch_id: string payment_id: string payment_processed_at: string /* date */ receipts: string[] spend_limit_id: string start_location: string state: 'APPROVED' | 'AWAITING_EXPORT' | 'AWAITING_PAYMENT' | 'AWAITING_PUSH_PAYMENT' | 'CANCELED' | 'DELETED' | 'DRAFT' | 'EXPORTED' | 'EXPORT_FAILED' | 'EXPORT_INITIATED' | 'EXPORT_MARKED_AS_FAILED' | 'EXPORT_SUCCESSFUL' | 'FAILED_REIMBURSEMENT' | 'INIT' | 'MANUALLY_REIMBURSED' | 'MISSING_ACH' | 'PENDING' | 'PROCESSING' | 'PUSH_PAYMENT_FAILED' | 'PUSH_PAYMENT_INITIATED' | 'REIMBURSED' | 'REIMBURSED_VIA_PUSH' | 'REJECTED' submitted_at: string /* date */ sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ trace_id?: { descriptor: string trace_id: string } transaction_date: string /* date */ trip_id: string type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ user_email: string user_full_name: string user_id: string waypoints: string[] } --- title: List repayments path: /developer/v1/repayments description: This endpoint supports filtering. Results are sorted by creation date in descending order. Note that entity_id filtering is not supported yet. request: none response: { data: { entity_id?: string funding_method: string id: string original_transaction_id: string repaid_at: string /* date */ repayment_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } status: 'AWAITING_MANUAL_REPAYMENT' | 'AWAITING_PAYMENT' | 'NONE' | 'REPAID' | 'REPAYMENT_FAILED' | 'REQUESTED_BY_REVIEWER' user_id: string user_signature: string }[] page: { next: string } } --- title: List spend programs path: /developer/v1/spend-programs description: No description request: none response: { data: { description: string display_name: string icon: 'AccountingServicesIcon' | 'AdvertisingIcon' | 'CONTRACTORS_AND_PROFESSIONAL_SERVICES' | 'CUSTOM' | 'CardIcon' | 'EducationStipendIcon' | 'EmployeeRewardsIcon' | 'GroundTransportationIcon' | 'LegalFeesIcon' | 'LodgingIcon' | 'LunchOrderingIcon' | 'OnboardingIcon' | 'PerDiemCardIcon' | 'SOFTWARE' | 'SaasSubscriptionIcon' | 'SoftwareTrialIcon' | 'SuppliesIcon' | 'TeamSocialIcon' | 'TravelExpensesIcon' | 'VirtualEventIcon' | 'WellnessIcon' | 'WorkFromHomeIcon' | 'advertising' | 'airlines' | 'bills' | 'business' | 'car_services' | 'contractor' | 'education' | 'entertainment' | 'event_balloons' | 'event_virtual' | 'food' | 'fuel_and_gas' | 'general_expense' | 'general_merchandise' | 'gift' | 'government_services' | 'internet_and_phone' | 'legal' | 'lodging' | 'lodging_room' | 'newspaper' | 'office' | 'physical_card' | 'procurement_checklist' | 'procurement_intake' | 'professional_services' | 'restaurants' | 'reward' | 'saas_software' | 'shipping' | 'travel_misc' | 'wellness' id: string is_shareable: boolean issue_physical_card_if_needed: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval: 'ANNUAL' | 'CUSTOM' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } }[] page: { next: string } } --- title: Create a spend program path: /developer/v1/spend-programs description: No description request: { description: string display_name: string icon: 'AccountingServicesIcon' | 'AdvertisingIcon' | 'CONTRACTORS_AND_PROFESSIONAL_SERVICES' | 'CUSTOM' | 'CardIcon' | 'EducationStipendIcon' | 'EmployeeRewardsIcon' | 'GroundTransportationIcon' | 'LegalFeesIcon' | 'LodgingIcon' | 'LunchOrderingIcon' | 'OnboardingIcon' | 'PerDiemCardIcon' | 'SOFTWARE' | 'SaasSubscriptionIcon' | 'SoftwareTrialIcon' | 'SuppliesIcon' | 'TeamSocialIcon' | 'TravelExpensesIcon' | 'VirtualEventIcon' | 'WellnessIcon' | 'WorkFromHomeIcon' | 'advertising' | 'airlines' | 'bills' | 'business' | 'car_services' | 'contractor' | 'education' | 'entertainment' | 'event_balloons' | 'event_virtual' | 'food' | 'fuel_and_gas' | 'general_expense' | 'general_merchandise' | 'gift' | 'government_services' | 'internet_and_phone' | 'legal' | 'lodging' | 'lodging_room' | 'newspaper' | 'office' | 'physical_card' | 'procurement_checklist' | 'procurement_intake' | 'professional_services' | 'restaurants' | 'reward' | 'saas_software' | 'shipping' | 'travel_misc' | 'wellness' is_shareable?: boolean issuance_rules?: { automatic?: { applies_to_all?: boolean department_ids?: string[] location_ids?: string[] user_custom_field_ids?: string[] } requestable?: { applies_to_all?: boolean department_ids?: string[] location_ids?: string[] user_custom_field_ids?: string[] } } issue_physical_card_if_needed?: boolean permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } spending_restrictions: { allowed_categories?: number[] allowed_vendors?: string[] blocked_categories?: number[] blocked_mcc_codes?: string[] blocked_vendors?: string[] interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code?: string } lock_date?: string /* date */ transaction_amount_limit?: { amount: number currency_code?: string } } } response: none --- title: Fetch a spend program path: /developer/v1/spend-programs/{spend_program_id} description: No description request: none response: { custom_form_collection: { custom_form_collection_log_entry: { forms: { fields: CustomFormFieldWrapperDumpSchema[] label: string }[] label: string } } description: string display_name: string icon: 'AccountingServicesIcon' | 'AdvertisingIcon' | 'CONTRACTORS_AND_PROFESSIONAL_SERVICES' | 'CUSTOM' | 'CardIcon' | 'EducationStipendIcon' | 'EmployeeRewardsIcon' | 'GroundTransportationIcon' | 'LegalFeesIcon' | 'LodgingIcon' | 'LunchOrderingIcon' | 'OnboardingIcon' | 'PerDiemCardIcon' | 'SOFTWARE' | 'SaasSubscriptionIcon' | 'SoftwareTrialIcon' | 'SuppliesIcon' | 'TeamSocialIcon' | 'TravelExpensesIcon' | 'VirtualEventIcon' | 'WellnessIcon' | 'WorkFromHomeIcon' | 'advertising' | 'airlines' | 'bills' | 'business' | 'car_services' | 'contractor' | 'education' | 'entertainment' | 'event_balloons' | 'event_virtual' | 'food' | 'fuel_and_gas' | 'general_expense' | 'general_merchandise' | 'gift' | 'government_services' | 'internet_and_phone' | 'legal' | 'lodging' | 'lodging_room' | 'newspaper' | 'office' | 'physical_card' | 'procurement_checklist' | 'procurement_intake' | 'professional_services' | 'restaurants' | 'reward' | 'saas_software' | 'shipping' | 'travel_misc' | 'wellness' id: string is_shareable: boolean issue_physical_card_if_needed: boolean line_item_accounting_fields: { external_id: string id: string is_required: boolean name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ blocked_categories: number[] blocked_vendors: string[] interval: 'ANNUAL' | 'CUSTOM' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number } next_interval_reset: string /* date */ start_of_interval: string /* date */ temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number } } } --- title: List External Approval Request nodes for a spend program path: /developer/v1/spend-programs/{spend_program_id}/workflow-nodes description: No description request: none response: { workflow_nodes: { name: string next_node_id: string node_id: string service_key: string }[] } --- title: Create a draft spend request via OCR path: /developer/v1/spend-requests/draft-via-ocr description: Requests should be made with `multipart/form-data` content type. request: { idempotency_key: string purchase_order_number_number?: string purchase_order_number_prefix?: string requester_user_id: string spend_intent_id: string } response: { spend_request_id: string } --- title: List statements path: /developer/v1/statements description: No description request: none response: { data: { balance_sections: { charges: { amount: number currency_code: string minor_unit_conversion_rate: number } credits: { amount: number currency_code: string minor_unit_conversion_rate: number } ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } entity_id: string id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } payments: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] charges: { amount: number currency_code: string minor_unit_conversion_rate: number } credits: { amount: number currency_code: string minor_unit_conversion_rate: number } end_date: string /* date */ ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } payments: { amount: number currency_code: string minor_unit_conversion_rate: number } preceding_statement_id?: string start_date: string /* date */ statement_lines: { cleared_at?: string /* date */ created_at: string /* date */ id?: string type?: 'CARD_TRANSACTION' | 'CASHBACK' | 'TRANSFER_PAYMENT' }[] statement_url?: string }[] page: { next: string } } --- title: Fetch a statement path: /developer/v1/statements/{statement_id} description: No description request: none response: { balance_sections: { charges: { amount: number currency_code: string minor_unit_conversion_rate: number } credits: { amount: number currency_code: string minor_unit_conversion_rate: number } ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } entity_id: string id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } payments: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] charges: { amount: number currency_code: string minor_unit_conversion_rate: number } credits: { amount: number currency_code: string minor_unit_conversion_rate: number } end_date: string /* date */ ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number } payments: { amount: number currency_code: string minor_unit_conversion_rate: number } preceding_statement_id?: string start_date: string /* date */ statement_lines: { cleared_at?: string /* date */ created_at: string /* date */ id?: string type?: 'CARD_TRANSACTION' | 'CASHBACK' | 'TRANSFER_PAYMENT' }[] statement_url?: string } --- title: Create a token path: /developer/v1/token description: Expects two headers: - Authorization header formed from base-64 encoded client credentials as `Authorization: Basic ` - `Content-Type: application/x-www-form-urlencoded` Required content body depends on authorization type method, as defined by `grant_type`. - Authorization Code Grant (`grant_type=authorization_code`): `grant_type`, `code`, and `redirect_uri` are required. Request must happen after requested scopes have been approved and exchanged for authorization code. - Refresh Token Grant (`grant_type=refresh_token`): `grant_type` and `refresh_token` are required. User must have previously obtained refresh token in authorization code flow. - Client Credentials Grant (`grant_type=client_credentials`): `grant_type` and `scope` are required. request: { code?: string grant_type: 'authorization_code' | 'client_credentials' | 'refresh_token' redirect_uri?: string refresh_token?: string scope?: string } response: { access_token?: string expires_in?: number id_token?: string refresh_token?: string refresh_token_expires_in?: number scope?: string token_type?: string } --- title: Revoke an access or refresh token path: /developer/v1/token/revoke description: Expects an authorization header formed from base-64 encoded client credentials as `Authorization: Basic `. Content body must be form-encoded. Example: ``` curl \ -X POST \ -H "Authorization: Basic " \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode 'token=$RAMP_API_TOKEN' \ 'https://api.ramp.com/developer/v1/token/revoke' ``` request: { token: string token_type_hint?: 'access_token' | 'refresh_token' } response: none --- title: List transactions path: /developer/v1/transactions description: This endpoint supports filtering and ordering. If state is not set, all transactions except declined transactions will be returned. Note that setting multiple ordering parameters is unsupported. request: none response: { data: { accounting_categories?: { category_id?: string category_name?: string tracking_category_remote_id?: string tracking_category_remote_name?: string tracking_category_remote_type?: string }[] accounting_date: string /* date */ accounting_field_selections?: { category_info?: { external_id?: string id?: string name?: string type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id?: string id?: string name?: string provider_name: string source?: { type?: string } type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount?: number attendees?: { name: string user_id: string }[] card_holder?: { department_id?: string department_name?: string employee_id?: string first_name?: string last_name?: string location_id?: string location_name?: string user_id?: string } card_id?: string card_present: boolean currency_code?: string decline_details?: { amount?: number reason?: 'AUTHORIZER' | 'AUTHORIZER_AP_CARD_VELOCITY_LIMIT' | 'AUTHORIZER_BUSINESS_LIMIT' | 'AUTHORIZER_BUSINESS_SUSPENDED' | 'AUTHORIZER_BUSINESS_VENDOR_BLACKLIST' | 'AUTHORIZER_CARD_AUTO_LOCK_DATE' | 'AUTHORIZER_CARD_CATEGORY_BLACKLIST' | 'AUTHORIZER_CARD_CATEGORY_WHITELIST' | 'AUTHORIZER_CARD_LIMIT' | 'AUTHORIZER_CARD_MCC_BLACKLIST' | 'AUTHORIZER_CARD_MISSING_POLICY_ITEMS' | 'AUTHORIZER_CARD_NOT_ACTIVATED' | 'AUTHORIZER_CARD_PARTIALLY_ACTIVATED' | 'AUTHORIZER_CARD_START_DATE' | 'AUTHORIZER_CARD_SUSPENDED' | 'AUTHORIZER_CARD_TASK_SANCTION' | 'AUTHORIZER_CARD_TOTAL_ACTIVATION_REQUIRED' | 'AUTHORIZER_CARD_VENDOR_BLACKLIST' | 'AUTHORIZER_CARD_VENDOR_WHITELIST' | 'AUTHORIZER_COMMANDO_MODE' | 'AUTHORIZER_FRAUD' | 'AUTHORIZER_FREEZE_TRANSACTIONS_RISK' | 'AUTHORIZER_GLOBAL_MCC_BLACKLIST' | 'AUTHORIZER_MEMBER_LIMIT' | 'AUTHORIZER_NON_AP_CARD_VELOCITY_LIMIT' | 'AUTHORIZER_OOB_BLOCKED_MERCHANT' | 'AUTHORIZER_OOB_DAILY_BUSINESS_BALANCE' | 'AUTHORIZER_OOB_DAILY_CARD_SPEND' | 'AUTHORIZER_RAMP_AUTHORIZATION_METHODS' | 'AUTHORIZER_RAMP_TRANSACTION_AMOUNT_LIMIT' | 'AUTHORIZER_RAMP_VENDOR_RESTRICTIONS' | 'AUTHORIZER_SPEND_ALLOCATION_ARCHIVED_FUNDS' | 'AUTHORIZER_SPEND_ALLOCATION_MEMBER_SUSPENDED' | 'AUTHORIZER_SPEND_ALLOCATION_SUSPENDED' | 'AUTHORIZER_TRANSACTION_AMOUNT_LIMIT' | 'AUTHORIZER_UNAUTHORIZED_USER' | 'AUTHORIZER_UNDER_TRANSACTION_AMOUNT_LIMIT' | 'AUTHORIZER_USER_LIMIT' | 'AUTHORIZER_USER_SUSPENDED' | 'BLOCKED_COUNTRY' | 'CARD_EXPIRED' | 'CARD_LOST_OR_STOLEN' | 'CARD_TERMINATED' | 'CHIP_FAILURE' | 'FORBIDDEN_CATEGORY' | 'INSECURE_AUTHORIZATION_METHOD' | 'INSUFFICIENT_FUNDS' | 'INVALID_PIN' | 'MISSING_CVV' | 'MISSING_EXPIRATION' | 'MOBILE_WALLET_FAILURE' | 'MOBILE_WALLET_TOKEN_NOT_FOUND' | 'MOBILE_WALLET_TOKEN_TERMINATED' | 'NETWORK_DECLINE_ACCOUNT_VERIFICATION' | 'NETWORK_DECLINE_ADVICE' | 'NETWORK_DECLINE_ADVICE_ACQUIRER_ISSUE' | 'NETWORK_DECLINE_ADVICE_ADDITIONAL_AUTHENTICATION_REQUIRED' | 'NETWORK_DECLINE_ADVICE_FORCED_STIP_BY_ISSUER' | 'NETWORK_DECLINE_ADVICE_ISSUER_LOGGED_OFF' | 'NETWORK_DECLINE_ADVICE_ISSUER_TIMEOUT' | 'NETWORK_DECLINE_ADVICE_ISSUER_UNAVAILABLE' | 'NETWORK_DECLINE_ADVICE_PIN_ERROR' | 'NETWORK_DECLINE_ADVICE_RECURRING_PAYMENT' | 'NETWORK_DECLINE_ADVICE_SELECTIVE_ACCEPTANCE_SERVICE' | 'NETWORK_DECLINE_ADVICE_SUSPECTED_FRAUD_TRANSACTION' | 'NETWORK_DECLINE_ADVICE_TOKEN_PROVISIONING_SERVICE' | 'NETWORK_DECLINE_ADVICE_VISA_PAYMENT_CONTROLS_RULE' | 'NOT_ACTIVE' | 'NOT_ALLOWED' | 'NO_AUTO_ROUTED_LIMITS_AVAILABLE' | 'NO_LINKED_SPEND_ALLOCATION' | 'OFAC_VERIFICATION_NEEDED' | 'OPEN_TO_BUY_LIMIT' | 'OTHER' | 'PIN_BLOCKED' | 'PIN_TRY_LIMIT_EXCEEDED' | 'PROCESSOR_CAP' | 'QUASI_CASH' | 'ROUTED_TO_TERMINATED_SPEND_ALLOCATION' | 'STRIPE_WEBHOOK_TIMEOUT' | 'SUSPECTED_BIN_ATTACK' | 'SUSPECTED_FRAUD' | 'THREE_D_SECURE_REQUIRED' | 'USER_BLOCKED' | 'USER_TERMINATED' | 'WRONG_ADDRESS' | 'WRONG_CVV' | 'WRONG_EXPIRATION' | 'WRONG_POSTAL_CODE' } disputes?: { created_at?: string /* date */ id?: string memo?: string type?: string }[] entity_id: string id?: string limit_id?: string line_items?: { accounting_field_selections?: { category_info?: { external_id?: string id?: string name?: string type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id?: string id?: string name?: string provider_name: string source?: { type?: string } type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } converted_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string }[] memo?: string merchant_category_code?: string merchant_category_code_description?: string merchant_data?: { auto_rental: { check_out?: string days?: number } flight: { departure_date: string passenger_name?: string segments: ApiTransactionPurchaseFlightSegment[] } lodging: { check_in?: string nights: number } receipt: { items?: ApiTransactionPurchaseReceiptLineItem[] } reference: string } merchant_descriptor?: string merchant_id: string merchant_location: { city: string country: string postal_code: string state: string } merchant_name?: string minor_unit_conversion_rate: number original_transaction_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } policy_violations?: { created_at?: string /* date */ id?: string memo?: string type?: string }[] receipts?: string[] requires_accounting_vendor_creation_to_sync?: boolean settlement_date?: string /* date */ sk_category_id: number sk_category_name: string spend_program_id?: string state?: 'ALL' | 'CLEARED' | 'COMPLETION' | 'DECLINED' | 'ERROR' | 'PENDING' | 'PENDING_INITIATION' statement_id?: string sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ trip_id: string trip_name: string user_transaction_time?: string /* date */ }[] page: { next: string } } --- title: Fetch a transaction path: /developer/v1/transactions/{transaction_id} description: No description request: none response: { accounting_categories?: { category_id?: string category_name?: string tracking_category_remote_id?: string tracking_category_remote_name?: string tracking_category_remote_type?: string }[] accounting_date: string /* date */ accounting_field_selections?: { category_info?: { external_id?: string id?: string name?: string type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id?: string id?: string name?: string provider_name: string source?: { type?: string } type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount?: number attendees?: { name: string user_id: string }[] card_holder?: { department_id?: string department_name?: string employee_id?: string first_name?: string last_name?: string location_id?: string location_name?: string user_id?: string } card_id?: string card_present: boolean currency_code?: string decline_details?: { amount?: number reason?: 'AUTHORIZER' | 'AUTHORIZER_AP_CARD_VELOCITY_LIMIT' | 'AUTHORIZER_BUSINESS_LIMIT' | 'AUTHORIZER_BUSINESS_SUSPENDED' | 'AUTHORIZER_BUSINESS_VENDOR_BLACKLIST' | 'AUTHORIZER_CARD_AUTO_LOCK_DATE' | 'AUTHORIZER_CARD_CATEGORY_BLACKLIST' | 'AUTHORIZER_CARD_CATEGORY_WHITELIST' | 'AUTHORIZER_CARD_LIMIT' | 'AUTHORIZER_CARD_MCC_BLACKLIST' | 'AUTHORIZER_CARD_MISSING_POLICY_ITEMS' | 'AUTHORIZER_CARD_NOT_ACTIVATED' | 'AUTHORIZER_CARD_PARTIALLY_ACTIVATED' | 'AUTHORIZER_CARD_START_DATE' | 'AUTHORIZER_CARD_SUSPENDED' | 'AUTHORIZER_CARD_TASK_SANCTION' | 'AUTHORIZER_CARD_TOTAL_ACTIVATION_REQUIRED' | 'AUTHORIZER_CARD_VENDOR_BLACKLIST' | 'AUTHORIZER_CARD_VENDOR_WHITELIST' | 'AUTHORIZER_COMMANDO_MODE' | 'AUTHORIZER_FRAUD' | 'AUTHORIZER_FREEZE_TRANSACTIONS_RISK' | 'AUTHORIZER_GLOBAL_MCC_BLACKLIST' | 'AUTHORIZER_MEMBER_LIMIT' | 'AUTHORIZER_NON_AP_CARD_VELOCITY_LIMIT' | 'AUTHORIZER_OOB_BLOCKED_MERCHANT' | 'AUTHORIZER_OOB_DAILY_BUSINESS_BALANCE' | 'AUTHORIZER_OOB_DAILY_CARD_SPEND' | 'AUTHORIZER_RAMP_AUTHORIZATION_METHODS' | 'AUTHORIZER_RAMP_TRANSACTION_AMOUNT_LIMIT' | 'AUTHORIZER_RAMP_VENDOR_RESTRICTIONS' | 'AUTHORIZER_SPEND_ALLOCATION_ARCHIVED_FUNDS' | 'AUTHORIZER_SPEND_ALLOCATION_MEMBER_SUSPENDED' | 'AUTHORIZER_SPEND_ALLOCATION_SUSPENDED' | 'AUTHORIZER_TRANSACTION_AMOUNT_LIMIT' | 'AUTHORIZER_UNAUTHORIZED_USER' | 'AUTHORIZER_UNDER_TRANSACTION_AMOUNT_LIMIT' | 'AUTHORIZER_USER_LIMIT' | 'AUTHORIZER_USER_SUSPENDED' | 'BLOCKED_COUNTRY' | 'CARD_EXPIRED' | 'CARD_LOST_OR_STOLEN' | 'CARD_TERMINATED' | 'CHIP_FAILURE' | 'FORBIDDEN_CATEGORY' | 'INSECURE_AUTHORIZATION_METHOD' | 'INSUFFICIENT_FUNDS' | 'INVALID_PIN' | 'MISSING_CVV' | 'MISSING_EXPIRATION' | 'MOBILE_WALLET_FAILURE' | 'MOBILE_WALLET_TOKEN_NOT_FOUND' | 'MOBILE_WALLET_TOKEN_TERMINATED' | 'NETWORK_DECLINE_ACCOUNT_VERIFICATION' | 'NETWORK_DECLINE_ADVICE' | 'NETWORK_DECLINE_ADVICE_ACQUIRER_ISSUE' | 'NETWORK_DECLINE_ADVICE_ADDITIONAL_AUTHENTICATION_REQUIRED' | 'NETWORK_DECLINE_ADVICE_FORCED_STIP_BY_ISSUER' | 'NETWORK_DECLINE_ADVICE_ISSUER_LOGGED_OFF' | 'NETWORK_DECLINE_ADVICE_ISSUER_TIMEOUT' | 'NETWORK_DECLINE_ADVICE_ISSUER_UNAVAILABLE' | 'NETWORK_DECLINE_ADVICE_PIN_ERROR' | 'NETWORK_DECLINE_ADVICE_RECURRING_PAYMENT' | 'NETWORK_DECLINE_ADVICE_SELECTIVE_ACCEPTANCE_SERVICE' | 'NETWORK_DECLINE_ADVICE_SUSPECTED_FRAUD_TRANSACTION' | 'NETWORK_DECLINE_ADVICE_TOKEN_PROVISIONING_SERVICE' | 'NETWORK_DECLINE_ADVICE_VISA_PAYMENT_CONTROLS_RULE' | 'NOT_ACTIVE' | 'NOT_ALLOWED' | 'NO_AUTO_ROUTED_LIMITS_AVAILABLE' | 'NO_LINKED_SPEND_ALLOCATION' | 'OFAC_VERIFICATION_NEEDED' | 'OPEN_TO_BUY_LIMIT' | 'OTHER' | 'PIN_BLOCKED' | 'PIN_TRY_LIMIT_EXCEEDED' | 'PROCESSOR_CAP' | 'QUASI_CASH' | 'ROUTED_TO_TERMINATED_SPEND_ALLOCATION' | 'STRIPE_WEBHOOK_TIMEOUT' | 'SUSPECTED_BIN_ATTACK' | 'SUSPECTED_FRAUD' | 'THREE_D_SECURE_REQUIRED' | 'USER_BLOCKED' | 'USER_TERMINATED' | 'WRONG_ADDRESS' | 'WRONG_CVV' | 'WRONG_EXPIRATION' | 'WRONG_POSTAL_CODE' } disputes?: { created_at?: string /* date */ id?: string memo?: string type?: string }[] entity_id: string id?: string limit_id?: string line_items?: { accounting_field_selections?: { category_info?: { external_id?: string id?: string name?: string type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id?: string id?: string name?: string provider_name: string source?: { type?: string } type?: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } converted_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string }[] memo?: string merchant_category_code?: string merchant_category_code_description?: string merchant_data?: { auto_rental: { check_out?: string days?: number } flight: { departure_date: string passenger_name?: string segments: { arrival_airport_code?: string carrier?: string departure_airport_code?: string flight_number?: string service_class?: string stopover_allowed?: boolean }[] } lodging: { check_in?: string nights: number } receipt: { items?: { commodity_code: string description?: string discount: number quantity?: number tax: number total?: number unit_cost?: number }[] } reference: string } merchant_descriptor?: string merchant_id: string merchant_location: { city: string country: string postal_code: string state: string } merchant_name?: string minor_unit_conversion_rate: number original_transaction_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } policy_violations?: { created_at?: string /* date */ id?: string memo?: string type?: string }[] receipt_affidavit?: string receipts?: string[] requires_accounting_vendor_creation_to_sync?: boolean settlement_date?: string /* date */ sk_category_id: number sk_category_name: string spend_program_id?: string state?: 'ALL' | 'CLEARED' | 'COMPLETION' | 'DECLINED' | 'ERROR' | 'PENDING' | 'PENDING_INITIATION' statement_id?: string sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ trip_id: string trip_name: string user_transaction_time?: string /* date */ } --- title: List transfer payments path: /developer/v1/transfers description: For information on how to use this endpoint, refer to the [Transfers Guide](/developer-api/v1/guides/transfers). request: none response: { data: { amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } bank_account_id: string created_at?: string /* date */ entity_id?: string id?: string payment_id?: string status?: 'ACH_CONFIRMED' | 'CANCELED' | 'COMPLETED' | 'ERROR' | 'INITIATED' | 'NOT_ACKED' | 'NOT_ENOUGH_FUNDS' | 'PROCESSING_BY_ODFI' | 'REJECTED_BY_ODFI' | 'RETURNED_BY_RDFI' | 'SUBMITTED_TO_FED' | 'SUBMITTED_TO_RDFI' | 'UNNECESSARY' | 'UPLOADED' sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' }[] page: { next: string } } --- title: Fetch a transfer payment path: /developer/v1/transfers/{transfer_id} description: For information on how to use this endpoint, refer to the [Transfers Guide](/developer-api/v1/guides/transfers). request: none response: { amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } bank_account_id: string created_at?: string /* date */ entity_id?: string id?: string payment_id?: string status?: 'ACH_CONFIRMED' | 'CANCELED' | 'COMPLETED' | 'ERROR' | 'INITIATED' | 'NOT_ACKED' | 'NOT_ENOUGH_FUNDS' | 'PROCESSING_BY_ODFI' | 'REJECTED_BY_ODFI' | 'RETURNED_BY_RDFI' | 'SUBMITTED_TO_FED' | 'SUBMITTED_TO_RDFI' | 'UNNECESSARY' | 'UPLOADED' sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' } --- title: List all trips for the business path: /developer/v1/trips description: No description request: none response: { data: { created_at: string /* date */ description: string end_date: string /* date */ id: string length_in_days: number locations: { end_date: string /* date */ location: { city: string country: string latitude: number longitude: number state: string } start_date: string /* date */ }[] name: string spend_events: { id: string spend_type: 'BILL' | 'REIMBURSEMENT' | 'TRANSACTION' }[] start_date: string /* date */ status: 'cancelled' | 'completed' | 'ongoing' | 'upcoming' total_spend: number travel_types: 'CAR' | 'FLIGHT' | 'HOTEL'[] updated_at: string /* date */ user_id: string }[][] page: { next: string } } --- title: Fetch a trip path: /developer/v1/trips/{trip_id} description: No description request: none response: { created_at: string /* date */ description: string end_date: string /* date */ id: string length_in_days: number locations: { end_date: string /* date */ location: { city: string country: string latitude: number longitude: number state: string } start_date: string /* date */ }[] name: string spend_events: { id: string spend_type: 'BILL' | 'REIMBURSEMENT' | 'TRANSACTION' }[] start_date: string /* date */ status: 'cancelled' | 'completed' | 'ongoing' | 'upcoming' total_spend: number travel_types: 'CAR' | 'FLIGHT' | 'HOTEL'[] updated_at: string /* date */ user_id: string } --- title: List unified requests with pagination path: /developer/v1/unified-requests description: NOTE: - Response schema is not finalized and will have breaking changes prior to release - This endpoint _is_ user aware, meaning perm-based filtering is applied to the query request: none response: { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ entity: BusinessEntityLight id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { blank_canvas_execution_id: string earliest_due_date: string /* date */ has_blocking_approval_requirements: boolean is_expansion_request: boolean is_import_only_spend_program: boolean is_renewal_request: boolean is_sla_due_soon: boolean reduced_agreements: ReducedPayeeAgreementForUnifiedRequestPaginationSchema[] sla_due_date: string /* date */ sla_duration_in_seconds: number spend_end_date?: string /* date */ spend_frequency: SpendRequestFrequency spend_start_date?: string /* date */ tasks: SpendRequestTask[] } & { existing_spend_request: { id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } spend_request_type: 'APPROVAL_ONLY' unified_spend_request_type: 'APPROVAL_ONLY' } | { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ entity: BusinessEntityLight id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { blank_canvas_execution_id: string earliest_due_date: string /* date */ has_blocking_approval_requirements: boolean is_expansion_request: boolean is_import_only_spend_program: boolean is_renewal_request: boolean is_sla_due_soon: boolean reduced_agreements: ReducedPayeeAgreementForUnifiedRequestPaginationSchema[] sla_due_date: string /* date */ sla_duration_in_seconds: number spend_end_date?: string /* date */ spend_frequency: SpendRequestFrequency spend_start_date?: string /* date */ tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money } & { existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema purchase_order: ReducedPurchaseOrderForProcurementRequest spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } is_shareable: boolean lock_date?: string /* date */ lock_display: string relative_lock_duration_count: number relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' resulting_spend_allocation_id: string spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight } spend_eligibility_starts_at?: string /* date */ spend_request_type: 'SPEND_LIMIT' unified_spend_request_type: 'PROCUREMENT_SPEND_ALLOCATION' } | { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ entity: BusinessEntityLight id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { blank_canvas_execution_id: string earliest_due_date: string /* date */ has_blocking_approval_requirements: boolean is_expansion_request: boolean is_import_only_spend_program: boolean is_renewal_request: boolean is_sla_due_soon: boolean reduced_agreements: ReducedPayeeAgreementForUnifiedRequestPaginationSchema[] sla_due_date: string /* date */ sla_duration_in_seconds: number spend_end_date?: string /* date */ spend_frequency: SpendRequestFrequency spend_start_date?: string /* date */ tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money } & { existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema purchase_order: ReducedPurchaseOrderForProcurementRequest spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } purchase_order: { id: string purchase_order_number: string } spend_request_type: 'PURCHASE_ORDER' unified_spend_request_type: 'PURCHASE_ORDER' } | { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ entity: BusinessEntityLight id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { amount_details: Money spend_frequency: SpendRequestFrequency } & { existing_spend_allocation_id: string existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } is_shareable: boolean issuance_parameters: { is_physical?: boolean is_temporary_edit_requested?: boolean requesting_physical_card?: boolean } lock_date?: string /* date */ lock_display: string payment_restrictions: { primary_card_enabled?: boolean reimbursements_enabled?: boolean virtual_card_enabled?: boolean } post_spend_approval_instance_policy: { id: string is_default: boolean name: string } prediction: { explanations?: string[] feedback?: SpendAllocationRequestReviewPredictionFeedback[] overall_decision: string prediction_id: string single_sentence_summary?: string system_string_rationale: string } relative_lock_duration_count: number relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' restricted_request_type: 'SPEND_ALLOCATION' resulting_spend_allocation_id: string spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight } spend_eligibility_starts_at?: string /* date */ spend_request_type: 'SPEND_LIMIT' spending_restrictions?: { interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } travel_metadata: { origin: PublicTravelLocation payment_method: 'NONE' | 'SPEND_ALLOCATION' travel_location: PublicTravelLocation travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } unified_spend_request_type: 'SPEND_ALLOCATION' } | { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ entity: BusinessEntityLight id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { resulting_spend_allocation_id: string spend_allocation_outcome_settings: { amount_details: Money is_shareable: boolean lock_date: string /* date */ payment_restrictions: PaymentRestrictions spend_eligibility_starts_at: string /* date */ spend_frequency: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } spend_request_type: 'TRAVEL' travel_metadata: { origin: PublicTravelLocation payment_method: 'NONE' | 'SPEND_ALLOCATION' travel_location: PublicTravelLocation travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } unified_spend_request_type: 'TRAVEL' }[] --- title: Get details for a specific UnifiedRequest path: /developer/v1/unified-requests/{unified_request_id} description: NOTE: - Response schema is not finalized and will have breaking changes prior to release - This endpoint _is_ user aware, meaning perm-based filtering is applied to the query request: none response: { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_at: string /* date */ entity: { entity_name: string id: string } id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { blank_canvas_execution_id: string earliest_due_date: string /* date */ has_blocking_approval_requirements: boolean is_expansion_request: boolean is_import_only_spend_program: boolean is_renewal_request: boolean is_sla_due_soon: boolean reduced_agreements: ReducedPayeeAgreementForUnifiedRequestPaginationSchema[] sla_due_date: string /* date */ sla_duration_in_seconds: number spend_end_date?: string /* date */ spend_frequency: SpendRequestFrequency spend_start_date?: string /* date */ tasks: SpendRequestTask[] } & { existing_spend_request: { id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } spend_request_type: 'APPROVAL_ONLY' unified_spend_request_type: 'APPROVAL_ONLY' } & { ai_intake_thread_id: string ai_request_copilot_thread_id: string savings: { amount_saved: number attributed_users?: AttributedUserResponse[] comment: string created_at: string /* date */ id: string type: string updated_at: string /* date */ }[] } & { allowed_overage_percent: number approver_comment?: string budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } change_request_custom_form_collection_response_uuid?: string comment_thread_uuid: string custom_form_collection_response_uuid?: string deleted_by_user?: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_reason?: string internal_memo?: string pending_change_request?: { submitted_at: string /* date */ uuid: string } ramp_event_history_uuid: string } & { agent_executions: { agents?: AgentInWorkflow[] completed_agent_executions: CompletedAgentExecution[] } agreements: { auto_renewal: boolean available_actions: PayeeAgreementForUnifiedRequestDetailDumpAvailableActions currency: string days_remaining: PayeeAgreementDaysRemainingPydanticSchema description: string end_date: string /* date */ id: string last_date_to_terminate: string /* date */ name: string payee: ReducedPayeePydanticSchema source: PayeeAgreementSpendRequestMappingSource start_date: string /* date */ total_value: number }[] ai_summary_async_job_uuid: string ai_summary_data: { span_id?: string summary?: string takeaways?: string[] title?: string } approval_chain_data: { approval_instance_uuid: string approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' is_delegate: boolean is_in_approval_reminder_cooldown: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string revert_note: string revert_note_author: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } approval_events: { _ramp_event_type: string acting_user_id: number approval_chain_events: SanitizedApprovalStep[] date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string }[] available_actions: { archive: SpendRequestActionDetailSchema change_payment_method: SpendRequestActionDetailSchema edit: SpendRequestActionDetailSchema has_permission_to_edit_primary_fields: boolean has_permission_to_edit_secondary_fields: boolean request_changes: SpendRequestActionDetailSchema } available_actions_v2: { archive: ActionDetailSchema_ArchiveDenialReason_ change_payment_method: ActionDetailSchema_ChangePaymentMethodDenialReason_ create_agreement_post_approval: ActionDetailSchema_AgreementCreationPostApprovalDenialReason_ edit_accounting_merchant: ActionDetailSchema_EditAccountingMerchantDenialReason_ edit_line_items: ActionDetailSchema_EditLineItemsDenialReason_ edit_primary_fields: ActionDetailSchema_EditPrimaryFieldsDenialReason_ edit_request_coordinator: ActionDetailSchema_EditRequestCoordinatorDenialReason_ edit_secondary_fields: ActionDetailSchema_EditSecondaryFieldsDenialReason_ issue_purchase_order_fund: ActionDetailSchema_IssuePurchaseOrderFundDenialReason_ request_again: ActionDetailSchema_RequestAgainDenialReason_ request_changes: ActionDetailSchema_RequestChangesDenialReason_ send_pdf_to_vendor: ActionDetailSchema_SendPdfToVendorDenialReason_ upload_bill: ActionDetailSchema_UploadBillDenialReason_ } blank_canvas_execution_id: string change_request_diff: { fields: ProcurementChangeRequestAccountingFieldDiff | ProcurementChangeRequestFilesFieldDiff | ProcurementChangeRequestLegacyFieldDiff | ProcurementChangeRequestLineItemFieldDiff | ProcurementChangeRequestLinkFieldDiff | ProcurementChangeRequestTextFieldDiff[] } create_agreement_post_request_approval: boolean custom_form_files: { created_at: string /* date */ displayed_filename: string document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' download_pdf_url: string download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' network_vendor_document_id: string original_filename: string ramp_document: ProcurementRampDocumentSchema spend_request_document_uuid: string url: string uuid: string }[] default_question_config_summary: { amount_config?: SpendIntentAmountQuestionConfig frequency_config?: SpendIntentFrequencyQuestionConfig funds_config?: SpendIntentFundsQuestionConfig request_name_config?: SpendIntentRequestNameQuestionConfig } enable_agreement_renewal_reminders_post_approval: boolean forms: { global_form_response_statuses: GlobalFormResponseStatusDumpSchema[] vendor_onboarding: VendorOnboardingStatusDump[][] vendor_onboarding_statuses: VendorOnboardingStatusDump[] } in_progress_ai_summary_job_ids: string[] is_form_outdated: boolean is_requesting_new_vendor?: boolean is_user_on_approval_instance: boolean linkable_agreements: { auto_renewal: boolean currency?: Currency description: string end_date: string /* date */ last_date_to_terminate?: string /* date */ name: string payee_agreement_id: string payee_logo?: string payee_name?: string start_date: string /* date */ total_value: number up_for_renewal: boolean }[] purchase_order_documents?: { created_at: string /* date */ document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' document_source: 'DEVELOPER_API' | 'DOCUSIGN' | 'IRONCLAD' | 'RAMP' document_type: 'PURCHASE_ORDER' | 'SPEND_REQUEST' download_pdf_url: string external_document_url: string filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'txt' | 'webp' | 'xls' | 'xlsx' | 'xml' | 'zip' id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' original_filename: string payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse ramp_document: ProcurementRampDocumentSchema spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string spend_request_view_document_url: string type: none }[] renewals: { auto_renewal: boolean available_actions: PayeeRenewalForSpendRequestAvailableActionsSchema cancellation_reason: string created_at: string /* date */ currency: string days_remaining: PayeeRenewalDaysRemainingPydanticSchema deleted_at: string /* date */ effective_status: RenewalStatus end_date: string /* date */ id: string is_active: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ notifications_on: boolean num_seats: number source: PayeeRenewalSpendRequestMappingSource start_date: string /* date */ status: RenewalStatus total_value: number updated_at: string /* date */ }[] sanitized_approval_steps: { _ramp_event_type: string assigned_entities: SanitizedAssignedEntity[] displayed_event_text: string event_order: number event_type: 'NOTIFY' | 'REQUIRE' | 'REQUIRE_ALL' id: string is_current_step: boolean is_delegate: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean notes: string raw_step_order: number status: 'ADMIN_APPROVED' | 'ADMIN_REJECTED' | 'APPROVED' | 'COMPLETED' | 'MANUALLY_SKIPPED' | 'PENDING' | 'REJECTED' | 'SKIPPED' | 'TERMINATED' step_creator_user_id: string step_date: string substeps: SanitizedApprovalSubstep[] trigger_entity_metadata?: TriggerEntityMetadata }[] sourcing_event: { current_rfx: RFXForProcurementRequestDetail id: string name: string } spend_intent_config_snapshot: { purchase_order?: PurchaseOrderConfigSnapshot } spend_request_documents?: { created_at: string /* date */ document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' document_source: 'DEVELOPER_API' | 'DOCUSIGN' | 'IRONCLAD' | 'RAMP' document_type: 'PURCHASE_ORDER' | 'SPEND_REQUEST' download_pdf_url: string external_document_url: string filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'txt' | 'webp' | 'xls' | 'xlsx' | 'xml' | 'zip' id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' original_filename: string payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse ramp_document: ProcurementRampDocumentSchema spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string spend_request_view_document_url: string type: none }[] workflow_execution_status: { last_updated: string status: WorkflowExecutionStatus } workflow_form_files: { created_at: string /* date */ displayed_filename: string document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' download_pdf_url: string download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' network_vendor_document_id: string original_filename: string ramp_document: ProcurementRampDocumentSchema spend_request_document_uuid: string url: string uuid: string }[] } | { ai_intake_thread_id: string ai_request_copilot_thread_id: string savings: { amount_saved: number attributed_users?: AttributedUserResponse[] comment: string created_at: string /* date */ id: string type: string updated_at: string /* date */ }[] } & { allowed_overage_percent: number approver_comment?: string budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } change_request_custom_form_collection_response_uuid?: string comment_thread_uuid: string custom_form_collection_response_uuid?: string deleted_by_user?: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_reason?: string internal_memo?: string pending_change_request?: { submitted_at: string /* date */ uuid: string } ramp_event_history_uuid: string } & { agent_executions: { agents?: AgentInWorkflow[] completed_agent_executions: CompletedAgentExecution[] } agreements: { auto_renewal: boolean available_actions: PayeeAgreementForUnifiedRequestDetailDumpAvailableActions currency: string days_remaining: PayeeAgreementDaysRemainingPydanticSchema description: string end_date: string /* date */ id: string last_date_to_terminate: string /* date */ name: string payee: ReducedPayeePydanticSchema source: PayeeAgreementSpendRequestMappingSource start_date: string /* date */ total_value: number }[] ai_summary_async_job_uuid: string ai_summary_data: { span_id?: string summary?: string takeaways?: string[] title?: string } approval_chain_data: { approval_instance_uuid: string approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' is_delegate: boolean is_in_approval_reminder_cooldown: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string revert_note: string revert_note_author: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } approval_events: { _ramp_event_type: string acting_user_id: number approval_chain_events: SanitizedApprovalStep[] date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string }[] available_actions: { archive: SpendRequestActionDetailSchema change_payment_method: SpendRequestActionDetailSchema edit: SpendRequestActionDetailSchema has_permission_to_edit_primary_fields: boolean has_permission_to_edit_secondary_fields: boolean request_changes: SpendRequestActionDetailSchema } available_actions_v2: { archive: ActionDetailSchema_ArchiveDenialReason_ change_payment_method: ActionDetailSchema_ChangePaymentMethodDenialReason_ create_agreement_post_approval: ActionDetailSchema_AgreementCreationPostApprovalDenialReason_ edit_accounting_merchant: ActionDetailSchema_EditAccountingMerchantDenialReason_ edit_line_items: ActionDetailSchema_EditLineItemsDenialReason_ edit_primary_fields: ActionDetailSchema_EditPrimaryFieldsDenialReason_ edit_request_coordinator: ActionDetailSchema_EditRequestCoordinatorDenialReason_ edit_secondary_fields: ActionDetailSchema_EditSecondaryFieldsDenialReason_ issue_purchase_order_fund: ActionDetailSchema_IssuePurchaseOrderFundDenialReason_ request_again: ActionDetailSchema_RequestAgainDenialReason_ request_changes: ActionDetailSchema_RequestChangesDenialReason_ send_pdf_to_vendor: ActionDetailSchema_SendPdfToVendorDenialReason_ upload_bill: ActionDetailSchema_UploadBillDenialReason_ } blank_canvas_execution_id: string change_request_diff: { fields: ProcurementChangeRequestAccountingFieldDiff | ProcurementChangeRequestFilesFieldDiff | ProcurementChangeRequestLegacyFieldDiff | ProcurementChangeRequestLineItemFieldDiff | ProcurementChangeRequestLinkFieldDiff | ProcurementChangeRequestTextFieldDiff[] } create_agreement_post_request_approval: boolean custom_form_files: { created_at: string /* date */ displayed_filename: string document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' download_pdf_url: string download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' network_vendor_document_id: string original_filename: string ramp_document: ProcurementRampDocumentSchema spend_request_document_uuid: string url: string uuid: string }[] default_question_config_summary: { amount_config?: SpendIntentAmountQuestionConfig frequency_config?: SpendIntentFrequencyQuestionConfig funds_config?: SpendIntentFundsQuestionConfig request_name_config?: SpendIntentRequestNameQuestionConfig } enable_agreement_renewal_reminders_post_approval: boolean forms: { global_form_response_statuses: GlobalFormResponseStatusDumpSchema[] vendor_onboarding: VendorOnboardingStatusDump[][] vendor_onboarding_statuses: VendorOnboardingStatusDump[] } in_progress_ai_summary_job_ids: string[] is_form_outdated: boolean is_requesting_new_vendor?: boolean is_user_on_approval_instance: boolean linkable_agreements: { auto_renewal: boolean currency?: Currency description: string end_date: string /* date */ last_date_to_terminate?: string /* date */ name: string payee_agreement_id: string payee_logo?: string payee_name?: string start_date: string /* date */ total_value: number up_for_renewal: boolean }[] purchase_order_documents?: { created_at: string /* date */ document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' document_source: 'DEVELOPER_API' | 'DOCUSIGN' | 'IRONCLAD' | 'RAMP' document_type: 'PURCHASE_ORDER' | 'SPEND_REQUEST' download_pdf_url: string external_document_url: string filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'txt' | 'webp' | 'xls' | 'xlsx' | 'xml' | 'zip' id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' original_filename: string payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse ramp_document: ProcurementRampDocumentSchema spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string spend_request_view_document_url: string type: none }[] renewals: { auto_renewal: boolean available_actions: PayeeRenewalForSpendRequestAvailableActionsSchema cancellation_reason: string created_at: string /* date */ currency: string days_remaining: PayeeRenewalDaysRemainingPydanticSchema deleted_at: string /* date */ effective_status: RenewalStatus end_date: string /* date */ id: string is_active: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ notifications_on: boolean num_seats: number source: PayeeRenewalSpendRequestMappingSource start_date: string /* date */ status: RenewalStatus total_value: number updated_at: string /* date */ }[] sanitized_approval_steps: { _ramp_event_type: string assigned_entities: SanitizedAssignedEntity[] displayed_event_text: string event_order: number event_type: 'NOTIFY' | 'REQUIRE' | 'REQUIRE_ALL' id: string is_current_step: boolean is_delegate: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean notes: string raw_step_order: number status: 'ADMIN_APPROVED' | 'ADMIN_REJECTED' | 'APPROVED' | 'COMPLETED' | 'MANUALLY_SKIPPED' | 'PENDING' | 'REJECTED' | 'SKIPPED' | 'TERMINATED' step_creator_user_id: string step_date: string substeps: SanitizedApprovalSubstep[] trigger_entity_metadata?: TriggerEntityMetadata }[] sourcing_event: { current_rfx: RFXForProcurementRequestDetail id: string name: string } spend_intent_config_snapshot: { purchase_order?: PurchaseOrderConfigSnapshot } spend_request_documents?: { created_at: string /* date */ document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' document_source: 'DEVELOPER_API' | 'DOCUSIGN' | 'IRONCLAD' | 'RAMP' document_type: 'PURCHASE_ORDER' | 'SPEND_REQUEST' download_pdf_url: string external_document_url: string filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'txt' | 'webp' | 'xls' | 'xlsx' | 'xml' | 'zip' id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' original_filename: string payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse ramp_document: ProcurementRampDocumentSchema spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string spend_request_view_document_url: string type: none }[] workflow_execution_status: { last_updated: string status: WorkflowExecutionStatus } workflow_form_files: { created_at: string /* date */ displayed_filename: string document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' download_pdf_url: string download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' network_vendor_document_id: string original_filename: string ramp_document: ProcurementRampDocumentSchema spend_request_document_uuid: string url: string uuid: string }[] } & { purchase_order: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string purchase_order_fund_uuid: string purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string should_create_fund_on_approval: boolean } purchase_order_detail: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string purchase_order_fund_uuid: string purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string should_create_fund_on_approval: boolean } } & { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_at: string /* date */ entity: { entity_name: string id: string } id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { blank_canvas_execution_id: string earliest_due_date: string /* date */ has_blocking_approval_requirements: boolean is_expansion_request: boolean is_import_only_spend_program: boolean is_renewal_request: boolean is_sla_due_soon: boolean reduced_agreements: ReducedPayeeAgreementForUnifiedRequestPaginationSchema[] sla_due_date: string /* date */ sla_duration_in_seconds: number spend_end_date?: string /* date */ spend_frequency: SpendRequestFrequency spend_start_date?: string /* date */ tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money } & { existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema purchase_order: ReducedPurchaseOrderForProcurementRequest spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } is_shareable: boolean lock_date?: string /* date */ lock_display: string relative_lock_duration_count: number relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' resulting_spend_allocation_id: string spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight } spend_eligibility_starts_at?: string /* date */ spend_request_type: 'SPEND_LIMIT' unified_spend_request_type: 'PROCUREMENT_SPEND_ALLOCATION' } | { ai_intake_thread_id: string ai_request_copilot_thread_id: string savings: { amount_saved: number attributed_users?: AttributedUserResponse[] comment: string created_at: string /* date */ id: string type: string updated_at: string /* date */ }[] } & { allowed_overage_percent: number approver_comment?: string budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } change_request_custom_form_collection_response_uuid?: string comment_thread_uuid: string custom_form_collection_response_uuid?: string deleted_by_user?: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_reason?: string internal_memo?: string pending_change_request?: { submitted_at: string /* date */ uuid: string } ramp_event_history_uuid: string } & { agent_executions: { agents?: AgentInWorkflow[] completed_agent_executions: CompletedAgentExecution[] } agreements: { auto_renewal: boolean available_actions: PayeeAgreementForUnifiedRequestDetailDumpAvailableActions currency: string days_remaining: PayeeAgreementDaysRemainingPydanticSchema description: string end_date: string /* date */ id: string last_date_to_terminate: string /* date */ name: string payee: ReducedPayeePydanticSchema source: PayeeAgreementSpendRequestMappingSource start_date: string /* date */ total_value: number }[] ai_summary_async_job_uuid: string ai_summary_data: { span_id?: string summary?: string takeaways?: string[] title?: string } approval_chain_data: { approval_instance_uuid: string approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' is_delegate: boolean is_in_approval_reminder_cooldown: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string revert_note: string revert_note_author: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } approval_events: { _ramp_event_type: string acting_user_id: number approval_chain_events: SanitizedApprovalStep[] date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string }[] available_actions: { archive: SpendRequestActionDetailSchema change_payment_method: SpendRequestActionDetailSchema edit: SpendRequestActionDetailSchema has_permission_to_edit_primary_fields: boolean has_permission_to_edit_secondary_fields: boolean request_changes: SpendRequestActionDetailSchema } available_actions_v2: { archive: ActionDetailSchema_ArchiveDenialReason_ change_payment_method: ActionDetailSchema_ChangePaymentMethodDenialReason_ create_agreement_post_approval: ActionDetailSchema_AgreementCreationPostApprovalDenialReason_ edit_accounting_merchant: ActionDetailSchema_EditAccountingMerchantDenialReason_ edit_line_items: ActionDetailSchema_EditLineItemsDenialReason_ edit_primary_fields: ActionDetailSchema_EditPrimaryFieldsDenialReason_ edit_request_coordinator: ActionDetailSchema_EditRequestCoordinatorDenialReason_ edit_secondary_fields: ActionDetailSchema_EditSecondaryFieldsDenialReason_ issue_purchase_order_fund: ActionDetailSchema_IssuePurchaseOrderFundDenialReason_ request_again: ActionDetailSchema_RequestAgainDenialReason_ request_changes: ActionDetailSchema_RequestChangesDenialReason_ send_pdf_to_vendor: ActionDetailSchema_SendPdfToVendorDenialReason_ upload_bill: ActionDetailSchema_UploadBillDenialReason_ } blank_canvas_execution_id: string change_request_diff: { fields: ProcurementChangeRequestAccountingFieldDiff | ProcurementChangeRequestFilesFieldDiff | ProcurementChangeRequestLegacyFieldDiff | ProcurementChangeRequestLineItemFieldDiff | ProcurementChangeRequestLinkFieldDiff | ProcurementChangeRequestTextFieldDiff[] } create_agreement_post_request_approval: boolean custom_form_files: { created_at: string /* date */ displayed_filename: string document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' download_pdf_url: string download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' network_vendor_document_id: string original_filename: string ramp_document: ProcurementRampDocumentSchema spend_request_document_uuid: string url: string uuid: string }[] default_question_config_summary: { amount_config?: SpendIntentAmountQuestionConfig frequency_config?: SpendIntentFrequencyQuestionConfig funds_config?: SpendIntentFundsQuestionConfig request_name_config?: SpendIntentRequestNameQuestionConfig } enable_agreement_renewal_reminders_post_approval: boolean forms: { global_form_response_statuses: GlobalFormResponseStatusDumpSchema[] vendor_onboarding: VendorOnboardingStatusDump[][] vendor_onboarding_statuses: VendorOnboardingStatusDump[] } in_progress_ai_summary_job_ids: string[] is_form_outdated: boolean is_requesting_new_vendor?: boolean is_user_on_approval_instance: boolean linkable_agreements: { auto_renewal: boolean currency?: Currency description: string end_date: string /* date */ last_date_to_terminate?: string /* date */ name: string payee_agreement_id: string payee_logo?: string payee_name?: string start_date: string /* date */ total_value: number up_for_renewal: boolean }[] purchase_order_documents?: { created_at: string /* date */ document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' document_source: 'DEVELOPER_API' | 'DOCUSIGN' | 'IRONCLAD' | 'RAMP' document_type: 'PURCHASE_ORDER' | 'SPEND_REQUEST' download_pdf_url: string external_document_url: string filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'txt' | 'webp' | 'xls' | 'xlsx' | 'xml' | 'zip' id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' original_filename: string payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse ramp_document: ProcurementRampDocumentSchema spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string spend_request_view_document_url: string type: none }[] renewals: { auto_renewal: boolean available_actions: PayeeRenewalForSpendRequestAvailableActionsSchema cancellation_reason: string created_at: string /* date */ currency: string days_remaining: PayeeRenewalDaysRemainingPydanticSchema deleted_at: string /* date */ effective_status: RenewalStatus end_date: string /* date */ id: string is_active: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ notifications_on: boolean num_seats: number source: PayeeRenewalSpendRequestMappingSource start_date: string /* date */ status: RenewalStatus total_value: number updated_at: string /* date */ }[] sanitized_approval_steps: { _ramp_event_type: string assigned_entities: SanitizedAssignedEntity[] displayed_event_text: string event_order: number event_type: 'NOTIFY' | 'REQUIRE' | 'REQUIRE_ALL' id: string is_current_step: boolean is_delegate: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean notes: string raw_step_order: number status: 'ADMIN_APPROVED' | 'ADMIN_REJECTED' | 'APPROVED' | 'COMPLETED' | 'MANUALLY_SKIPPED' | 'PENDING' | 'REJECTED' | 'SKIPPED' | 'TERMINATED' step_creator_user_id: string step_date: string substeps: SanitizedApprovalSubstep[] trigger_entity_metadata?: TriggerEntityMetadata }[] sourcing_event: { current_rfx: RFXForProcurementRequestDetail id: string name: string } spend_intent_config_snapshot: { purchase_order?: PurchaseOrderConfigSnapshot } spend_request_documents?: { created_at: string /* date */ document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' document_source: 'DEVELOPER_API' | 'DOCUSIGN' | 'IRONCLAD' | 'RAMP' document_type: 'PURCHASE_ORDER' | 'SPEND_REQUEST' download_pdf_url: string external_document_url: string filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'txt' | 'webp' | 'xls' | 'xlsx' | 'xml' | 'zip' id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' original_filename: string payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse ramp_document: ProcurementRampDocumentSchema spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string spend_request_view_document_url: string type: none }[] workflow_execution_status: { last_updated: string status: WorkflowExecutionStatus } workflow_form_files: { created_at: string /* date */ displayed_filename: string document_category: 'ADDENDUM_OR_RIDER' | 'AMENDMENT' | 'CAIQ_LITE' | 'CERTIFICATE_OF_INSURANCE' | 'CONTRACT_OTHER' | 'DATA_PROTECTION_AGREEMENT' | 'ECOVADIS' | 'ENGAGEMENT_LETTER' | 'FAQ' | 'FORM_1099' | 'GDPR' | 'HIPAA' | 'INVOICE' | 'ISO_27001' | 'ISO_9001' | 'MSA' | 'NDA' | 'NMSDC_CERTIFICATION' | 'ORDER_FORM' | 'OTHER' | 'PAYMENT_INSTRUCTIONS' | 'PCI_DSS' | 'PEN_TEST_REPORT' | 'PRIVACY_POLICY' | 'QUOTE' | 'SECURITY_DOCUMENT' | 'SECURITY_EXHIBIT' | 'SIG' | 'SLA' | 'SOC_1_TYPE_1' | 'SOC_1_TYPE_2' | 'SOC_2' | 'SOW' | 'TAX_DOCUMENT' | 'TOS' | 'VENDOR_CONTRACT' | 'VENDOR_CREDIT' | 'VOIDED_CHECK' | 'W8' | 'W9' download_pdf_url: string download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/csv' | 'text/markdown' network_vendor_document_id: string original_filename: string ramp_document: ProcurementRampDocumentSchema spend_request_document_uuid: string url: string uuid: string }[] } & { purchase_order: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string purchase_order_fund_uuid: string purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string should_create_fund_on_approval: boolean } purchase_order_detail: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string purchase_order_fund_uuid: string purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string should_create_fund_on_approval: boolean } } & { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_at: string /* date */ entity: { entity_name: string id: string } id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { blank_canvas_execution_id: string earliest_due_date: string /* date */ has_blocking_approval_requirements: boolean is_expansion_request: boolean is_import_only_spend_program: boolean is_renewal_request: boolean is_sla_due_soon: boolean reduced_agreements: ReducedPayeeAgreementForUnifiedRequestPaginationSchema[] sla_due_date: string /* date */ sla_duration_in_seconds: number spend_end_date?: string /* date */ spend_frequency: SpendRequestFrequency spend_start_date?: string /* date */ tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money } & { existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema purchase_order: ReducedPurchaseOrderForProcurementRequest spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } purchase_order: { id: string purchase_order_number: string } spend_request_type: 'PURCHASE_ORDER' unified_spend_request_type: 'PURCHASE_ORDER' } | { ai_intake_thread_id: string ai_request_copilot_thread_id: string savings: { amount_saved: number attributed_users?: AttributedUserResponse[] comment: string created_at: string /* date */ id: string type: string updated_at: string /* date */ }[] } & { allowed_overage_percent: number approver_comment?: string budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } change_request_custom_form_collection_response_uuid?: string comment_thread_uuid: string custom_form_collection_response_uuid?: string deleted_by_user?: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_reason?: string internal_memo?: string pending_change_request?: { submitted_at: string /* date */ uuid: string } ramp_event_history_uuid: string } & { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_at: string /* date */ entity: { entity_name: string id: string } id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { amount_details: Money spend_frequency: SpendRequestFrequency } & { existing_spend_allocation_id: string existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ post_spend_approval_instance_policy: ApprovalPolicyLightSchema spend_eligibility_starts_at?: string /* date */ spend_frequency?: SpendRequestFrequency unified_request_id: string unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } is_shareable: boolean issuance_parameters: { is_physical?: boolean is_temporary_edit_requested?: boolean requesting_physical_card?: boolean } lock_date?: string /* date */ lock_display: string payment_restrictions: { primary_card_enabled?: boolean reimbursements_enabled?: boolean virtual_card_enabled?: boolean } post_spend_approval_instance_policy: { id: string is_default: boolean name: string } prediction: { explanations?: string[] feedback?: SpendAllocationRequestReviewPredictionFeedback[] overall_decision: string prediction_id: string single_sentence_summary?: string system_string_rationale: string } relative_lock_duration_count: number relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' restricted_request_type: 'SPEND_ALLOCATION' resulting_spend_allocation_id: string spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight } spend_eligibility_starts_at?: string /* date */ spend_request_type: 'SPEND_LIMIT' spending_restrictions?: { interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } travel_metadata: { origin: PublicTravelLocation payment_method: 'NONE' | 'SPEND_ALLOCATION' travel_location: PublicTravelLocation travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } unified_spend_request_type: 'SPEND_ALLOCATION' } & { accounting_auto_mark_ready_rule_enabled: boolean accounting_rules: { id?: number tracking_category: { additional_data: TrackingCategorySchemaAdditionalData cardholder_edits_allowed: boolean default_option: TrackingCategoryOption display_name: string display_name_short: string entity_settings: TrackingCategoryEntitySetting[] helper_text: string id: number input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active: boolean is_custom_field: boolean is_hidden: boolean is_internal: boolean is_splittable: boolean refresh_status: TrackingCategoryRefreshStatusItem remote_field_locations: 'BODY' | 'EXPENSE_LINE' | 'ITEM_LINE' | 'LINE_ITEM'[] remote_id: string remote_name: string remote_type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' settings: TrackingCategorySettings sync_with_erp: boolean uuid: string } tracking_category_id: number tracking_category_option: { additional_data: TrackingCategoryOptionAdditionalData display_name: string id: number is_active: boolean label: string parent?: TrackingCategoryOptionLight remote_code: string remote_id: string remote_name: string subtitle: string title: string uuid: string visibility: 'HIDDEN' | 'VISIBLE' } }[] approval_chain_data: { approval_instance_uuid: string approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' is_delegate: boolean is_in_approval_reminder_cooldown: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string revert_note: string revert_note_author: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } approval_events: { _ramp_event_type: string acting_user_id: number approval_chain_events: SanitizedApprovalStep[] date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string }[] available_actions: { archive: { can_perform: boolean denial_reason: string } edit: { can_perform: boolean denial_reason: string } } available_actions_v2: { archive: ActionAllowedSchema | ActionDeniedSchema_ArchiveDenialReason_ edit_primary_fields: ActionAllowedSchema | ActionDeniedSchema_EditPrimaryFieldsDenialReason_ } default_transaction_memo: string members: { email: string first_name: string has_set_name?: boolean id: string is_deleted: boolean is_inactive: boolean is_preloaded: boolean last_name: string profile_picture_url: string }[] spending_restrictions: { amount?: number amount_details: Money categories_blacklist?: number[] categories_whitelist?: number[] currency?: { currency: string currency_sign: string name: string num_decimal_places: number } interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' lock_date?: string /* date */ lock_display?: string relative_lock_duration_count?: number relative_lock_duration_unit?: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' start_date?: string /* date */ transaction_amount_limit?: number vendor_blacklist?: number[] vendor_whitelist?: number[] } submission_policy_id: string travel_metadata: { origin: PublicTravelLocation payment_method: 'NONE' | 'SPEND_ALLOCATION' spend_estimate_line_items: TravelSpendEstimateLineItem[] travel_location: { city?: string country?: string lat?: number lng?: number state?: string timezone?: string trip_destination_id?: string } travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } trip: { id: string trip_name: string } } | { ai_intake_thread_id: string ai_request_copilot_thread_id: string savings: { amount_saved: number attributed_users?: AttributedUserResponse[] comment: string created_at: string /* date */ id: string type: string updated_at: string /* date */ }[] } & { allowed_overage_percent: number approver_comment?: string budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } change_request_custom_form_collection_response_uuid?: string comment_thread_uuid: string custom_form_collection_response_uuid?: string deleted_by_user?: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_reason?: string internal_memo?: string pending_change_request?: { submitted_at: string /* date */ uuid: string } ramp_event_history_uuid: string } & { approval_instance_id: string approved_at: string /* date */ created_at: string /* date */ created_by_user: { deleted_at: string /* date */ department: DepartmentDisplay email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay profile_picture_url: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } deleted_at: string /* date */ entity: { entity_name: string id: string } id: string name: string ramp_url: string reason: string rejected_at: string /* date */ request_duration: number submitted_at: string /* date */ wbp_info: WbpInfoResponseSchema } & { coordinator: ReducedUserForBaseUnifiedRequest name: string owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' unified_request_type: 'SPEND_REQUEST' user_defined_name: string } & { resulting_spend_allocation_id: string spend_allocation_outcome_settings: { amount_details: Money is_shareable: boolean lock_date: string /* date */ payment_restrictions: PaymentRestrictions spend_eligibility_starts_at: string /* date */ spend_frequency: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } spend_request_type: 'TRAVEL' travel_metadata: { origin: PublicTravelLocation payment_method: 'NONE' | 'SPEND_ALLOCATION' travel_location: PublicTravelLocation travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } unified_spend_request_type: 'TRAVEL' } & { approval_chain_data: { approval_instance_uuid: string approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' is_delegate: boolean is_in_approval_reminder_cooldown: boolean is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string revert_note: string revert_note_author: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } attendees_count: number available_actions: { archive: { can_perform: boolean denial_reason: string } edit: { can_perform: boolean denial_reason: string } } group_trip: { id: string } members: { email: string first_name: string has_set_name?: boolean id: string is_deleted: boolean is_inactive: boolean is_preloaded: boolean last_name: string profile_picture_url: string }[] spend_allocation_outcome_settings: { accounting_auto_mark_ready_rule_enabled: boolean accounting_rules: TrackingCategoryOptionMapping[] amount_details: Money categories_blacklist: number[] categories_whitelist: number[] is_shareable: boolean lock_date: string /* date */ payment_restrictions: PaymentRestrictions post_spend_approval_instance_policy: ApprovalPolicyLightSchema spend_eligibility_starts_at: string /* date */ spend_frequency: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' submission_policy: PolicyLight vendor_blacklist: number[] vendor_whitelist: number[] } travel_metadata: { origin: PublicTravelLocation payment_method: 'NONE' | 'SPEND_ALLOCATION' spend_estimate_line_items: TravelSpendEstimateLineItem[] travel_location: { city?: string country?: string lat?: number lng?: number state?: string timezone?: string trip_destination_id?: string } travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } trip: { id: string trip_name: string } } --- title: List users path: /developer/v1/users description: No description request: none response: { data: { business_id: string custom_fields: { name: string value: string }[] department_id: string email?: string employee_id: string entity_id: string first_name?: string id?: string is_manager: boolean last_name?: string location_id: string manager_id: string phone: string role?: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' scheduled_deactivation_date: string /* date */ scheduled_invitation_date: string /* date */ status: 'INVITE_EXPIRED' | 'INVITE_PENDING' | 'USER_ACTIVE' | 'USER_DRAFT' | 'USER_INACTIVE' | 'USER_ONBOARDING' | 'USER_SUSPENDED' }[] page: { next: string } } --- title: Create a user invite path: /developer/v1/users/deferred description: Call this endpoint to trigger an async task to send out a user invite via email. Users will need to accept the invite in order to be onboarded. Assign a user to a specific entity by specifying a `location_id` on creation. Locations are mapped to entities with a many-to-one relationship. request: { department_id?: string direct_manager_id?: string email: string first_name: string idempotency_key: string is_draft?: boolean is_manager?: boolean last_name: string location_id?: string role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' scheduled_deactivation_date?: string /* date */ } response: none --- title: Fetch deferred task status path: /developer/v1/users/deferred/status/{task_id} description: No description request: none response: { context?: { acting_user_id?: string } data?: { error?: string user_id?: string } id?: string status?: string } --- title: Fetch a user path: /developer/v1/users/{user_id} description: No description request: none response: { business_id: string custom_fields: { name: string value: string }[] department_id: string email?: string employee_id: string entity_id: string first_name?: string id?: string is_manager: boolean last_name?: string location_id: string manager_id: string phone: string role?: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' scheduled_deactivation_date: string /* date */ scheduled_invitation_date: string /* date */ status: 'INVITE_EXPIRED' | 'INVITE_PENDING' | 'USER_ACTIVE' | 'USER_DRAFT' | 'USER_INACTIVE' | 'USER_ONBOARDING' | 'USER_SUSPENDED' } --- title: Update a user path: /developer/v1/users/{user_id} description: No description request: { auto_promote?: boolean department_id?: string direct_manager_id?: string first_name?: string is_manager?: boolean last_name?: string location_id?: string role?: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' scheduled_deactivation_date?: string /* date */ } response: none --- title: Deactivate a user path: /developer/v1/users/{user_id}/deactivate description: When users are deactivated, they will no longer be able to log in, spend on cards, or receive any notifications from Ramp. request: none response: Record --- title: Manage a user's invite lifecycle path: /developer/v1/users/{user_id}/invite description: Performs one of three actions against a draft user, delegating to the Identity-owned invite / scheduled-invitation services: - `SCHEDULE`: Create or update a scheduled invitation at `invitation_time`. - `DESCHEDULE`: Cancel any pending scheduled invitation. - `SEND_NOW`: Immediately publish the draft invite and send the invite email. The user must be in DRAFT status for `SCHEDULE` and `SEND_NOW`. `DESCHEDULE` is a no-op if no pending scheduled invitation exists. request: { action: 'DESCHEDULE' | 'SCHEDULE' | 'SEND_NOW' invitation_time?: string /* date */ } response: Record --- title: Reactivate a user path: /developer/v1/users/{user_id}/reactivate description: Upon reactivation, users can log in to Ramp again, spend on their previously issued cards and resume receiving Ramp notifications. request: none response: Record --- title: Create a spend limit and retrieve sensitive card details path: /developer/v1/vault/cards description: Vault API access is required to use this endpoint. request: { accounting_rules?: { field_id: string field_option_id: string }[] allowed_overage_percent_override?: string | number display_name?: string spend_program_id?: string spending_restrictions?: { allowed_categories?: number[] allowed_vendors?: string[] blocked_categories?: number[] blocked_mcc_codes?: string[] blocked_vendors?: string[] interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code?: string } lock_date?: string /* date */ transaction_amount_limit?: { amount: number currency_code?: string } } user_id: string } response: none --- title: Fetch a card's sensitive details path: /developer/v1/vault/cards/{card_id} description: Accepts a card's ID and returns its sensitive details. Vault API access is required to use this endpoint. request: none response: { cvv?: string expiration: string id?: string pan?: string } --- title: List vendors path: /developer/v1/vendors description: No description request: none response: { data: { accounting_vendor_remote_id: string address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } billing_frequency?: 'ANNUAL' | 'MONTHLY' | 'MULTIPLE' | 'NA' | 'OTHER' | 'QUARTERLY' | 'ROLLING' | 'TBD' | 'TWICE_A_YEAR' contacts: string[] country: string created_at: string /* date */ default_entity_id: string default_payment_method: { policy?: DefaultPaymentMethodAddressPolicy | DefaultPaymentMethodBankAccountPolicy | DefaultPaymentMethodCardPolicy update_source?: 'AUTO' | 'MANUAL' } description?: string external_vendor_id: string federal_tax_classification?: 'C_CORPORATION' | 'INDIVIDUAL_SOLE_PROPRIETOR_SINGLE_MEMBER_LLC' | 'INTERNATIONAL' | 'LLC_C_CORPORATION' | 'LLC_PARTNERSHIP' | 'LLC_S_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'S_CORPORATION' | 'TRUST_ESTATE' id: string is_active: boolean is_deletable: boolean merchant_id?: string name: string name_legal?: string sk_category_id?: number sk_category_name?: string state?: string subsidiary?: string[] tax_address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } total_spend_all_time: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_owner_id: string vendor_type?: 'BUSINESS' | 'INDIVIDUAL' }[] page: { next: string } } --- title: Create a new vendor path: /developer/v1/vendors description: Vendors created in the API are approved by default, and are not subject to existing approval policies. request: { accounting_vendor_remote_id?: string address?: { address_line_1: string address_line_2?: string city: string country?: string postal_code: string state?: string } business_vendor_contacts: { email: string first_name?: string last_name?: string phone?: string } country: string external_vendor_id?: string name?: string request_payment_details?: boolean request_tax_details?: boolean state?: string vendor_owner_id?: string vendor_tracking_category_option_id?: string } response: { accounting_vendor_remote_id: string address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } billing_frequency?: 'ANNUAL' | 'MONTHLY' | 'MULTIPLE' | 'NA' | 'OTHER' | 'QUARTERLY' | 'ROLLING' | 'TBD' | 'TWICE_A_YEAR' contacts: string[] country: string created_at: string /* date */ default_entity_id: string default_payment_method: { policy?: { data: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | { data: { account_nickname?: string currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' id: string is_default?: boolean payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' } kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | { card_payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } update_source?: 'AUTO' | 'MANUAL' } description?: string external_vendor_id: string federal_tax_classification?: 'C_CORPORATION' | 'INDIVIDUAL_SOLE_PROPRIETOR_SINGLE_MEMBER_LLC' | 'INTERNATIONAL' | 'LLC_C_CORPORATION' | 'LLC_PARTNERSHIP' | 'LLC_S_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'S_CORPORATION' | 'TRUST_ESTATE' id: string is_active: boolean is_deletable: boolean merchant_id?: string name: string name_legal?: string sk_category_id?: number sk_category_name?: string state?: string subsidiary?: string[] tax_address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } total_spend_all_time: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_owner_id: string vendor_type?: 'BUSINESS' | 'INDIVIDUAL' } --- title: List vendor agreements path: /developer/v1/vendors/agreements description: No description request: { agreement_custom_records?: { filters: Record | { filters: CustomRecordsQueryAndClauseRequestBody | CustomRecordsQueryOrClauseRequestBody | RowQueryFilterRequestBody[] type?: 'or' } | { clause: RowQueryGreaterThanClauseRequestBody | RowQueryGreaterThanOrEqualClauseRequestBody | RowQueryIsNotClauseRequestBody | RowQueryIsNotNullClauseRequestBody | RowQueryIsNullClauseRequestBody | RowQueryLessThanClauseRequestBody | RowQueryLessThanOrEqualClauseRequestBody | RowQueryOneOfClauseRequestBody column_id: string type?: 'filter' }[] type?: 'and' } auto_renews?: boolean contract_owner_ids?: string[] department_ids?: string[] end_date_range?: { end?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } start?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } } exclude_snoozed?: boolean has_end_date?: boolean has_pending_expansion_requests?: boolean has_reminders?: boolean include_archived?: boolean is_active?: boolean is_up_for_renewal?: boolean last_date_to_terminate_range?: { end?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } start?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } } max_days_remaining?: number max_end_date?: string /* date */ max_last_date_to_terminate?: string /* date */ max_start_date?: string /* date */ max_total_value?: string | number min_days_remaining?: number min_end_date?: string /* date */ min_last_date_to_terminate?: string /* date */ min_start_date?: string /* date */ min_total_value?: string | number page_size?: number payee_agreement_ids?: string[] payee_ids?: string[] payee_owner_ids?: string[] renewal_status?: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED'[] renewal_status_exclude?: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED'[] start?: string start_date_range?: { end?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } start?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } } } response: { data: { auto_renewal: boolean available_actions: Record contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string }[] created_at: string /* date */ currency: string custom_record_field_values: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] days_remaining: { end_date_used?: 'END_DATE' | 'LAST_DATE_TO_TERMINATE' is_expired?: boolean is_overdue?: boolean num_days_until_end?: number } deleted_at?: string /* date */ department?: { id: string name: string } description?: string draft_spend_requests: { id: string name?: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string unified_request_id: string updated_at?: string /* date */ }[] end_date?: string /* date */ has_approved_renewal_request: boolean id: string is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate?: string /* date */ latest_renewal_request?: { currency: string id: string name?: string request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string } logo?: string name: string notifications_on: boolean payee_id: string payee_name: string renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED' start_date?: string /* date */ total_value: { amount: number currency_code: string minor_unit_conversion_rate: number } updated_at: string /* date */ vendor_owners: { first_name: string full_name: string id: string last_name: string }[] }[] page: { next: string } } --- title: Delete a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id} description: No description request: none response: none --- title: Fetch a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id} description: No description request: none response: { archived_at?: string /* date */ auto_renewal: boolean available_actions: { can_edit: { status: 'allowed' } | { denial_reason: 'NOT_CONTRACT_OWNER' | 'NOT_VENDOR_OWNER' | 'NO_PERMISSION' status: 'denied' } delete: { status: 'allowed' } | { denial_reason: 'APPROVED_REQUEST' | 'PENDING_REQUEST' | 'REJECTED_REQUEST' status: 'denied' } request_expansion: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string }[] created_at: string /* date */ currency: string custom_record_field_values: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] days_remaining: { end_date_used?: 'END_DATE' | 'LAST_DATE_TO_TERMINATE' is_expired?: boolean is_overdue?: boolean num_days_until_end?: number } deleted_at?: string /* date */ description: string draft_spend_requests: { id: string name?: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string unified_request_id: string updated_at?: string /* date */ }[] end_date: string /* date */ has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ latest_rejected_renewal_request?: { can_view: boolean id: string reason: string rejected_at: string /* date */ unified_request_id: string user_full_name: string } line_items?: Record[] name: string notification_trigger_group?: { id: string notification_triggers: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number id: string }[] payee_business_settings_id: number recipient_approval_groups: { id: string members: { member: ApiVendorAgreementNotificationRecipientUser }[] name: string }[] recipient_users: { full_name: string id: string }[] should_notify_vendor_owner_manager: boolean type: 'CUSTOM_SETTING' | 'DEFAULT_BUSINESS_SETTING' } notifications_on: boolean payee: { approval_instance_uuid: string approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean can_view_vendors_tab: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number } card_merchants: { merchant_name: string uuid: string }[] dba_name: string deleted_at: string /* date */ image_url: string is_draft: boolean name: string owners: { department: string email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string profile_picture_url: string }[] uuid: string website: string } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } approvals_paused?: boolean approvals_paused_by?: { deleted_at: string email: string first_name: string id: string last_name: string lifecycle_status?: UserLifecycleStatus profile_picture_url: string role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } can_add_steps?: boolean can_skip?: boolean current_step_in_chain: number has_blocking_approval_requirements?: boolean is_last_step_for_user: boolean is_pausable?: boolean last_action_date: string needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: ApprovalTriggerType assigned_user_full_name: string assigned_user_id: string delegator_user_full_name: string delegator_user_id: string entity_full_name: string entity_id: string entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string notes: string provider_type?: string }[] number_of_approvals: number rejection_note?: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' total_number_of_approvals: number total_steps_in_chain: number } can_view: boolean created_at: string /* date */ created_by: string currency: string display_name: string id: string name: string request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ id: string name: string paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } purchase_order_number: string spend_request: { approved_at: string /* date */ currency: string id: string name: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string } start_date: string /* date */ status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] ramp_event_history_id: string renewal_action?: Record renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED' start_date: string /* date */ total_value: { amount: number currency_code: string minor_unit_conversion_rate: number } updated_at: string /* date */ } --- title: Update a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id} description: No description request: { auto_renewal?: boolean contract_owner_ids?: string[] description?: string end_date?: string /* date */ last_date_to_terminate?: string /* date */ line_items?: { discount?: number | string id?: string price_per_unit?: number | string product_or_service_name?: string quantity?: number | string term?: string time_unit?: string total_price?: number | string unit?: string }[] name?: string notifications_on?: boolean renewal_action?: { type?: 'NOT_STARTED' } | { mark_vendor_inactive?: boolean reason: string type?: 'CANCELLED' } | { reason: string type?: 'RENEWED' } renewal_notification_settings?: { notification_triggers?: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number }[] recipient_approval_group_uuids?: string[] recipient_dynamic_user_group_uuids?: string[] recipient_user_uuids?: string[] should_notify_contract_owner_managers?: boolean should_notify_vendor_owner_manager: boolean should_notify_vendor_owners?: boolean } renewal_notification_snooze?: { duration: number unit?: 'DAYS' } | { duration: number unit?: 'MONTHS' } | { duration: number unit?: 'WEEKS' } start_date?: string /* date */ total_value?: { amount: number currency_code?: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' } } response: { archived_at?: string /* date */ auto_renewal: boolean available_actions: { can_edit: { status: 'allowed' } | { denial_reason: 'NOT_CONTRACT_OWNER' | 'NOT_VENDOR_OWNER' | 'NO_PERMISSION' status: 'denied' } delete: { status: 'allowed' } | { denial_reason: 'APPROVED_REQUEST' | 'PENDING_REQUEST' | 'REJECTED_REQUEST' status: 'denied' } request_expansion: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string }[] created_at: string /* date */ currency: string custom_record_field_values: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] days_remaining: { end_date_used?: 'END_DATE' | 'LAST_DATE_TO_TERMINATE' is_expired?: boolean is_overdue?: boolean num_days_until_end?: number } deleted_at?: string /* date */ description: string draft_spend_requests: { id: string name?: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string unified_request_id: string updated_at?: string /* date */ }[] end_date: string /* date */ has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ latest_rejected_renewal_request?: { can_view: boolean id: string reason: string rejected_at: string /* date */ unified_request_id: string user_full_name: string } line_items?: Record[] name: string notification_trigger_group?: { id: string notification_triggers: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number id: string }[] payee_business_settings_id: number recipient_approval_groups: { id: string members: { member: { full_name: string id: string } }[] name: string }[] recipient_users: { full_name: string id: string }[] should_notify_vendor_owner_manager: boolean type: 'CUSTOM_SETTING' | 'DEFAULT_BUSINESS_SETTING' } notifications_on: boolean payee: { approval_instance_uuid: string approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean can_view_vendors_tab: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number } card_merchants: { merchant_name: string uuid: string }[] dba_name: string deleted_at: string /* date */ image_url: string is_draft: boolean name: string owners: { department: string email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string profile_picture_url: string }[] uuid: string website: string } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } approvals_paused?: boolean approvals_paused_by?: { deleted_at: string email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' profile_picture_url: string role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } can_add_steps?: boolean can_skip?: boolean current_step_in_chain: number has_blocking_approval_requirements?: boolean is_last_step_for_user: boolean is_pausable?: boolean last_action_date: string needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' assigned_user_full_name: string assigned_user_id: string delegator_user_full_name: string delegator_user_id: string entity_full_name: string entity_id: string entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string notes: string provider_type?: string }[] number_of_approvals: number rejection_note?: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' total_number_of_approvals: number total_steps_in_chain: number } can_view: boolean created_at: string /* date */ created_by: string currency: string display_name: string id: string name: string request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ id: string name: string paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } purchase_order_number: string spend_request: { approved_at: string /* date */ currency: string id: string name: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string } start_date: string /* date */ status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] ramp_event_history_id: string renewal_action?: Record renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED' start_date: string /* date */ total_value: { amount: number currency_code: string minor_unit_conversion_rate: number } updated_at: string /* date */ } --- title: Upload documents for a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id}/documents description: This endpoint accepts the [multipart/form-data](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) format. Include each agreement file as a repeated `documents` part. The request must also include an `X-Idempotency-Key` header. request: none response: { batch_id: string document_count: number job_id: string } --- title: Link purchase orders or documents to a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id}/link description: No description request: { documents?: { id: string type?: 'CUSTOM_FORM_FILE' } | { id: string type?: 'PAYEE_DOCUMENT' } | { id: string type?: 'SPEND_REQUEST_DOCUMENT' }[] purchase_order_ids?: string[] } response: { agreement: { archived_at?: string /* date */ auto_renewal: boolean available_actions: { can_edit: { status: 'allowed' } | { denial_reason: 'NOT_CONTRACT_OWNER' | 'NOT_VENDOR_OWNER' | 'NO_PERMISSION' status: 'denied' } delete: { status: 'allowed' } | { denial_reason: 'APPROVED_REQUEST' | 'PENDING_REQUEST' | 'REJECTED_REQUEST' status: 'denied' } request_expansion: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string }[] created_at: string /* date */ currency: string custom_record_field_values: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] days_remaining: { end_date_used?: 'END_DATE' | 'LAST_DATE_TO_TERMINATE' is_expired?: boolean is_overdue?: boolean num_days_until_end?: number } deleted_at?: string /* date */ description: string draft_spend_requests: { id: string name?: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string unified_request_id: string updated_at?: string /* date */ }[] end_date: string /* date */ has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ latest_rejected_renewal_request?: { can_view: boolean id: string reason: string rejected_at: string /* date */ unified_request_id: string user_full_name: string } line_items?: Record[] name: string notification_trigger_group?: { id: string notification_triggers: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number id: string }[] payee_business_settings_id: number recipient_approval_groups: { id: string members: { member: { full_name: string id: string } }[] name: string }[] recipient_users: { full_name: string id: string }[] should_notify_vendor_owner_manager: boolean type: 'CUSTOM_SETTING' | 'DEFAULT_BUSINESS_SETTING' } notifications_on: boolean payee: { approval_instance_uuid: string approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean can_view_vendors_tab: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number } card_merchants: { merchant_name: string uuid: string }[] dba_name: string deleted_at: string /* date */ image_url: string is_draft: boolean name: string owners: { department: string email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string profile_picture_url: string }[] uuid: string website: string } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } approvals_paused?: boolean approvals_paused_by?: { deleted_at: string email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' profile_picture_url: string role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } can_add_steps?: boolean can_skip?: boolean current_step_in_chain: number has_blocking_approval_requirements?: boolean is_last_step_for_user: boolean is_pausable?: boolean last_action_date: string needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' assigned_user_full_name: string assigned_user_id: string delegator_user_full_name: string delegator_user_id: string entity_full_name: string entity_id: string entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string notes: string provider_type?: string }[] number_of_approvals: number rejection_note?: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' total_number_of_approvals: number total_steps_in_chain: number } can_view: boolean created_at: string /* date */ created_by: string currency: string display_name: string id: string name: string request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ id: string name: string paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } purchase_order_number: string spend_request: { approved_at: string /* date */ currency: string id: string name: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string } start_date: string /* date */ status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] ramp_event_history_id: string renewal_action?: Record renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED' start_date: string /* date */ total_value: { amount: number currency_code: string minor_unit_conversion_rate: number } updated_at: string /* date */ } number_of_documents_linked: number number_of_purchase_orders_linked: number } --- title: Link a spend request to a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id}/link-spend-request description: No description request: { source: 'EXPANSION_REQUEST' | 'RENEWAL' spend_request_id: string } response: { agreement: { archived_at?: string /* date */ auto_renewal: boolean available_actions: { can_edit: { status: 'allowed' } | { denial_reason: 'NOT_CONTRACT_OWNER' | 'NOT_VENDOR_OWNER' | 'NO_PERMISSION' status: 'denied' } delete: { status: 'allowed' } | { denial_reason: 'APPROVED_REQUEST' | 'PENDING_REQUEST' | 'REJECTED_REQUEST' status: 'denied' } request_expansion: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string }[] created_at: string /* date */ currency: string custom_record_field_values: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] days_remaining: { end_date_used?: 'END_DATE' | 'LAST_DATE_TO_TERMINATE' is_expired?: boolean is_overdue?: boolean num_days_until_end?: number } deleted_at?: string /* date */ description: string draft_spend_requests: { id: string name?: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string unified_request_id: string updated_at?: string /* date */ }[] end_date: string /* date */ has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ latest_rejected_renewal_request?: { can_view: boolean id: string reason: string rejected_at: string /* date */ unified_request_id: string user_full_name: string } line_items?: Record[] name: string notification_trigger_group?: { id: string notification_triggers: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number id: string }[] payee_business_settings_id: number recipient_approval_groups: { id: string members: { member: { full_name: string id: string } }[] name: string }[] recipient_users: { full_name: string id: string }[] should_notify_vendor_owner_manager: boolean type: 'CUSTOM_SETTING' | 'DEFAULT_BUSINESS_SETTING' } notifications_on: boolean payee: { approval_instance_uuid: string approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean can_view_vendors_tab: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number } card_merchants: { merchant_name: string uuid: string }[] dba_name: string deleted_at: string /* date */ image_url: string is_draft: boolean name: string owners: { department: string email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string profile_picture_url: string }[] uuid: string website: string } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } approvals_paused?: boolean approvals_paused_by?: { deleted_at: string email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' profile_picture_url: string role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } can_add_steps?: boolean can_skip?: boolean current_step_in_chain: number has_blocking_approval_requirements?: boolean is_last_step_for_user: boolean is_pausable?: boolean last_action_date: string needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' assigned_user_full_name: string assigned_user_id: string delegator_user_full_name: string delegator_user_id: string entity_full_name: string entity_id: string entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string notes: string provider_type?: string }[] number_of_approvals: number rejection_note?: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' total_number_of_approvals: number total_steps_in_chain: number } can_view: boolean created_at: string /* date */ created_by: string currency: string display_name: string id: string name: string request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ id: string name: string paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } purchase_order_number: string spend_request: { approved_at: string /* date */ currency: string id: string name: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string } start_date: string /* date */ status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] ramp_event_history_id: string renewal_action?: Record renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED' start_date: string /* date */ total_value: { amount: number currency_code: string minor_unit_conversion_rate: number } updated_at: string /* date */ } number_of_documents_linked: number number_of_purchase_orders_linked: number } --- title: Unlink purchase orders or documents from a vendor agreement path: /developer/v1/vendors/agreements/{agreement_id}/unlink description: No description request: { documents?: { id: string type?: 'CUSTOM_FORM_FILE' } | { id: string type?: 'PAYEE_DOCUMENT' } | { id: string type?: 'SPEND_REQUEST_DOCUMENT' }[] purchase_order_ids?: string[] } response: { agreement: { archived_at?: string /* date */ auto_renewal: boolean available_actions: { can_edit: { status: 'allowed' } | { denial_reason: 'NOT_CONTRACT_OWNER' | 'NOT_VENDOR_OWNER' | 'NO_PERMISSION' status: 'denied' } delete: { status: 'allowed' } | { denial_reason: 'APPROVED_REQUEST' | 'PENDING_REQUEST' | 'REJECTED_REQUEST' status: 'denied' } request_expansion: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string }[] created_at: string /* date */ currency: string custom_record_field_values: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] days_remaining: { end_date_used?: 'END_DATE' | 'LAST_DATE_TO_TERMINATE' is_expired?: boolean is_overdue?: boolean num_days_until_end?: number } deleted_at?: string /* date */ description: string draft_spend_requests: { id: string name?: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string unified_request_id: string updated_at?: string /* date */ }[] end_date: string /* date */ has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ latest_rejected_renewal_request?: { can_view: boolean id: string reason: string rejected_at: string /* date */ unified_request_id: string user_full_name: string } line_items?: Record[] name: string notification_trigger_group?: { id: string notification_triggers: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number id: string }[] payee_business_settings_id: number recipient_approval_groups: { id: string members: { member: { full_name: string id: string } }[] name: string }[] recipient_users: { full_name: string id: string }[] should_notify_vendor_owner_manager: boolean type: 'CUSTOM_SETTING' | 'DEFAULT_BUSINESS_SETTING' } notifications_on: boolean payee: { approval_instance_uuid: string approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean can_view_vendors_tab: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number } card_merchants: { merchant_name: string uuid: string }[] dba_name: string deleted_at: string /* date */ image_url: string is_draft: boolean name: string owners: { department: string email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string profile_picture_url: string }[] uuid: string website: string } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } approvals_paused?: boolean approvals_paused_by?: { deleted_at: string email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' profile_picture_url: string role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } can_add_steps?: boolean can_skip?: boolean current_step_in_chain: number has_blocking_approval_requirements?: boolean is_last_step_for_user: boolean is_pausable?: boolean last_action_date: string needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string approval_trigger_instance_error_redirect_url: string approval_trigger_type: 'GLOBAL_FORM_RESPONSE' | 'LAUNCH_ESIGN_WORKFLOW' | 'LAUNCH_EXTERNAL_APPROVAL' | 'LAUNCH_IRONCLAD_WORKFLOW' | 'LAUNCH_THIRD_PARTY_RISK_MANAGEMENT_VENDOR_REVIEW_WORKFLOW' | 'LAUNCH_TICKETING_WORKFLOW' | 'LAUNCH_VENDOR_ONBOARDING' | 'WAIT_FOR_BOOKING_COMPLETION' assigned_user_full_name: string assigned_user_id: string delegator_user_full_name: string delegator_user_id: string entity_full_name: string entity_id: string entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string notes: string provider_type?: string }[] number_of_approvals: number rejection_note?: string status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' total_number_of_approvals: number total_steps_in_chain: number } can_view: boolean created_at: string /* date */ created_by: string currency: string display_name: string id: string name: string request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ id: string name: string paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } purchase_order_number: string spend_request: { approved_at: string /* date */ currency: string id: string name: string source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number } unified_request_id: string user_full_name: string } start_date: string /* date */ status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } }[] ramp_event_history_id: string renewal_action?: Record renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'REJECTED' | 'RENEWED' start_date: string /* date */ total_value: { amount: number currency_code: string minor_unit_conversion_rate: number } updated_at: string /* date */ } number_of_documents_unlinked: number number_of_purchase_orders_unlinked: number } --- title: List all vendor credits for all vendors of a business path: /developer/v1/vendors/credits description: No description request: none response: { data: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] applied_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_id: string }[] applied_draft_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_id: string }[] created_at: string /* date */ entity_id: string expense_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string }[] id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } unit_quantity: number }[] reference_bill_id: string reference_number: string remaining_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } total_applied_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_id: string }[][] page: { next: string } } --- title: Fetch a vendor credit path: /developer/v1/vendors/credits/{vendor_credit_id} description: No description request: none response: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] applied_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_id: string }[] applied_draft_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_id: string }[] created_at: string /* date */ entity_id: string expense_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string }[] id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } unit_quantity: number }[] reference_bill_id: string reference_number: string remaining_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } total_applied_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_id: string } --- title: Delete a vendor path: /developer/v1/vendors/{vendor_id} description: A vendor cannot be deleted if it has associated transactions, bills, contracts, or spend requests. request: none response: none --- title: Fetch a vendor path: /developer/v1/vendors/{vendor_id} description: No description request: none response: { accounting_vendor_remote_id: string address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } billing_frequency?: 'ANNUAL' | 'MONTHLY' | 'MULTIPLE' | 'NA' | 'OTHER' | 'QUARTERLY' | 'ROLLING' | 'TBD' | 'TWICE_A_YEAR' contacts: string[] country: string created_at: string /* date */ custom_form_collection_response: { custom_form_collection_log_entry: { allow_comments: boolean forms: { fields: { attachments?: RampDocumentSchema[] conditions: WorkflowsCondition description: string field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string }[] label: string }[] label: string } } custom_record_fields: { column_display_name: string column_id: string value: { display_name: string type: 'boolean' value: boolean } | { has_more: boolean rows: { display_name: string external_key: string row_id: string type: 'custom_table' }[] table_name: string type: 'custom_table' } | { display_name: string type: 'date' value: string /* date */ } | { has_more: boolean rows: { display_name: string external_key: string type: 'native_table' }[] table_name: 'accounting_field_options' | 'bills' | 'business_entities' | 'cards' | 'contracts' | 'departments' | 'external_attendees' | 'limits' | 'locations' | 'purchase_order_line_items' | 'purchase_orders' | 'reimbursements' | 'transactions' | 'users' | 'vendors' type: 'native_table' } | { display_name: string type: 'number' value: number } | { display_name: string type: 'text' value: string } }[] default_entity_id: string default_payment_method: { policy?: { data: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | { data: { account_nickname?: string currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' id: string is_default?: boolean payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' } kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | { card_payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } update_source?: 'AUTO' | 'MANUAL' } description?: string external_vendor_id: string federal_tax_classification?: 'C_CORPORATION' | 'INDIVIDUAL_SOLE_PROPRIETOR_SINGLE_MEMBER_LLC' | 'INTERNATIONAL' | 'LLC_C_CORPORATION' | 'LLC_PARTNERSHIP' | 'LLC_S_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'S_CORPORATION' | 'TRUST_ESTATE' id: string is_active: boolean is_deletable: boolean merchant_id?: string name: string name_legal?: string sk_category_id?: number sk_category_name?: string state?: string subsidiary?: string[] tax_address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } total_spend_all_time: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_owner_id: string vendor_type?: 'BUSINESS' | 'INDIVIDUAL' } --- title: Update a vendor path: /developer/v1/vendors/{vendor_id} description: No description request: { accounting_vendor_remote_id?: string address?: { address_line_1: string address_line_2?: string city: string country?: string postal_code: string state?: string } country?: string description?: string external_vendor_id?: string is_active?: boolean state?: string vendor_tracking_category_option_id?: string } response: { accounting_vendor_remote_id: string address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } billing_frequency?: 'ANNUAL' | 'MONTHLY' | 'MULTIPLE' | 'NA' | 'OTHER' | 'QUARTERLY' | 'ROLLING' | 'TBD' | 'TWICE_A_YEAR' contacts: string[] country: string created_at: string /* date */ default_entity_id: string default_payment_method: { policy?: { data: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | { data: { account_nickname?: string currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' id: string is_default?: boolean payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' } kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | { card_payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } update_source?: 'AUTO' | 'MANUAL' } description?: string external_vendor_id: string federal_tax_classification?: 'C_CORPORATION' | 'INDIVIDUAL_SOLE_PROPRIETOR_SINGLE_MEMBER_LLC' | 'INTERNATIONAL' | 'LLC_C_CORPORATION' | 'LLC_PARTNERSHIP' | 'LLC_S_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'S_CORPORATION' | 'TRUST_ESTATE' id: string is_active: boolean is_deletable: boolean merchant_id?: string name: string name_legal?: string sk_category_id?: number sk_category_name?: string state?: string subsidiary?: string[] tax_address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } total_spend_all_time: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_owner_id: string vendor_type?: 'BUSINESS' | 'INDIVIDUAL' } --- title: List vendor bank accounts path: /developer/v1/vendors/{vendor_id}/accounts description: No description request: none response: { data: { account_nickname?: string currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' id: string is_default?: boolean payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' }[] page: { next: string } } --- title: Fetch a vendor bank account path: /developer/v1/vendors/{vendor_id}/accounts/{bank_account_id} description: No description request: none response: { account_nickname?: string currency: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' id: string is_default?: boolean payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' } --- title: Archive a vendor bank account path: /developer/v1/vendors/{vendor_id}/accounts/{bank_account_id}/archive description: If the bank account has associated bills, drafts, or recurring templates, a replacement_bank_account_id must be provided in the request body. request: { replacement_bank_account_id?: string } response: none --- title: Create a vendor agreement path: /developer/v1/vendors/{vendor_id}/agreements description: No description request: { auto_renewal: boolean contract_owner_ids?: string[] description?: string end_date?: string /* date */ last_date_to_terminate?: string /* date */ line_items?: { discount?: number | string price_per_unit: number | string product_or_service_name: string quantity: number | string term?: string time_unit?: string total_price?: number | string unit?: string }[] name: string notifications_on: boolean renewal_notification_settings?: { notification_triggers?: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number }[] recipient_approval_group_uuids?: string[] recipient_dynamic_user_group_uuids?: string[] recipient_user_uuids?: string[] should_notify_contract_owner_managers?: boolean should_notify_vendor_owner_manager: boolean should_notify_vendor_owners?: boolean } start_date: string /* date */ total_value: { amount: number currency_code?: 'AED' | 'AFN' | 'ALL' | 'AMD' | 'ANG' | 'AOA' | 'ARS' | 'AUD' | 'AWG' | 'AZN' | 'BAM' | 'BBD' | 'BDT' | 'BGN' | 'BHD' | 'BIF' | 'BMD' | 'BND' | 'BOB' | 'BOV' | 'BRL' | 'BSD' | 'BTN' | 'BWP' | 'BYN' | 'BZD' | 'CAD' | 'CDF' | 'CHE' | 'CHF' | 'CHW' | 'CLF' | 'CLP' | 'CNH' | 'CNY' | 'COP' | 'COU' | 'CRC' | 'CUC' | 'CUP' | 'CVE' | 'CZK' | 'DJF' | 'DKK' | 'DOP' | 'DZD' | 'EGP' | 'ERN' | 'ETB' | 'EUR' | 'EURC' | 'FJD' | 'FKP' | 'GBP' | 'GEL' | 'GHS' | 'GIP' | 'GMD' | 'GNF' | 'GTQ' | 'GYD' | 'HKD' | 'HNL' | 'HRK' | 'HTG' | 'HUF' | 'IDR' | 'ILS' | 'INR' | 'IQD' | 'IRR' | 'ISK' | 'JMD' | 'JOD' | 'JPY' | 'KES' | 'KGS' | 'KHR' | 'KMF' | 'KPW' | 'KRW' | 'KWD' | 'KYD' | 'KZT' | 'LAK' | 'LBP' | 'LKR' | 'LRD' | 'LSL' | 'LYD' | 'MAD' | 'MDL' | 'MGA' | 'MKD' | 'MMK' | 'MNT' | 'MOP' | 'MRU' | 'MUR' | 'MVR' | 'MWK' | 'MXN' | 'MXV' | 'MYR' | 'MZN' | 'NAD' | 'NGN' | 'NIO' | 'NOK' | 'NPR' | 'NZD' | 'OMR' | 'OPEN_USD' | 'PAB' | 'PEN' | 'PGK' | 'PHP' | 'PKR' | 'PLN' | 'PYG' | 'QAR' | 'RON' | 'RSD' | 'RUB' | 'RWF' | 'SAR' | 'SBD' | 'SCR' | 'SDG' | 'SEK' | 'SGD' | 'SHP' | 'SLE' | 'SLL' | 'SOS' | 'SRD' | 'SSP' | 'STN' | 'SVC' | 'SYP' | 'SZL' | 'THB' | 'TJS' | 'TMT' | 'TND' | 'TOP' | 'TRY' | 'TTD' | 'TWD' | 'TZS' | 'UAH' | 'UGX' | 'USD' | 'USDB' | 'USDC' | 'USDT' | 'USN' | 'UYI' | 'UYU' | 'UYW' | 'UZS' | 'VED' | 'VES' | 'VND' | 'VUV' | 'WST' | 'XAD' | 'XAF' | 'XAG' | 'XAU' | 'XBA' | 'XBB' | 'XBC' | 'XBD' | 'XCD' | 'XCG' | 'XDR' | 'XOF' | 'XPD' | 'XPF' | 'XPT' | 'XSU' | 'XTS' | 'XUA' | 'XXX' | 'YER' | 'ZAR' | 'ZMW' | 'ZWG' | 'ZWL' } } response: none --- title: List vendor contacts for vendor path: /developer/v1/vendors/{vendor_id}/contacts description: No description request: none response: { data: { email: string first_name: string id: string is_default: boolean last_name: string phone: string }[] page: { next: string } } --- title: Fetch a vendor contact path: /developer/v1/vendors/{vendor_id}/contacts/{vendor_contact_id} description: No description request: none response: { email: string first_name: string id: string is_default: boolean last_name: string phone: string } --- title: List vendor credits by vendor path: /developer/v1/vendors/{vendor_id}/credits description: No description request: none response: { data: { accounting_date: string /* date */ accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] applied_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_id: string }[] applied_draft_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number } bill_id: string }[] created_at: string /* date */ entity_id: string expense_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string }[] id: string inventory_line_items: { accounting_field_selections: { category_info: { external_id: string id: string name: string type: 'AMORTIZATION_TEMPLATE' | 'BILLABLE' | 'COST_CENTER' | 'CUSTOMERS_JOBS' | 'DEFERRAL_CODE' | 'EXPENSE_ENTITY' | 'GL_ACCOUNT' | 'INVENTORY_ITEM' | 'JOURNAL' | 'MERCHANT' | 'NON_ERP' | 'OTHER' | 'PROJECT' | 'REPORTING_TAG' | 'SUBSIDIARY' | 'TAX_CODE' | 'UNIT_OF_MEASURE' } external_code?: string external_id: string id: string name: string provider_name: string }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number } memo?: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number } unit_quantity: number }[] reference_bill_id: string reference_number: string remaining_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } total_applied_amount: { amount: number currency_code: string minor_unit_conversion_rate: number } vendor_id: string }[][] page: { next: string } } --- title: Add to a vendor's bank account details path: /developer/v1/vendors/{vendor_id}/update-bank-accounts description: Adds payment details for the vendor through the approval workflow. The proposal may require approval depending on the business's approval policies. Supported payment methods: - ACH: US bank account with routing and account numbers - Wire: US wire transfer with routing and account numbers request: { account_nickname?: string ach_details?: { account_name?: string account_number: string account_owner_type?: 'BUSINESS' | 'INDIVIDUAL' account_type?: 'Checking' | 'Savings' routing_number: string } is_default?: boolean wire_details?: { account_name?: string account_number: string routing_number: string } } response: none --- title: Get all webhook subscriptions path: /developer/v1/webhooks description: No description request: none response: { business_id?: string created_at: string /* date */ endpoint_url: string event_types: 'applications.status_updated' | 'bills.approved' | 'bills.archived' | 'bills.created' | 'bills.paid' | 'bills.ready_to_sync' | 'bills.rejected' | 'entities.created' | 'item_receipts.created' | 'payments.updated' | 'purchase_orders.archived' | 'purchase_orders.created' | 'purchase_orders.updated' | 'reimbursements.batch_payment_reimbursed' | 'reimbursements.ready_for_review' | 'reimbursements.ready_to_sync' | 'reimbursements.sync_requested' | 'spend_requests.comment_created' | 'tests.test_event' | 'transactions.authorized' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.sync_requested' | 'transactions.synced' | 'unified_requests.created' | 'unified_requests.external_approval_request' | 'unified_requests.external_approval_request_reset' | 'unified_requests.modified' | 'unified_requests.node_advanced' | 'unified_requests.override_approved' | 'unified_requests.updated' | 'users.invite_accepted' | 'vendors.activated' | 'vendors.updated' | 'webhooks.verification'[] id: string status: 'active' | 'inactive' | 'pending_verification' updated_at: string /* date */ }[] --- title: Creates a new webhook subscription path: /developer/v1/webhooks description: The newly registered subscription will be in the pending verficiation state. You will need to verify your endpoint with the provided challenge. request: { additional_headers?: Record endpoint_url: string event_types: 'applications.status_updated' | 'bills.approved' | 'bills.archived' | 'bills.created' | 'bills.paid' | 'bills.ready_to_sync' | 'bills.rejected' | 'entities.created' | 'item_receipts.created' | 'payments.updated' | 'purchase_orders.archived' | 'purchase_orders.created' | 'purchase_orders.updated' | 'reimbursements.batch_payment_reimbursed' | 'reimbursements.ready_for_review' | 'reimbursements.ready_to_sync' | 'reimbursements.sync_requested' | 'spend_requests.comment_created' | 'tests.test_event' | 'transactions.authorized' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.sync_requested' | 'transactions.synced' | 'unified_requests.created' | 'unified_requests.external_approval_request' | 'unified_requests.external_approval_request_reset' | 'unified_requests.modified' | 'unified_requests.node_advanced' | 'unified_requests.override_approved' | 'unified_requests.updated' | 'users.invite_accepted' | 'vendors.activated' | 'vendors.updated' | 'webhooks.verification'[] } response: none --- title: Create a mock webhook event for active subscriptions matching the event type path: /developer/v1/webhooks/mock-webhook-event description: No description request: { event_type: 'applications.status_updated' | 'bills.approved' | 'bills.archived' | 'bills.created' | 'bills.paid' | 'bills.ready_to_sync' | 'bills.rejected' | 'entities.created' | 'item_receipts.created' | 'payments.updated' | 'purchase_orders.archived' | 'purchase_orders.created' | 'purchase_orders.updated' | 'reimbursements.batch_payment_reimbursed' | 'reimbursements.ready_for_review' | 'reimbursements.ready_to_sync' | 'reimbursements.sync_requested' | 'spend_requests.comment_created' | 'tests.test_event' | 'transactions.authorized' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.sync_requested' | 'transactions.synced' | 'unified_requests.created' | 'unified_requests.external_approval_request' | 'unified_requests.external_approval_request_reset' | 'unified_requests.modified' | 'unified_requests.node_advanced' | 'unified_requests.override_approved' | 'unified_requests.updated' | 'users.invite_accepted' | 'vendors.activated' | 'vendors.updated' | 'webhooks.verification' object_id: string object_metadata: Record } response: none --- title: Delete a webhook subscription by id path: /developer/v1/webhooks/{webhook_id} description: No description request: none response: none --- title: Get a webhook subscription by id path: /developer/v1/webhooks/{webhook_id} description: No description request: none response: { business_id?: string created_at: string /* date */ endpoint_url: string event_types: 'applications.status_updated' | 'bills.approved' | 'bills.archived' | 'bills.created' | 'bills.paid' | 'bills.ready_to_sync' | 'bills.rejected' | 'entities.created' | 'item_receipts.created' | 'payments.updated' | 'purchase_orders.archived' | 'purchase_orders.created' | 'purchase_orders.updated' | 'reimbursements.batch_payment_reimbursed' | 'reimbursements.ready_for_review' | 'reimbursements.ready_to_sync' | 'reimbursements.sync_requested' | 'spend_requests.comment_created' | 'tests.test_event' | 'transactions.authorized' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.sync_requested' | 'transactions.synced' | 'unified_requests.created' | 'unified_requests.external_approval_request' | 'unified_requests.external_approval_request_reset' | 'unified_requests.modified' | 'unified_requests.node_advanced' | 'unified_requests.override_approved' | 'unified_requests.updated' | 'users.invite_accepted' | 'vendors.activated' | 'vendors.updated' | 'webhooks.verification'[] id: string status: 'active' | 'inactive' | 'pending_verification' updated_at: string /* date */ } --- title: Verify a webhook subscription path: /developer/v1/webhooks/{webhook_id}/verify description: No description request: { challenge: string } response: { success: boolean } ---