# 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. Ramp Data requires provisioned access. Apply to the Ramp Data Partner Program to request credentials. Base URL: https://api.ramp.com/v1/public/ai-index Endpoint Description 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: Parameter Type Default 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. Tool 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: AI Usage Tracking source_url: /developer-api/v1/ai-usage text_url: /llms-guides/ai-usage.txt summary: Add a Ramp broadcast destination to your AI platform so customers can bring their Ramp API key and receive their own model usage, token, cost, and attribution data in Ramp. content: Add a Ramp broadcast destination to your AI platform so customers can bring their Ramp API key and receive their own model usage, token, cost, and attribution data in Ramp. An inbound broadcast integration for your customers: Your product adds a Ramp destination where each customer pastes or connects their own Ramp AI usage API key. Your platform securely stores that key for the customer and sends that customer's usage events to POST /developer/v1/ai-usage/unified. Each event includes model, provider, token usage, pricing context, optional reported cost, optional latency, and customer attribution metadata. Ramp ingests the events into the customer's AI spend analytics without requiring them to poll invoices, scrape dashboards, or maintain per-provider ETL. Your company operates an AI platform, model provider, proxy, or telemetry service that meters customer usage. You can add a customer-facing Ramp destination setting and securely store a Ramp API key per customer. Your customer has a Ramp production account and can generate a Ramp AI usage API key scoped to ai_usage:write. Your usage pipeline can send an HTTPS POST request after each completed model call or as an asynchronous batch flush. Implementation In your product, add a Ramp destination setup flow. Tell customers to open Ramp, go to Settings > Integrations, find your integration, click Connect, and generate an AI usage API key. The customer copies that key into your destination settings. Store the key as a customer-scoped secret and use it only for that customer's usage events. If the customer rotates or revokes the key in Ramp, prompt them to reconnect the destination. Send unified usage events to: Authenticate each request with the customer's Ramp API key: Each request is a batch envelope. Use one event per model call, and batch multiple events when your platform flushes usage asynchronously. Do not mix events from different Ramp customers in the same request. Ramp returns 204 No Content after accepting the batch for asynchronous ingestion. Top-level field Type Required Description schema_version string Yes Unified schema version. Send 1.0; unknown versions are rejected. events array AI usage events. Each item represents one model call. Identity fields make the event deduplicable and explain where it came from. Field event_id Stable caller-provided id for this model call. Reuse the same id and unchanged event data on retries so Ramp can deduplicate delivery. source Your emitting system or platform name. occurred_at datetime When the model call happened. Use an ISO 8601 timestamp with timezone; naive datetimes are rejected. provider Model provider name. model Provider model name used for the request. gateway_key_id No Identifier of the LLM Gateway key associated with this event. gateway_key_alias Gateway key alias captured when this event occurred. Use usage for token counts and other billable meters. All token fields are required and must be non-negative integers. Send 0 when a token bucket is known to be zero. usage.input_tokens integer Prompt/input tokens billed or counted for the request. usage.output_tokens Completion/output tokens billed or counted for the request. usage.cache_read_input_tokens Input tokens served from cache. usage.cache_write_input_tokens Input tokens written into cache. usage.reasoning_output_tokens Reasoning tokens produced by models that expose a separate reasoning-token counter. usage.meters Additional provider-specific usage meters when a provider bills on dimensions beyond tokens. Send [] when there are no extra meters. Use pricing_context for the inputs Ramp needs to price or explain pricing differences. service_tier, fast_mode, session_created_at, and long_context are required. Use reported_cost when your platform already calculated a cost for the event; omit reported_cost if you do not have a caller-computed cost. pricing_context.service_tier Provider service tier or priority lane, such as standard, priority, or batch. pricing_context.fast_mode boolean Whether the request used a low-latency or premium-speed path. pricing_context.session_created_at Session creation time when session age affects pricing or attribution. Use an ISO 8601 timestamp with timezone; naive datetimes are rejected. pricing_context.long_context Whether the request used a long-context pricing mode. pricing_context.inference_geo Optional inference region or geography when regional pricing applies. Defaults to an empty string. reported_cost.amount decimal Required when reported_cost is provided. Non-negative cost you calculated for the customer event, up to 20 digits with 10 decimal places. Send as a string to preserve precision. reported_cost.currency Required when reported_cost is provided. Currency for the reported cost. Use USD. reported_cost.provenance Required when reported_cost is provided. How the cost was calculated, such as provider, platform, or estimated. reported_cost.estimated Required when reported_cost is provided. Whether the reported cost is estimated rather than final. Pass stable attribution with each model call so Ramp can break down spend by the dimensions your customer uses. All attribution fields are required; use opaque identifiers instead of emails or names unless your customer explicitly asks you to send richer identifiers. provider_latency_seconds number Provider-reported model response latency, if available. attribution.session_id Conversation, workflow, or job session id. attribution.turn_id Turn, step, or request id within the session. attribution.user_id Stable customer-side end-user or service-user identifier. attribution.tags object String-to-string metadata supplied or derived for that customer's team, project, environment, cost center, feature, use case, or department. Prefer metadata values that are stable and safe to aggregate. Avoid sending secrets, API keys, or unnecessary prompt and completion content. Extra fields that are not part of the schema are ignored. Use retries. Retry temporary failures, such as 429, 5xx, and network timeouts, with exponential backoff. Fix invalid requests or authentication failures before retrying. Reuse the same event_id and original event payload on every retry. Changing usage, cost, metadata, or other event data can create a separate spend record. Store customer keys securely. Treat each Ramp API key like a customer secret. Encrypt it at rest, restrict access, and support rotation or deletion. Scope by customer. Send each customer's events with that customer's Ramp API key. Never batch events for different Ramp customers under one key. Tag every workload. Untagged usage still appears in aggregate spend, but team, project, and cost-center views depend on attribution tags. Avoid prompt content. The unified schema is designed for usage, pricing, and attribution metadata; do not send prompts or completions. Validate with the customer. Send a test model call through your platform and have the customer confirm that usage appears in their Ramp AI Spend dashboard. AI Agents - connect agents to Ramp for actions and auditability after tracking their model spend. AI Index - market-level AI adoption metrics from Ramp's aggregate spend data. Ramp Rate - software adoption and growth metrics across Ramp's network. POST /developer/v1/ai-usage/unified - ingest unified AI usage event batches. Authorization - authenticate API calls and understand OAuth scopes. Errors - handle non-2xx responses and retry safely. Rate limits and timeouts - design callback retry behavior around API limits. --- 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 can optionally obtain 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 can optionally obtain API access to the new business through OAuth. Cross-business client access required Creating an application requires a client that is permitted to access businesses other than its own. Clients restricted to their own business cannot use the create endpoint. Review Partner Integrations to learn about partnership requirements and production access. 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: To capture the applicant's OAuth grant, configure both applications:read and applications:write as allowed scopes and register an HTTPS redirect_uri. Ramp requests both scopes for this application consent flow, even though reading the resulting application only requires applications:read. Three actors: your platform, Ramp, and the applicant. Ramp brokers the email handoff and, when requested, 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 request must include an applicant object with email, first_name, and last_name. You can also provide: application_type: RAMP_SUITE (the default) or BILL_PAY_ONLY. business, financial_details, controlling_officer, and beneficial_owners to pre-fill the application. ownership_acknowledgement to confirm whether all owners with at least 25% ownership are included. manual_bank_account to provide an external bank account for underwriting. oauth_authorize_params to request OAuth authorization after the applicant accepts the invite. 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: Status Description applications.status_updated trigger STARTED Application has been started but has not been submitted for review. No IN_REVIEW Application has been submitted and is under review by Ramp. Yes, when the applicant submits the application. FOLLOW_UPS_REQUIRED Ramp needs additional information from the applicant. APPROVED Application has been approved — the business can start using Ramp. Yes, when Ramp approves the application. REJECTED Application has been rejected. Yes, when Ramp rejects the application. WITHDRAWN Application has been withdrawn by the applicant. Call GET /developer/v1/applications to fetch the current application and its status. Each business can have only one active financing application, so this endpoint returns a single application object, not a list. It 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 when an application enters IN_REVIEW, APPROVED, or REJECTED. Other statuses can be returned by GET /developer/v1/applications but don't currently trigger this webhook. Payload: The event includes the new status in object.status. When you receive the event, call GET /developer/v1/applications to fetch the full application details. Subscribing to this event requires the applications:read scope. 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. Retry 5xx responses and rate-limit responses after an appropriate delay. Resolve other 4xx errors before you retry. 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 Refresh Token Renew access after an Authorization Code grant None after the initial authorization Permission model and scopes Ramp's permission model uses OAuth 2.0 scopes to control access to different resources and operations. Most resource scopes follow the pattern resource:permission where: resource: The API resource (e.g., transactions, bills, users) permission: The allowed operation (read or write) Some scopes use other permissions, such as cards:read_vault. OpenID Connect scopes, such as openid and offline_access, do not use the resource:permission pattern. 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 bank_accounts:write Create and manage bank account information bills:read Bills Access bill data and payment history bills:write Create, update, and pay bills budgets:read Budgets View budget information business:read Business profile Access business information and settings cards:read Cards View physical and virtual card information 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 incorporation:read Incorporation View incorporation information and status incorporation:write Submit and update incorporation information item_receipts:read Item receipts View itemized receipt data item_receipts:write Create and update itemized receipt data funds:read Funds View funds, members, cards, and spending policies funds:write Create and manage funds, members, and suspension state limits:write Card vault compatibility Required with cards:read_vault when creating a card through POST /developer/v1/cards/vault 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 purchase_orders:write Create and update purchase orders 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 reimbursements:write Create and update reimbursement requests spend_programs:read Spend programs Access spend program configuration spend_programs:write Create and manage spend programs statements:read Statements Download monthly statements tasks:read Tasks View task information and status transactions:read Transactions Access transaction data and history transactions:write Update transaction data and accounting information transfers:read Transfers View transfer history and status treasury:read Banking View banking accounts and balance history 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: Bearer tokens prefixed with ramp_business_tok_, ramp_user_tok_, ramp_business_jwt_, or ramp_user_jwt_ Lifetime: Client Credentials access tokens normally last 10 days (864,000 seconds). Authorization Code and Refresh Token access tokens default to 1 hour (3,600 seconds), but individual applications can have a different configured lifetime. Use the expires_in value in the token response. 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. Include the space-separated scope field when your integration needs access to protected resources. If you omit scope, Ramp issues an access token with no scopes. Client Credentials grants do not return a refresh token; request a new access token when the current token expires. 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. Enter your app's values below to generate a URL with properly encoded parameters. The builder uses https://demo.ramp.com/v1/authorize for sandbox and https://app.ramp.com/v1/authorize for production, and sets response_type=code automatically. No client secret is needed. 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 Authorization Code grants can return a refresh token. To use it, first enable the Refresh Token grant type for your application. Then exchange the refresh token for a new access token: The token response includes expires_in, which is the access token lifetime in seconds. refresh_token_expires_in is included only when the response returns a refresh token and your application has a configured refresh-token lifetime. The refresh request above returns a new access token, but not a new refresh token or refresh_token_expires_in. Keep using the original refresh token and retain its expiry, if one was provided; refreshing the access token does not extend that expiry. If the refresh token expires or is revoked, restart the Authorization Code flow. To invalidate an access or refresh token, send a form-encoded request to POST /developer/v1/token/revoke. Authenticate with the same HTTP Basic Auth credentials that you use to create tokens: A successful request returns HTTP 200. 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 normally last 10 days and cannot be refreshed; request a new token when needed. Authorization Code and Refresh Token access tokens default to 1 hour, but their lifetime can vary by application. Use expires_in to schedule renewal. If the response includes refresh_token_expires_in, renew authorization before the refresh token expires. 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: Banking source_url: /developer-api/v1/banking text_url: /llms-guides/banking.txt summary: The account list and balance-history endpoints may receive breaking changes, announced via the Changelog. Submit feedback through a Developer API support ticket. content: The account list and balance-history endpoints may receive breaking changes, announced via the Changelog. Submit feedback through a Developer API support ticket. Read the cash position of a Ramp business — the accounts holding it and how their available balance has moved day over day. A Banking account in this API is any account Ramp holds money in on the business's behalf. The Developer API response schema exposes three account_type values, each one mapping to a customer-facing product: account_type What it is WALLET_ACCOUNT Checking Account — the operating-cash deposit account. A business can have more than one. BROKERAGE_ACCOUNT Ramp Investment Account — a self-directed money market position. Max one per entity. MANAGED_PORTFOLIO_ACCOUNT Managed Portfolio — a fixed-income portfolio managed by Moment Advisors. Currently in limited release. GET /developer/v1/banking/accounts returns the set above for the calling business. GET /developer/v1/banking/accounts/{account_id}/balance-history returns the balance available to the business per day for one account, in canonical minor currency units (cents for USD), filterable with start_date and end_date (ISO 8601). GET /developer/v1/banking/syncable-transactions returns banking transactions available to sync to an accounting provider. The docs, API reference, and endpoint paths group these endpoints under Banking. The OAuth scope currently retains the treasury namespace. Banking is US-only. Cards — card spend draws from the Checking Account when it's the funding source; balances move with each settled charge. Bill Pay — outbound bill payments are funded by the Checking Account. Banking — list accounts, pull per-day balance history, and retrieve syncable transactions. Authorization — treasury:read scope. Pagination — cursor pagination on list endpoints. Monetary values — balances returned in canonical minor units. --- 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: Method What it is Timing 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 Stablecoin Payout to a vendor's crypto wallet, settled on-chain in a stablecoin. Minutes 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. Source endpoint Response field Request field on POST /bills 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, SWIFT, and stablecoin 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, check, or stablecoin). 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, SWIFT, or stablecoin — 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. Source endpoint Response field Request field on POST /bills 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 / stablecoin 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. Six 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, SWIFT, and stablecoin — all require a source_bank_account_id from GET /entities. Method Requirements Timing ACH Verified vendor bank account 2–3 business days Check Vendor address 5–7 business days Wire Same-day (domestic) SWIFT Varies (international) Stablecoin Vendor crypto wallet Minutes (on-chain) 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. 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: at least one active fund. MCP Ramp CLI 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. External MCP client authorization External MCP clients are supported, but you must authorize through the shared Ramp MCP OAuth client, not through your own Developer API OAuth application. 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. If you manage multiple Ramp businesses, add one MCP connection per business. See Ramp MCP for the full setup matrix and multi-business URL pattern. 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. CLI backing endpoints The CLI is built on top of the https://api.ramp.com/agent-tools endpoints. These endpoints are not accessible to external clients. 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 credential is merchant- and amount-scoped, requested immediately before one checkout, and not for subscriptions or later merchant charges; use Virtual Cards for those reusable cases. If you're building with Start here A user-session assistant or terminal agent Run the Agentic Purchase playbook. A company-owned standalone agent Follow the Agentic Payments guide. Standalone agents are in limited early access. Create trips, view trips with status filters, connect transactions to trips, retrieve flight and hotel bookings. 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. Some hosted runtimes rewrite ~/.config/ramp/config.toml on restart, which removes the refresh token. Persist the file outside the rewrite scope or restore it at startup. Treat config.toml like a credential and never commit it to source control. 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. Make purchases with Agent Cards — give an agent a purchase-scoped credential for one approved checkout. Virtual cards — deliver reusable card details to a person or conventional backend through an embedded iframe or the Vault API. Cards — choose between physical cards, reusable virtual cards, and purchase-scoped Agent Cards. 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. Funds — funds that constrain what an agent can spend. Spend Programs — recurring-budget templates for agent purchases. FAQ The https://api.ramp.com/agent-tools endpoints that back the CLI are not accessible to external clients. To connect to Ramp MCP from a third-party client, see the external MCP client authorization guidance above. 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 — physical for employee in-person spend, virtual for reusable payment details, or Agent Cards for one agent checkout. content: Issue cards, attach controls, and watch spend in real time — physical for employee in-person spend, virtual for reusable payment details, or Agent Cards for one agent checkout. How cards work Every Ramp card draws against a fund. Use the Funds API to create or manage funds. Learn more in Spend Controls when you need to configure budgets, recurring programs, or approvals. Card type Use when Documentation Physical card Employee in-person spend. Physical Cards API Virtual card Reusable online, vendor, travel, or recurring details. Virtual Cards, including embedded display and approved Vault retrieval. Agent Card One merchant- and amount-scoped agent checkout. Make purchases with Agent Cards or Agentic Payments for standalone agents. Embedded Cards and Vault are two delivery methods for Virtual Card details. Standard API responses return masked card numbers. A Ramp-served iframe lets a person view card details without exposing the PAN or CVV to your servers. Server-side retrieval through the Vault API requires the cards:read_vault scope and production approval — submit a Developer API support ticket to start the review. All customers can use the Vault API 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. Use the Merchants API to list merchants; there are no create, update, or delete operations. 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 — connect an AI agent through MCP or the Ramp CLI for reads, approvals, edits, and one approved checkout. 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) — physical card lifecycle. Cards (Virtual) — list virtual cards and retrieve their backing funds. Merchants — list the normalized merchants that appear on card transactions. Funds — create, update, suspend, and terminate funds. Virtual cards are issued here. Transactions — settled spend, with filters by card and fund (limit_id currently accepts the fund 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). September 2, 2026 New AI usage endpoint (beta) — Retrieve daily AI usage and spend grouped by provider, model, and product with date-range filtering and cursor pagination. View endpoint New AI team spend endpoint (beta) — Retrieve estimated AI spend by Ramp user with provider, anomaly, and date-range filtering. View endpoint New AI API key spend endpoint (beta) — Retrieve API keys and their estimated spend with provider, status, and date-range filtering. View endpoint Vendor wire beneficiary addresses — Set the optional wire_details.beneficiary_address field when adding wire details to save the recipient's mailing address. If omitted, Ramp may copy the vendor's complete, valid default mailing address. View endpoint August 27, 2026 Vendor name updates — Set the optional name field when updating a vendor to change its display name. The value must contain at least one character. View endpoint August 21, 2026 New vendor contact creation endpoint — Create contacts for existing vendors with a required email and optional first_name, last_name, phone, and is_default fields. Responses indicate whether creation is approved or pending_approval. View endpoint August 20, 2026 Accounting field option lookup by ERP ID — Use the field_remote_id query parameter to list custom accounting field options using the field's ERP remote ID instead of its Ramp UUID. Provide exactly one of field_id or field_remote_id. View endpoint August 19, 2026 Purchase order bill filtering — Use the purchase_order_id query parameter to retrieve bills associated with a specific purchase order. View endpoint Vendor detail requestors — Set requesting_user_id when creating a vendor to choose the requestor recorded on payment or tax detail requests. The deprecated acting_user_id remains accepted but is ignored. View endpoint August 14, 2026 Merchant URL filtering — Use the merchant_url query parameter to filter merchants by a URL or domain. Values are normalized before matching stored merchant domains. View endpoint August 11, 2026 Merchant name prefix filtering — Use the case-sensitive merchant_name query parameter to filter merchants by display name prefix. View endpoint August 10, 2026 Submit draft bills (beta) — Submit an eligible draft bill with POST /developer/v1/bills/drafts/{draft_bill_id}/submit and receive the completed bill in the response. View endpoint Reimbursements ready to sync (alpha) — Alpha support adds REIMBURSEMENT as an object_type for the accounting ready-to-sync endpoint, allowing eligible reimbursements to enter the accounting sync workflow. View endpoint Application description length limit — The business.business_description field on financing applications now accepts up to 250 characters. View endpoint Bank debit trace IDs for bill payments — Bill payment responses now include bank_debit_trace_id with the bank-facing trace ID and descriptor when a bank debit leg is available. List endpoint Fetch endpoint Stable transaction split-line IDs — Transaction split line items now include a nullable id so integrations can reliably identify and reconcile persisted coding lines. List endpoint Fetch endpoint August 3, 2026 Currency-aware transaction amounts — Transaction responses now include entity_amount for the signed settlement amount and merchant_amount for the signed original charge, each expressed in minor units with an explicit ISO 4217 currency code. List endpoint Fetch endpoint Currency-aware initial credit limit — The business response now includes initial_approved_limit_amount in minor units with an explicit USD currency code, or null when no initial limit is approved. View endpoint Currency-aware trip totals — Trip responses now include total_spend_amount as a signed value in minor units with an explicit ISO 4217 currency code. It is null for trips without spend or with mixed or unrecognized currencies. List endpoint Fetch endpoint July 30, 2026 Default entity support for vendors — Set default_entity_id when creating or updating a vendor to associate it with a business entity. Set it to null when updating a vendor to clear the association. Create endpoint Update endpoint Vendor approval status — Vendor details now include approval_status with an APPROVED, PENDING, or REJECTED value. View endpoint Request vendor payment and tax details — Set request_payment_details or request_tax_details when updating a vendor to request missing onboarding information from its default contact. View endpoint July 27, 2026 Decimal lot quantities for item receipts — Item receipt inventory_assignments now use the decimal-capable quantity field instead of unit_quantity, preserving fractional lot quantities without truncation. Create, list, and fetch responses also return each assignment's id, lot_number, quantity, and expiration_date. Create endpoint List endpoint Fetch endpoint Parent vendor association — Set parent_vendor_id when creating a vendor to associate it with an existing parent vendor. View endpoint July 24, 2026 Lot-level item receipt tracking — Add inventory_assignments to item receipt line items with a required lot_number and unit_quantity, plus an optional expiration_date, when receiving lot-tracked inventory. Assignment quantities must sum to the line item's unit_quantity. View endpoint July 23, 2026 Currency-aware transaction decline amounts — Transaction responses now include decline_details.declined_amount with a signed value in minor units and currency in ISO 4217 format, providing a currency-aware companion to the deprecated bare decline_details.amount. The new field may be null when no valid settlement currency is recorded. View endpoint View endpoint July 21, 2026 New crypto wallet bill payment method — Added CRYPTO_WALLET_TRANSFER as an explicit bill payment method so you can create stablecoin wallet payments directly instead of relying on the default payment method. View endpoint Attach crypto wallets to vendors — The vendor bank account update endpoint now accepts a crypto_details option (with wallet_address, network, and optional account_name) to attach a stablecoin wallet as a payout destination. Supported networks include ETHEREUM_MAINNET, BASE_MAINNET, ARBITRUM_MAINNET, POLYGON_MAINNET, SOLANA_MAINNET, and more. The payment_method_type field now includes a crypto value. View endpoint Vendor bank account last four digits — Vendor bank account responses now include account_number_last_four, letting you identify saved accounts without exposing the full account number. View endpoint New audit log event types — Added event types including Change applied, Change became stale, Change rejected, Change submitted for review, Dormant funds automation changed, Meta-approvals turned on, and Meta-approvals turned off. View endpoint New CUSTOMER accounting field option type — Added CUSTOMER as an enum value for accounting field option object types. Purchase order autocoding suggestions — OCR-based purchase order drafts now return purchase_order_autocoding_suggestions, providing suggested tracking category values for both body fields and individual line items. View endpoint Renewal brief on unified requests — Unified request agreement details now include a renewal_brief field with the renewal brief document_id and title when available. View endpoint July 16, 2026 Fetch bill remittance receipts — Retrieve a bill's remittance receipt as a PDF via GET /developer/v1/bills/{bill_id}/remittance-receipt. View endpoint Unscoped client credentials tokens — The scope field is now optional for grant_type=client_credentials requests. If omitted, the returned token has no scopes instead of returning a validation error. View endpoint New currency option — Added the USDSUI enum value to currency fields across bills, entities, and other resources. Clearer default Bill Pay account mapping — The default_bill_pay_payment_account_id field on entities now documents that its bank account UUID can be matched against payment_accounts[].id and accounts[].bank_account_id. View endpoint July 15, 2026 Bill hold and release endpoints (beta) — Block or resume scheduled payments on a bill via POST /developer/v1/bills/{bill_id}/hold (with an optional reason) and POST /developer/v1/bills/{bill_id}/release. View endpoint View endpoint Vendor hold and release endpoints (beta) — Block or resume payments to a vendor via POST /developer/v1/vendors/{vendor_id}/hold (with an optional reason) and POST /developer/v1/vendors/{vendor_id}/release. View endpoint View endpoint Default Bill Pay payment account on entities — Accounting connection responses now include default_bill_pay_payment_account_id, and each account now returns a bank_account_id so you can match the entity's configured default Bill Pay account to its GL account. View endpoint GL account visibility support — General ledger account responses now include a visibility field, and you can set VISIBLE or HIDDEN when updating an account via PATCH /developer/v1/accounting/accounts/{gl_account_id}. View endpoint Audit log time filter aliases — The audit log events endpoint now accepts start_time and end_time as compatibility aliases for from_date and to_date. View endpoint New FedNow payment method — Added FED_NOW enum value for instant FedNow bank transfers across bill and payment schemas. Reimbursement ID on receipts — Receipt responses now include a reimbursement_id field identifying the reimbursement a receipt belongs to. View endpoint Negative tax rates supported — Removed the non-negative constraint on the tax rate field for create, update, and response schemas, enabling reverse-charge rates. View endpoint Expanded business entity types — Application requests now accept COOPERATIVE, CORPORATION, LLC, NON_PROFIT_CORPORATION, OTHER, PARTNERSHIP, and SOLE_PROPRIETORSHIP for entity_type. View endpoint New agreement renewal status — Added PLANNING enum value for vendor agreement renewal status, used to track draft renewals separately from submitted requests. View endpoint New bill pay audit log event — Added the Bill pay marked as unpaid event action to audit log events. View endpoint New iCalendar file type support — Added ics (text/calendar) as a supported file type for documents and attachments. New GL account usage types — Added FIXED_ASSET_ACCUMULATED_IMPAIRMENT_ACCOUNT, FIXED_ASSET_IMPAIRMENT_LOSS_ACCOUNT, and FIXED_ASSET_PROCEEDS_ON_DISPOSAL_ACCOUNT enum values to GL account responses. View endpoint Retainage withholding rate on purchase order line items — Purchase order line items now return a withholding_rate field for retainage-aware workflows. View endpoint OCR-detected currency on spend requests — Spend request OCR responses now include an ocr_detected_currency field showing the raw currency value detected when a fallback occurred. July 6, 2026 New audit log event type — Added Fraud Omni investigation started as a new event type for filtering audit log events, triggered when a fraud investigation is started for a Zendesk ticket. View endpoint Application entity type restricted to LLC — The entity_type field on application creation now only accepts LLC as a valid value. Previously accepted values like CORPORATION, PARTNERSHIP, and others are no longer accepted in requests, though existing applications with those values may still return them in responses. View endpoint New api channel for lead referral partners — Added api as a new enum value for the lead_referral_partner_channel field when creating applications, indicating the partner code was supplied through the Ramp API. View endpoint July 2, 2026 New updated_at field on transactions — Transaction responses now include an updated_at timestamp representing the latest of user transaction time, settlement time, and interaction state update time. This makes it easier to understand exactly when a transaction was last modified, complementing the existing updated_after query filter. View endpoint Vendor memo support for draft bills — You can now include a vendor_memo field (up to 400 characters) when creating or updating draft bills via POST /developer/v1/bills/drafts and PATCH /developer/v1/bills/drafts/{draft_bill_id}. The memo is also returned in bill responses. View endpoint Target payment arrival date for bills — Added target_payment_arrival_date field when creating bills with use_default_payment_method=true. Ramp uses this date to compute the latest payment initiation date needed to target vendor arrival, automatically adjusting if the computed date falls on a weekend, holiday, or past cutoff. View endpoint Ownership acknowledgement for financing applications — The create application endpoint now accepts an ownership_acknowledgement field with values CONFIRM_ALL_MAJOR_OWNERS_ENTERED or CONFIRM_NO_INDIVIDUAL_OWNS_25_PCT, letting you confirm beneficial ownership status during application creation. View endpoint Lead referral partner attribution for applications — New optional lead_referral_partner_code and lead_referral_partner_channel fields on application creation allow agent-reported partner attribution with supported codes like yc, clerky, cofounder_co, and others. View endpoint Retainage details on purchase order line items — Purchase order line items now include a withholding_line_item object with gross_amount, withholding_amount, and withholding_percentage fields for tracking retainage withholding. View endpoint New audit log event type — Added Bill pay accrual synced to the list of supported audit log event types for tracking when bill accruals are synced. View endpoint Currency enum values on transaction amounts — The currency field on transaction amount objects now returns a well-defined enum of ISO 4217 currency codes (plus stablecoin codes like USDC, USDT, EURC), giving you a complete set of possible values for validation and display. June 29, 2026 New AI usage ingestion endpoint — Added POST /developer/v1/ai-usage/unified for broadcasting provider-neutral AI usage event batches to Ramp AI spend analytics. View guide Ownership percentage for beneficial owners — Added ownership_percentage field to the controlling officer and beneficial owner schemas when creating or updating applications, allowing you to specify each individual's beneficial ownership percentage (integer, 0–100). View endpoint Bank account subtype in responses — Bank account objects now include an account_subtype field, providing visibility into whether an account is checking, savings, or another subtype. View endpoint New bank_accounts:write OAuth scope — A new bank_accounts:write scope is available for OAuth token requests, enabling write access to bank accounts for manual ACH account creation workflows. View endpoint Approver groups in custom records native tables — Added approver_groups as a supported native table reference across custom records endpoints, allowing you to reference approver groups in native table columns and result columns alongside users and accounting_field_options. New purchase order fund creation error — Added punchout_order enum value to purchase order fund creation error reasons, indicating that funds cannot be issued for punchout purchase orders. View endpoint June 25, 2026 Original transaction ID for refunds — Transaction responses now include an original_transaction_id field that links refund transactions back to their original transaction. View endpoint Application type selection — The POST /developer/v1/applications endpoint now accepts an application_type field with values BILL_PAY_ONLY or RAMP_SUITE (default), letting you specify whether the business is applying for bill pay only or the full Ramp Suite. The field is also returned on application reads. View endpoint Manual bank account on application creation — You can now provide manual_bank_account details (account number, routing number, account subtype, and balance) when creating an application via POST /developer/v1/applications, enabling bank account setup without external linking. View endpoint Incorporation status on application reads — Application responses now include incorporation_status (with values FORMED, INCORPORATED_EXTERNALLY, INCORPORATING, NOT_INCORPORATED) and needs_incorporation, so you can track whether a business still needs to complete incorporation through Ramp. View endpoint Vendor bank account update response — The POST /developer/v1/vendors/{vendor_id}/update-bank-accounts endpoint now returns a structured response body with vendor_id, payment_method_id, payment_method_type (ach or wire), status (approved or pending_approval), and proposal_id, giving you visibility into whether the update was applied immediately or requires approval. View endpoint New audit log event types — Added several new event types for audit logs: Bill pay submission policy updated, Compliance flag updated, Edited spend allocation request, Flex fee redeemed, Manual redemption redeemed, New vendor approval policy updated, Submission policy updated, and Vendor edit approval policy updated. View endpoint Removed transactions.all_requirements_met_and_approved webhook event — The deprecated webhook event type transactions.all_requirements_met_and_approved has been removed. Use transactions.all_requirements_met_and_approved_changed instead. View endpoint New GL account classification — Added AR_SALES_TAX_PAYABLE_ACCOUNT to the accounting entity GL account classification enum for tracking AR sales tax collected for remittance. View endpoint June 22, 2026 New physical card endpoints (beta) — List, fetch, create, update, terminate, suspend, and unsuspend physical cards via dedicated endpoints under /developer/v1/cards/physical. These new endpoints use fund_id instead of the legacy spend_limit_id and return detailed physical card resources including fulfillment and shipping information. View endpoint New virtual card endpoints (beta) — List and fetch virtual cards via GET /developer/v1/cards/virtual and GET /developer/v1/cards/virtual/{card_id}, returning a streamlined virtual card resource with fund_id, user_id, and suspension status. View endpoint New card vault endpoints (beta) — Create a fund and retrieve sensitive card details via POST /developer/v1/cards/vault, and fetch sensitive card details via GET /developer/v1/cards/vault/{card_id}. View endpoint Multiple vendor addresses — Vendor responses now include an addresses array containing all vendor addresses with id and is_default fields. The existing address field continues to return the default address. View endpoint Improved vendor state field documentation — The vendor state field now clearly specifies it expects a two-letter US state abbreviation (e.g., VA) when the vendor country is US. This applies to both vendor-level and address-level state fields. View endpoint Filter rules for inactive accounting connections — Added optional accounting_connection_id query parameter to GET /developer/v1/accounting/field-option-filter-rules and request body field to the create and delete endpoints, enabling you to manage filter rules belonging to inactive accounting connections. View endpoint PKCE support for OAuth application handoff — Added optional code_challenge field to the application OAuth authorize params, enabling PKCE (S256) security during the authorization flow. View endpoint New webhook event types — Added transactions.all_requirements_met_and_approved_changed, which fires when a transaction's approval and requirements status changes, while keeping transactions.all_requirements_met_and_approved as a deprecated alias. Also added transactions.body_coding_updated, which fires when a transaction's body-level accounting coding is created or changed. View endpoint New audit log event types — Added Accounting fixed asset changed, Accounting fixed asset class changed, Approval policy set as default, and Synced draft policy from workflow event types for audit log filtering. View endpoint New audit log entity types — Added Fixed asset and Fixed asset class as filterable entity types in the audit logs endpoint. View endpoint Tracking category is_erp_sourced field — Tracking category responses now include an is_erp_sourced boolean indicating whether the tracking category exists in the connected ERP system. Purchase order total in business currency — Purchase order line item details now include total_amount_details_in_business_default_currency for the amount converted to the business's default currency. .xlsm file support — Macro-enabled Excel files (.xlsm / application/vnd.ms-excel.sheet.macroEnabled.12) are now accepted for receipt and document uploads. Card state descriptions — The card state enum now includes descriptions for each value: ACTIVE, CHIP_LOCKED, SUSPENDED, TERMINATED, and UNACTIVATED. June 11, 2026 New all_requirements_met_and_approved field on transactions — Transaction responses now include an all_requirements_met_and_approved boolean indicating whether the transaction is fully approved and all cardholder requirements (receipts, memos, tracking categories) are met. View endpoint New webhook event types for transactions — Added transactions.all_requirements_met_and_approved (fires when a transaction is fully approved with all required items completed) and transactions.receipt_added to the list of subscribable webhook events. View endpoint New fund_id field on bill card payment details — Bill responses now include fund_id in card payment details, which identifies the fund associated with the payment. The existing spend_limit_id field continues to be returned but is now marked as deprecated. View endpoint Acting on behalf of another user when creating vendors — Added optional acting_user_id field to POST /developer/v1/vendors to specify which Ramp user is recorded as the requestor. This user is used for approval policy evaluation. Requires admin or owner privileges on the OAuth token. Defaults to the token owner when omitted. View endpoint Include draft vendors when listing — Added include_draft query parameter to GET /developer/v1/vendors. When set to true, the response includes vendors that are still in draft state or pending creation approval — useful for deduplicating by external_vendor_id immediately after creating a vendor on businesses with vendor approval policies enabled. Defaults to false. View endpoint New banking endpoints (beta) — List all banking accounts for your business via GET /developer/v1/banking/accounts and retrieve daily balance history for a specific account via GET /developer/v1/banking/accounts/{account_id}/balance-history. These replace the previous /developer/v1/treasury/ paths. View endpoint List syncable banking transactions — Retrieve banking transactions available for syncing to an accounting provider via GET /developer/v1/banking/syncable-transactions, with filtering by entity_ids, start_date, end_date, and include_synced_transfers. View endpoint New Ticket approvers updated audit log event type — Added Ticket approvers updated to the list of audit log event types, fired when a ticket's approvers are changed. View endpoint Memo field max length constraint removed — The memo field on transaction responses no longer advertises a maxLength of 255, reflecting that memos may exceed that length. June 9, 2026 New fund_id field on transactions — Transaction responses now include a fund_id field that returns the unique identifier of the fund associated with the transaction. The existing limit_id field is deprecated and returns the same value as fund_id. View endpoint New fund_id field on reimbursements — Reimbursement responses now include a fund_id field identifying the fund to which the reimbursement is attributed. The existing spend_limit_id field is deprecated and returns the same value as fund_id. View endpoint New display_name field on accounting field options — Accounting field option objects across transactions, bills, reimbursements, vendor credits, and purchase orders now include a display_name field. When a customer renames an option inside Ramp, display_name returns the Ramp-side label while name continues to return the original ERP-sourced name. Returns null if no override is set. View endpoint Bank account connection provider filtering — Added the connection_provider query parameter to the List Bank Accounts endpoint, letting you filter by how the account was connected (e.g., plaid, manual, finicity, teller, ramp_wallet, ramp_brokerage). View endpoint New connection_provider field on bank accounts — Bank account responses now include a connection_provider field indicating the provider used to connect the account (e.g., plaid, manual, teller). View endpoint June 8, 2026 Purchase order owner assignment — You can now set the owner_id field when creating a purchase order to specify the owner, instead of defaulting to the API caller. View endpoint Retainage withholding on purchase orders — Purchase orders now support retainage withholding via the new withholding_default_rate field on the purchase order and withholding_rate on individual line items. These fields are available when creating, updating, and reading purchase orders. View endpoint Retainage withholding on bills — Bill line items now include withholding_line_item details (with gross_amount, withholding_amount, and withholding_percentage), and bills include an is_withholding_release field indicating whether a bill is a retainage release. View endpoint Purchase order line item dates — Purchase order line items now include start_date and end_date fields indicating the spending window for each line item. View endpoint Purchase order line item custom fields — Purchase order line items now return custom_field_values with the saved custom field selections for each line item. View endpoint Receipt OCR tax data — Receipt OCR responses now include a taxes array with extracted tax_name, tax_rate, and tax_amount for each tax found on the receipt. View endpoint New bills.updated webhook event — Subscribe to the bills.updated event type to receive notifications when bills are updated. View endpoint Incorporation support for applications — Added needs_incorporation field to the create application request body, allowing you to indicate that a business still needs to be incorporated through Ramp's partner. When true, incorporation details (legal name, EIN, date and state of incorporation) must be omitted. View endpoint Ramp checking account flag on applications — Application responses now include an open_ramp_checking_account field indicating whether the applicant is applying for a Ramp checking account. View endpoint New audit log event types — Added Cash application agent action and Check PDF downloaded enum values for audit log event filtering. View endpoint New GL account types — Added FIXED_ASSET_GAIN_ACCOUNT and FIXED_ASSET_LOSS_ACCOUNT enum values for accounting GL account configuration. New OAuth scopes — Added budgets:read, incorporation:read, and incorporation:write OAuth scopes for budgets read access and incorporation lifecycle management. June 1, 2026 New treasury accounts endpoint (beta) — List all treasury accounts for your business, including wallet, brokerage, and managed portfolio accounts. Filter results with start and page_size pagination parameters. View endpoint New treasury balance history endpoint (beta) — Retrieve daily available balance snapshots for a specific treasury account, with optional start_date and end_date filtering in ISO 8601 format. View endpoint Upload accounting entities (beta) — New endpoint to upload up to 500 ERP subsidiaries/entities in a single request, enabling entity-level scoping for accounting fields, vendors, GL accounts, and more. View endpoint Entity selection setting for accounting connections — Added entity_selection_enabled to accounting connection settings, available when creating (POST) or updating (PATCH) a connection. This controls whether ERP entity selection is active for API-based accounting connections. View endpoint Entity scoping for GL accounts — Added entity_remote_ids field to create, update, and list GL account endpoints, letting you scope GL accounts to specific ERP entities. View endpoint Entity scoping for accounting vendors — Added entity_remote_ids field to create, update, and list accounting vendor endpoints, so vendors can be restricted to specific ERP entities. View endpoint Entity scoping for tax code options — Added entity_remote_ids field to create, update, and list tax code option endpoints, allowing tax codes to be scoped to specific ERP entities. View endpoint Custom record fields on entities — Added include_custom_field_values query parameter to GET /developer/v1/entities and GET /developer/v1/entities/{entity_id}. When set to true, the response includes a custom_record_fields array with custom field values for each entity. View endpoint Purchase order line item custom fields — The purchase order detail response now includes custom_field_values on each line item, returning saved custom field data. View endpoint Spend program line item custom fields — The spend program detail response now includes a line_item_custom_fields array, showing each enabled custom field's ID, display name, type, description, and whether it's required. View endpoint New accounting field selection source — Added AI_AUTOCODING enum value to the source field on accounting field selections, indicating a selection was assigned by AI purchase order autocoding. New audit log event type — Added Status updated by intake agent event type for tracking when an accounts receivable customer status is updated by the intake agent. View endpoint May 28, 2026 Parent vendor ID on vendor responses — Vendor endpoints now include a parent_vendor_id field, making it easy to identify vendor parent-child relationships directly from the API. View endpoint Network merchant ID on transactions — Transaction responses now include a network_merchant_id field containing the card acceptor merchant identifier from the payment network (e.g., Visa), or null when unavailable. View endpoint Entity scoping for accounting field options — The entity_remote_ids field is now returned on GET /developer/v1/accounting/field-options responses and accepted on POST and PATCH requests, letting you scope field options to specific business entities. View endpoint Entity scoping for inventory item options — Inventory item option endpoints now support entity_remote_ids on POST, PATCH, and GET operations, enabling per-entity availability control for inventory items. View endpoint Child vendors endpoint — List child vendors of a parent vendor via GET /developer/v1/vendors/{vendor_id}/children. View endpoint Funds API (beta) — A full suite of endpoints for managing funds, including creating, listing, updating, terminating, suspending/unsuspending funds, and managing fund members. Funds can be linked to spend programs or configured standalone with spending restrictions, permitted spend types, and accounting rules. View endpoint Field option filter rules (beta) — New endpoints to bulk create, list, and bulk delete field option filter rules, which define conditional visibility of accounting field options based on selections in other fields. View endpoint ERP migration readiness endpoint — Mark an inactive API-based accounting connection as ready to migrate via POST /developer/v1/accounting/connection/{connection_id}/ready-to-migrate, enabling the ERP migration flow UI for your customers. View endpoint Transaction update endpoint (beta) — Update transactions via PATCH /developer/v1/transactions/{transaction_id} to create, replace, or remove line item splits with accounting field selections and memos. View endpoint Treasury syncable transactions endpoint — List treasury transactions available for syncing to an accounting provider via GET /developer/v1/treasury/syncable-transactions, with filtering by date range, entity, and sync status. View endpoint New audit log event types — Added Internal impersonation upgraded to read-write, Preview mode entered, Spend settings updated, Vendor parent set, and Vendor parent unset to the audit logs event_type enum. View endpoint Sync status enum descriptions — The sync_status filter parameter on transactions, reimbursements, transfers, and cashbacks now includes descriptions for NOT_SYNC_READY, SYNCED, and SYNC_READY values. May 21, 2026 Receipt OCR data now available — You can retrieve structured OCR data (currency code and line items with name, date, quantity, unit price, and total price) from receipts by passing the include_ocr_data query parameter on the List Receipts and Get Receipt endpoints. View endpoint Entity scoping for accounting field options — When creating field options via POST /developer/v1/accounting/field-options, you can now pass entity_remote_ids to restrict an option to specific entities. When updating via PATCH /developer/v1/accounting/field-options/{field_option_id}, you can set, reset (with null), or leave entity scoping unchanged. View endpoint Fund filtering by member role — The member_roles query parameter on GET /developer/v1/funds accepts OWNER, COOWNER, and MEMBER values. Use this with user_id to filter funds by a user's access role. View endpoint GOVERNMENT_ENTITY removed from application entity types — The GOVERNMENT_ENTITY enum value is no longer accepted for the entity_type field when creating applications via POST /developer/v1/applications. Requests using this value will now fail validation. View endpoint Currency code renamed from OUSD to OPEN_USD — The currency enum value OUSD has been renamed to OPEN_USD across all endpoints that accept or return currency codes. Renamed "Business Account" to "Checking Account" — Default account_name values in vendor ACH and wire bank account request bodies now default to Checking Account instead of Business Account. The audit log event Business Account terms accepted has been renamed to Checking Account terms accepted. New audit log event types — Added Bill pay rejected PDR bank account ownership match, External agent key created, External agent key revoked, External agent key updated, and Initiated digital wallet provisioning (audit) as filterable event types. The previous Agent key created, Agent key revoked, and Agent key updated values have been replaced by their External agent key counterparts. View endpoint New spend request action and denial reasons — Purchase order spend requests now include a send_pdf_to_vendor available action, and the agreement linking denial reasons include a new punchout_order value indicating agreements are not supported for punchout purchase orders. Punchout order ID on purchase order line items — Purchase order line item responses now include a punchout_order_id field. May 19, 2026 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 fund and card display name descriptions — A fund's display_name is separate from each linked card's display_name. The display_name query parameter on the List Funds endpoint filters by the fund's display name. View endpoint May 18, 2026 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. May 11, 2026 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 May 8, 2026 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 May 6, 2026 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 April 30, 2026 Card expiration in Vault API response — GET /developer/v1/cards/vault/{card_id} 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 April 28, 2026 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. April 27, 2026 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. April 17, 2026 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. March 30, 2026 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 spend allocations — The allowed_overage_percent_override field allows a fund-level override for the allowed overage percent, independent of the spend program or business default. 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 March 25, 2026 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. March 19, 2026 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 March 18, 2026 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. March 17, 2026 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 March 16, 2026 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. March 12, 2026 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 funds — Fund responses include is_exempt_from_policy_agent, which you can update via PATCH. 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. February 27, 2026 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. February 13, 2026 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 February 12, 2026 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 funds by card — Use the card_id query parameter on the List Funds endpoint to filter for funds 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. February 11, 2026 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 February 10, 2026 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. February 5, 2026 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. February 3, 2026 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 January 30, 2026 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. January 28, 2026 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. January 22, 2026 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. January 16, 2026 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. January 14, 2026 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. January 6, 2026 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. January 5, 2026 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 December 23, 2025 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. December 11, 2025 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 December 4, 2025 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. November 28, 2025 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. November 26, 2025 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. November 24, 2025 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. November 20, 2025 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 November 18, 2025 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. November 12, 2025 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 November 10, 2025 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. November 7, 2025 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. November 4, 2025 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 October 31, 2025 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. October 30, 2025 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 legacy spend allocation creation — Added an accounting_rules parameter to set accounting rules when creating or updating spend allocations 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. September 25, 2025 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 the legacy spend allocation response — Added cardholder_id, cardholder_name, created_at, and display_name fields to its card data. Legacy spend allocation role filter — Added a user_access_roles query parameter for role-based filtering. Minor unit conversion factor in currency response — Currency data now includes conversion factors for precise calculations. August 8, 2025 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 June 25, 2025 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 fund increases — Use PATCH /funds/{fund_id} to implement temporary spending 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 for legacy spend allocations — Added custom form metadata to Vendors, Purchase Orders, Transactions, and legacy spend allocation responses. May 16, 2025 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 April 29, 2025 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 March 25, 2025 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 February 25, 2025 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 January 17, 2025 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 May 2024 Deprecation Notice: Legacy Cards API Deprecated: Ramp is transitioning from the legacy Cards API to the Funds and type-specific Cards APIs Use the Funds API for virtual card issuance and fund lifecycle management Funds support one-to-many relationships between funds and cards, including shared funds across users Use the Cards (Physical) API for physical card creation, shipping, and lifecycle management --- 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. Flag Behavior --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. Command Description 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] Resource Tools 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: Conferma Onboarding Request source_url: /developer-api/v1/conferma-onboarding-request text_url: /llms-guides/conferma-onboarding-request.txt summary: No summary content: --- 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. column_name Contents Example 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. Project 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: Identifier Example 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. Error Code Message Cause 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. Merchant Vendor (Bill Pay) Accounting Vendor 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, such as creating a user, require asynchronous processing. These endpoints include /deferred in the request URL. content: Some API calls, such as creating a user, require asynchronous processing. These endpoints include /deferred in the request URL. For these tasks, the API returns immediately with a task ID. Use that ID with the status endpoint for the same resource. For user creation, the status endpoint is GET /developer/v1/users/deferred/status/{task_id}. For example, POST /developer/v1/users/deferred starts an asynchronous task that sends a user invitation. The invited user must accept the invitation to complete onboarding. The initial request returns the task ID with a 201 Created response. This means that asynchronous task processing has started. Request the task status at GET /developer/v1/users/deferred/status/eca553b8-6923-42b2-aea9-8f3c15b079ff. Both the creation endpoint and the status endpoint require the users:write OAuth scope. The following information is made available: status: Represented by one of the following - STARTED, IN_PROGRESS, ERROR, SUCCESS. data: Additional task details. For a successful user creation task, data.user_id contains the user ID. For a failed task, data.error contains the error message. context: Information about the initial request, such as acting_user_id. 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, directory, or API operation. Accepted inputs include docs URLs, guide slugs, virtual paths, operation IDs, METHOD /developer/v1/..., and bare endpoint paths. If the resolved artifact is a directory, use developer_docs_list with the returned path to browse its children. 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. For multi-entity accounting integrations, set settings.entity_selection_enabled to true before you scope uploaded accounting options to ERP entities. Set it when you create the connection, or later with PATCH /developer/v1/accounting/connection/{connection_id}. You still need to use entity_id filters when reading entity-specific objects from list endpoints. 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. Batch uploads accept up to 500 items per request, all-or-nothing per batch. ERP object Required? Endpoint 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) Optional for API-managed multi-entity scoping Entity management in the Ramp UI is unchanged. Sync ERP entities through POST /accounting/entities only when your integration needs entity_remote_ids filtering. 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. Multi-entity option availability For multi-entity customers, sync the ERP entity list with POST /accounting/entities, then include entity_remote_ids on the accounting options that should only be available for specific entities. Entity scoping is supported on GL accounts, custom field options, accounting vendors, tax code options, and inventory item options. Use the ERP entity IDs you synced through POST /accounting/entities: When field option filter rules are also configured, Ramp applies both constraints: entity scoping controls which options are available for the selected entity, and filter rules narrow those entity-eligible options based on other tracking-category selections. Keep entity_remote_ids aligned across related fields when a rule spans multiple tracking categories, such as Project → Task or Project + Task → Cost Type. Field option filter rules Field option filter rules are in Beta Flow and endpoints may receive breaking changes, announced in the Changelog. Field option filter rules let you control which accounting field options are shown to employees based on selections they've already made. This reduces errors and keeps codings valid by dynamically narrowing available options as a user fills in their expense. This guide walks through a common real-world setup: Project → Task: selecting a project limits which tasks are available Project + Task → Cost Type: selecting both a project and a task limits which cost types are available For multi-entity setups, first scope each option with entity_remote_ids as described in Multi-entity option availability. Then add filter rules for the cross-tracking-category dependencies within those entity-eligible options. How rules work Each filter rule has: A target field option — the option that becomes conditionally available One or more required selections — the trigger field + option combination(s) that must be met Logic: Multiple required_selections within a single rule use AND logic (all must be satisfied) Multiple rules for the same target option use OR logic (any one being satisfied is enough) Required scopes: accounting:read, accounting:write Rules reference fields and options by their ERP-backed remote_id, so upload the fields and field options first with POST /accounting/fields and POST /accounting/field-options. The first two rules make task_development available when either project_alpha or project_beta is selected. The third rule makes cost_type_labor available only when both project_alpha and task_design are selected. Use the same endpoint family to manage rules: Operation Notes GET /accounting/field-option-filter-rules Lists rules. Filter by target_field_remote_id or target_field_option_remote_id; use page.next for pagination. POST /accounting/field-option-filter-rules Bulk creates rules and returns created_count plus duplicate_count; duplicates are no-ops. DELETE /accounting/field-option-filter-rules Bulk deletes rules and returns deleted_count plus not_found_count; valid rule combinations that never existed are counted as not found, not errors. Create and delete requests validate the full batch before applying it. If any field or option remote_id cannot be resolved, the entire request fails and no valid rules in the same batch are applied. Validate large batches against the field and field-option list endpoints before submitting them. Field option lifecycle and filter rules Filter rules reference field options by remote_id. When a field option is deactivated or reactivated, Ramp adjusts which rules are enforced — but rules are never silently deleted by field option lifecycle events. Deleting a field option When a field option is deleted via DELETE /developer/v1/accounting/field-options/{field_option_id}, the deletion is a soft delete — the option becomes inactive and its remote_id is reserved. Any filter rules referencing that option are suspended: they remain in Ramp's system but are not enforced. They will not appear in filtered list queries (e.g. ?target_field_option_remote_id=...) because the option can no longer be resolved. You will also not be able to create new rules referencing a soft-deleted option's remote_id — doing so returns DEVELOPER_7123. Reactivating a field option A soft-deleted option can be restored via PATCH /developer/v1/accounting/field-options/{field_option_id} with reactivate: true: Response: When a field option is reactivated, all previously suspended filter rules referencing it automatically resume enforcement. No manual rule recreation is needed. Summary of lifecycle behavior: Event Rule behavior Field option soft-deleted Associated rules suspended (not deleted — not enforced, not returned in filtered queries) Field option reactivated (reactivate: true) Associated rules automatically resume New option created with same remote_id Not possible — remote_id is reserved after soft delete Common error codes: Code Meaning Fix DEVELOPER_7122 A trigger_field_remote_id or target_field_remote_id does not match an uploaded accounting field. Verify field remote_id values with GET /accounting/fields; upload missing fields before retrying. DEVELOPER_7123 A trigger_field_option_remote_id or target_field_option_remote_id does not match an active uploaded option for that field. Verify options with GET /accounting/field-options; confirm each option belongs to the referenced field and is active. DEVELOPER_7001 Request payload validation failed, such as an empty rules array or missing required field. Use error_v2.additional_info.rules to locate the invalid rule index and field. Rule batches must contain 1 to 1,000 rules. 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. Delete (deactivate) Hide 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. Limit per call 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) can still be created and managed directly in the Ramp UI. If your integration needs to drive entity-based filtering for accounting options, sync the ERP entity list with POST /accounting/entities and reference those ERP entity IDs in entity_remote_ids. 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. Object Ready when 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 Query 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: Split transaction line items Use transaction splits when your external system needs to allocate one Ramp card transaction across multiple cases, departments, GL accounts, projects, or other ERP-backed dimensions. Each split line item carries its own amount, optional memo, and accounting field selections. Before updating splits, make sure the customer has a connected accounting provider and your OAuth app has both transactions:read and transactions:write. You'll also need the transaction id and the ERP-backed external IDs for the accounting fields and options you want to apply. The update flow is: Fetch the transaction you want to update. Build one line item per split. PATCH /developer/v1/transactions/{transaction_id} with the full desired line_items array. Verify the response includes the updated transaction and split details. line_items controls the transaction's split state: Request value Behavior Array of line items Creates splits or fully replaces existing splits. null Removes all splits and returns the transaction to its unsplit state. Omitted Leaves existing splits unchanged. Line item amounts must sum exactly to the original transaction amount. When line_items is provided, Ramp treats the array as the full desired split state — don't send a partial subset unless you intend to remove the omitted splits. Each line item has: Field Description amount Yes Amount in cents. For example, 5000 represents $50.00. memo Memo for this split, such as a case ID, department note, or internal description. accounting_field_selections Accounting field assignments for this split. Pass an empty array if no fields should be assigned. Each accounting field selection has: field_external_id External ID of the accounting field from the ERP or accounting provider. field_option_external_id Conditional External ID of the selected field option. Required when free_form_text is not provided. free_form_text Free-form field value. For date fields, use YYYY-MM-DD. Required when field_option_external_id is not provided. Provide exactly one of field_option_external_id or free_form_text for each accounting field selection. To remove every split from a transaction, send line_items: null: Splitting is allowed only when the transaction is eligible, the business has a connected accounting provider, and the transaction has not already been synced to the ERP. Tax amounts are not supported on split updates; when splits are created or replaced, existing tax amount data on the transaction is cleared. Validation failures, such as split amounts not summing to the transaction total or a missing required field, return 400 DEVELOPER_TRANSACTION_INTERACTION_FAILED. If the transaction cannot be split, Ramp returns 403 DEVELOPER_TRANSACTION_SPLIT_NOT_ALLOWED. A missing transaction returns 404. Update accounting codings Use POST /accounting/codings when your integration needs to write a transaction's accounting selections back into Ramp. Today this endpoint supports card transactions: pass object_type: "TRANSACTION", the transaction id as object_id, and one or more accounting_coding_selections. Each selection points at the Ramp IDs for the accounting field and option you uploaded earlier — use ramp_id values, not ERP remote IDs. For free-form fields, send free_form_text instead of an option ID. 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: sync_ready sync_status status Post 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: Category What you show Example 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 Entities — upload ERP entities for multi-entity accounting option scoping. Accounting Field Option Filter Rules — define cross-tracking-category option availability rules. 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, metadata, and split line items 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 handling of fields that are not in the endpoint specification depends on the endpoint and its request schema: Some endpoints ignore unknown query parameters or request body fields. Other endpoints reject unknown fields and return a validation error. This also applies to some nested request objects. A request must include all required fields and satisfy the validation rules for the endpoint. Do not rely on unknown fields being accepted or ignored. Validate each request against the endpoint specification, and correct misspelled or unsupported field names. 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. HTTP Status Description 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 sandbox access. 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. Environment API base URL Ramp app URL 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. Use expires_in to determine how long the token is valid, in seconds. Client Credentials access tokens expire after 10 days. Client Credentials grants do not return a refresh token; request a new access token when the current token expires. The scope parameter is required for this example. If you omit it from a Client Credentials request, Ramp issues a token with no scopes, which cannot call the Transactions endpoint. 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: Incorporation source_url: /developer-api/v1/incorporation text_url: /llms-guides/incorporation.txt summary: Approved private-preview partners can form a US LLC or, when separately enabled, a C-Corp through Ramp's incorporation provider and track the formation to completion. This workflow requires a Ramp-enabled agent-led application flow and a financing application submitted for review. content: Approved private-preview partners can form a US LLC or, when separately enabled, a C-Corp through Ramp's incorporation provider and track the formation to completion. This workflow requires a Ramp-enabled agent-led application flow and a financing application submitted for review. Private preview only Incorporation is not generally available and is not included in the public API reference. Ramp must explicitly enable both your incorporation access and an eligible agent client before you can use this workflow. Standard public application integrations cannot initiate incorporation, and the endpoints return 404 when incorporation access is disabled. Contact your Ramp representative to request access and onboarding instructions. A partner-led company-formation flow: Look up the reference data the provider needs — supported countries, states, and NAICS industry codes. Create an applicant for the business. Submit an LLC formation using the submitted financing application as the source of business, ownership, responsible-party, address, and tax details. Poll company status until the formation is approved. Retrieve the formation documents. Private-preview access: Ramp must enable the incorporation rollout and configure an eligible agent client for your integration. Public application clients and standard application-creation requests do not support this workflow. Scopes: After Ramp approves and enables access, use incorporation:read for reference data, applicant lookup, status, and documents; use incorporation:write to create an applicant or submit a formation. An applicant must exist and the financing application must be submitted for review before you submit a formation. SSN is never sent to this API The formation endpoint does not accept full SSNs. Required tax-identifier details come from the submitted financing application and are handled server-side. Two actors plus the provider: your platform, the Ramp API, and the incorporation provider (brokered by Ramp). Implementation Three read endpoints supply the values the formation request must reference: GET /developer/v1/incorporation/countries — supported countries for applicant nationality / residence (ISO 3166-1 alpha-2 codes). GET /developer/v1/incorporation/states — US states available for formation, each with an abbreviation and name. GET /developer/v1/incorporation/industries?search= — NAICS industry codes, optionally filtered by a case-insensitive substring over the code or label. POST /developer/v1/incorporation/applicant with the business's country of residence. The applicant's name and email come from the authenticated business context, so the body is just: The call is idempotent per business: a 201 means the applicant was created, a 200 means it already existed (already_existed: true) — no duplicate is made. POST /developer/v1/incorporation/formation. The submitted financing application supplies the business, owners, responsible party, addresses, and tax details. You can optionally provide state to override or complete the application data. For LLC formations, you can also optionally provide one or more name_options; C-Corp formations require a nonempty name_options list. A request naics_code is used only when the financing application does not already contain a NAICS code; an existing application value always takes precedence. If you provide explicit LLC members, their ownership percentages must sum to 100. If the submitted financing application does not identify any owners, include the optional members field with ownership percentages totaling 100: entity_type defaults to LLC. When C-Corp formation is enabled, use "entity_type": "CCorp" and provide the required name_options, executive_members, and ccorp_valuation fields. Include at least one name option, even if the financing application already has a business name. A 201 returns the provider company id and the submission status: Safe to retry Submissions are idempotent per business and attempt. A failed submit persists its attempt count so the next retry uses a fresh idempotency key. GET /developer/v1/incorporation/company-status returns the live status from the provider and refreshes Ramp's cached copy: Status Meaning NOT_SUBMITTED Not yet submitted to the provider. SUBMITTED Filed with the state and waiting for an EIN. Available when pre-EIN onboarding is enabled; the response also includes pre_ein access details. PENDING_REVIEW Submitted; under provider review. APPROVED Approved; the company is formed. REJECTED Rejected — see last_rejection_reason. GET /developer/v1/incorporation/documents lists the formation documents with freshly-signed download URLs (regenerated on every call, so don't cache them): HTTP Code When 502 DEVELOPER_INCORPORATION_PROVIDER_ERROR The provider returned an error or was unreachable. 400 DEVELOPER_INCORPORATION_FIELDS_MUTUALLY_EXCLUSIVE The approved agent-led application flow combines incorporation intent with pre-formed company fields. 409 DEVELOPER_INCORPORATION_ALREADY_FORMED The resolved business is already formed. --- 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: Add Redirect URI to Ramp MCP source_url: /developer-api/v1/mcp-redirect-whitelist-request text_url: /llms-guides/mcp-redirect-whitelist-request.txt summary: No summary content: --- title: Monetary Values source_url: /developer-api/v1/monetary-values text_url: /llms-guides/monetary-values.txt summary: Most Ramp API monetary values use integers in the smallest denomination of the relevant currency. The field names and supported currency identifiers depend on the endpoint's schema. Standard currencies such as USD, EUR, and JPY use ISO 4217 codes. Some schemas also support stablecoin identifiers such as USDC, which can be used for eligible stablecoin Bill Pay payments. A currency's presence in a schema does not mean every payment method supports it. content: Most Ramp API monetary values use integers in the smallest denomination of the relevant currency. The field names and supported currency identifiers depend on the endpoint's schema. Standard currencies such as USD, EUR, and JPY use ISO 4217 codes. Some schemas also support stablecoin identifiers such as USDC, which can be used for eligible stablecoin Bill Pay payments. A currency's presence in a schema does not mean every payment method supports it. Some endpoints use other representations. For example, AI Usage accepts reported_cost.amount as a decimal string. Always use the amount format and currency values documented for the specific endpoint. Amount objects Some monetary fields use an object with value and currency. The value is an integer in the smallest denomination of the currency. Some fields permit negative values for refunds or credits. Follow the endpoint's schema for the permitted values. 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 convert a major-unit amount to minor units, multiply it by 10 raised to the power of D, where D is the number of decimal places for the currency. For standard currencies, see 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: Currency Example Amount (Minor Units) Precision (Decimal Places) USD 4000 ($40.00) 2 EUR 10000 (€100.00) JPY 5000 (¥5000) 0 GBP 2500 (£25.00) This example schema describes an amount field that permits only non-negative values: Some endpoints, including Banking balance history, use amount for the minor-unit integer and currency_code for the currency. Responses also include the read-only minor_unit_conversion_rate, which can be null when a conversion rate is unavailable. Divide amount by minor_unit_conversion_rate to obtain the major-unit value when the conversion rate is present. For requests that use these fields, send amount and, when needed, currency_code; do not send the response-only conversion rate. Always follow the schema for the specific endpoint. 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. Use the complete URL in the next field to request the next page. The URL includes the start cursor and preserves the other query parameters required for the current result set. Treat the cursor as opaque instead of constructing or changing it yourself. 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. For endpoints that support the standard page_size parameter, the default page size is 20 and the maximum is 100. Check the specification for the endpoint before you assume it uses the standard pagination contract. --- 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, create them with the Comments API: POST /developer/v1/comments/{object_type}/{object_id}. Use object_type=spend-requests and the Ramp spend_request_id as object_id. To mirror Ramp discussion updates into your system, call GET /developer/v1/comments/{object_type}/{object_id} with the same path values. These calls 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/{object_type}/{object_id} List comments on a spend request's discussion thread with object_type=spend-requests. Post a reviewer comment to Ramp's discussion thread with object_type=spend-requests. /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. Comments on spend requests require spend_requests:read or spend_requests:write plus procurement access. Purchase order reads require purchase_orders:read and Ramp Plus. 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 with object_type=spend-requests and the Ramp spend_request_id as object_id. 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 datasets — Ramp Rate software benchmarks and AI Index business AI adoption metrics — to MCP-compatible clients. content: The Ramp Data MCP server exposes Ramp's datasets — Ramp Rate software benchmarks and AI Index business AI adoption metrics — to MCP-compatible clients. 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. Ramp Data requires provisioned access. Apply to the Ramp Data Partner Program to request credentials. Set RAMP_DATA_API_KEY in your environment before using the Claude Code or Cursor examples. For Claude Desktop, replace in the config. Connect a client Add the Ramp Data MCP server to your Claude Code session: Run /mcp in your session to verify the connection. Add the server 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 and send your provisioned API key in the Authorization: Bearer header. 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. Need a custom MCP client or gateway? 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. Submit and complete expenses — let employees submit expenses and reimbursements, complete required details, and move their own reimbursement requests forward. 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 — generate Agent Card credentials. See Make purchases with Agent Cards for setup and purchase fit. 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. If you manage more than one Ramp business, create one MCP connection per business. Ramp treats any unused path in the form https://mcp.ramp.com//mcp as an alias for the production Ramp MCP server, so each client connection can keep its own OAuth session. Use a memorable identifier for each business. For example: Acme Corporate Ramp MCP: https://mcp.ramp.com/acme-corporate/mcp Acme Europe Ramp MCP: https://mcp.ramp.com/acme-europe/mcp Then authenticate each connection while signed in to the matching Ramp business. The identifier in the URL is only a client-side label and routing alias; Ramp permissions still come from the authenticated user and selected business. Do not use developer, employee, mcp, ramp-data, or ramp-rate as business identifiers. Those paths are reserved for Ramp MCP servers or legacy routes. 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. Open the redirect URI whitelist request form to submit your custom MCP client or third-party gateway for review. 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 Unsupported redirect URI: Custom MCP clients and third-party gateways must have their exact redirect URI allowlisted by Ramp before the OAuth flow can complete. "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 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. 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. Ramp Data requires provisioned access. Apply to the Ramp Data Partner Program to request credentials. Base URL: https://api.ramp.com/v1/public/ramp-rate Endpoint Description 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: Parameter Type Default 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. Tool 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 limit applies to requests made during the preceding 10 seconds. Each request stops counting after its own 10-second window expires. 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, you reach the limit, and subsequent requests can return a 429 response. The requests from 10:00:00 stop counting after approximately 10:00:10. Requests made at other times stop counting as their individual 10-second windows expire. 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 the timestamp of your last successful sync and use an available date filter where its meaning matches your use case. A creation-date filter only finds newly created records. The transaction synced_after filter only finds transactions that have been synced to an accounting system after the specified time; it is not a general updated-at filter. Different endpoints expose different filtering capabilities: Endpoint Incremental param Catches updates to existing records? Notes GET /developer/v1/transactions synced_after Only accounting sync events Returns transactions with an accounting sync commit at or after the specified time. It does not return every new, changed, or late-posted transaction. GET /developer/v1/bills from_created_at New records only No updated-at filter. Use webhooks or periodic full re-pulls to detect status changes such as payments and approvals. GET /developer/v1/purchase-orders Use webhooks or periodic full re-pulls to detect updates to existing purchase orders. For transaction changes that are not accounting sync events, use the relevant webhook events or periodically reconcile the full dataset. Do not treat synced_after as a replacement for an updated-at filter. Period Suggested interval 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 maximum page size of 100 items, the theoretical maximum is 120,000 records per minute. Actual throughput depends on endpoint latency, available records, and other requests that share the same limit. --- 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. For a BUSINESS_TO_USER reimbursement in a foreign currency, the original expense amount and the amount paid to the employee can use different currencies. Field Meaning line_items[].amount The original amount for each expense line item. original_reimbursement_amount The original total expense amount. amount and currency The total amount and currency Ramp pays for the reimbursement. payee_amount The amount and currency the employee receives. For example, a PLN 1,940 expense can have line_items[].amount and original_reimbursement_amount in PLN, while amount, currency, and payee_amount show the USD reimbursement paid to the employee. Do not use line_items[].converted_amount to determine a reimbursement line item's paid amount. This field is not populated for reimbursement line items and can be null. Use the reimbursement-level payment fields instead. See Monetary Values for the format of CurrencyAmount fields. 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 Resource URL Description 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: Action Required Permissions Admin or Business Owner role, or the AP Clerk permission A role with permission to manage reimbursement payments for the employee, such as an Admin, Bookkeeper, or an eligible manager 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: Get Sandbox Access source_url: /developer-api/v1/sandbox-access text_url: /llms-guides/sandbox-access.txt summary: No summary content: --- 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. Create and manage them with the Funds API. 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. Surface What spend controls do 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. Funds — create, update, suspend, and terminate funds. 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. Authorization — funds:read / funds: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. Required: A Ramp account with API access. An OAuth token with spend_programs:write, funds:write, funds:read, transactions:read, and users:read scopes. Recommended: Read Spend Controls for the funds / spend programs / approvals mental model, and Cards for the card variant a fund issues. Prerequisites: A user ID for an initial member (you'll add more later). Fetch via GET /developer/v1/users. Three objects compose every recurring budget on Ramp. They're independent APIs that plug together cleanly. Spend program — the template. Encodes policy: amount, interval, allowed categories, what kinds of spend are permitted, whether the fund is shareable. Fund — an instance of the template, scoped to a specific user, team, or cycle. Issues a virtual card automatically. Created and managed via the Funds API. Transactions — settled spend against the fund, retrievable with the limit_id filter (pass the fund ID) and streamed in real time via webhooks. Most decisions you make happen at the program level — once. Funds inherit the program's policy. The only per-fund choices are who's on it, what it's called, and when to wind it down. Implementation A spend program template encodes policy once so every fund minted from it inherits the same shape. Key fields: display_name and description — visible to users and reviewers. is_shareable — whether one fund can be shared by multiple users. permitted_spend_types — primary_card_enabled, reimbursements_enabled. spending_restrictions — limit (amount, currency), interval (ANNUAL, MONTHLY, TOTAL, etc.), allowed_categories. This template allows spending on meals (19), lodging (6), and airlines (4) up to $10,000/year per fund minted from it. Verify: the response contains the new spend_program_id. List your spend programs (GET /developer/v1/spend-programs) to confirm. Funds created from a spend program inherit its policy. Provide display_name, spend_program_id, and an initial user_id. Fund creation is synchronous and returns the new fund directly. The 201 response contains the fund's id and its auto-issued virtual card in cards. Verify: GET /developer/v1/funds/$FUND_ID returns the fund with the inherited policy and card. For shareable programs, expand the fund to additional team members. Each user gets access to the shared budget; transactions are still attributed individually. Use DELETE /developer/v1/funds/{fund_id}/members with the same user_ids body to revoke access without terminating the fund. Two reads give you everything you need to monitor a budget in flight. For real-time updates, subscribe to the transactions.cleared webhook event. The event fires on settlements, refunds, and reversals; check the amount field for sign. See Webhooks. When the cycle ends, suspend or terminate. Suspend is reversible. Stops new spend on the fund without affecting cards' ability to draw from other funds they're attached to. Terminate is irreversible. Use only when you're certain the fund won't return. Refunds and reversals route correctly even after suspension or termination — they appear as negative amount values on transactions.cleared and reconcile to the original fund. Synchronous fund lifecycle. Fund creation, suspension, unsuspension, and termination return their result directly. Don't build deferred-task polling into these flows. Webhook subscriptions. Subscribe to transactions.cleared before going live. The webhook fires for settlements and refunds; rely on amount sign, not event type, to distinguish. Choose your interval carefully. ANNUAL, MONTHLY, and TOTAL are not interchangeable. TOTAL is a lifetime cap; MONTHLY resets every month; ANNUAL resets every year on the program's creation anchor. Decide upfront: one shared fund or many individual. is_shareable: true for team budgets where members coordinate (offsites, events). Individual funds when each person needs a distinct allowance with its own restrictions (per-employee SaaS, contractor stipends). Audit trails persist past termination. Transactions, refunds, and reversals stay queryable for historical reporting after a fund is terminated. 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. Funds — mint funds, add or remove members, suspend, and terminate. Transactions — read settled spend with the limit_id filter, passing the fund ID. Webhooks — subscribe to transactions.cleared for real-time spend, refunds, and reversals. Authorization — spend_programs:write, funds:write, funds:read scopes. FAQ Yes. Funds without cards are usable for reimbursements only. No. The program-to-fund relationship is set at mint time. To change policy, terminate and re-mint from the new program. Suspending a fund stops new spend from that fund. Cards attached to it stay active and can still spend from other funds they're linked to. Suspending a card stops all spend on that card without touching the funds. Yes. Refunds and reversals route to the original fund even after termination. Watch for negative amount values on the transactions.cleared webhook. One shared fund (is_shareable: true) for team budgets where members coordinate spend (offsites, events). Individual funds when each person needs a distinct allowance with its own restrictions (per-employee SaaS, contractor stipends). Spend programs when the same fund shape recurs — quarterly offsites, monthly stipends, departmental budgets. Direct fund creation for one-offs and tests. --- title: Technology Partnerships Application source_url: /developer-api/v1/technology-partnerships text_url: /llms-guides/technology-partnerships.txt summary: No summary content: --- 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: Field Notes 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: Action Body Effect 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. Status Meaning 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 fund-backed virtual cards for people or conventional backend payment flows. Deliver card details to a user's browser through a Ramp-served iframe, or retrieve them through the Vault API for an approved server-side flow. content: Issue fund-backed virtual cards for people or conventional backend payment flows. Deliver card details to a user's browser through a Ramp-served iframe, or retrieve them through the Vault API for an approved server-side flow. Looking to equip AI agents with cards? Follow the Agentic Payments guide 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 deliver details for a fund-backed virtual card. Embedded Cards starts with an existing card; the Vault API creates the fund and card when it returns the details. Vault API requires production approval Ramp reviews your use case, security controls, and PCI handling before your app can retrieve full PANs and CVVs server-side in production. All customers can use the Vault API in Sandbox. Submit a Developer API support ticket to begin the review. 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. Embedded iframe Vault API 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 or books travel Production access Available after scope setup and origin verification Approval required Requires embedded_cards:write scope, verified parent_origin cards:read_vault scope, production approval Required: A Ramp account and an app with the appropriate scope. The embedded pattern also requires an existing virtual card backed by a fund; the Vault API creates the backing fund and card in one request. Recommended: Read Cards for the conceptual model and Spend Controls for fund configuration. Create and manage funds with the Funds API. Prerequisites for Embedded: An HTTPS origin you control (parent_origin), access to your Ramp business's Developer settings, and the ability to serve a verification file from that origin. Prerequisites for Vault: Ramp production approval. Sandbox works without approval. 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. Verify every parent origin Before an origin can render Embedded Cards, add and verify it in Ramp. New integrations must also load the business-specific iframe URL, https://embed.ramp.com/business/{business_id}. Loading https://embed.ramp.com directly is not supported for new integrations. 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 Sandbox: enable embedded_cards:write in the developer dashboard. Production: enable embedded_cards:write, then add and verify each production origin in Developer settings. 2. Add and verify your parent origins In Ramp, open your app from Developer settings and find Allowed origins. Enter the exact HTTPS origin that will host the iframe in Origin URL, select Add URL, then copy the token under Verify domain ownership. Production does not support localhost origins You cannot add or verify a localhost origin for a production integration. To develop or test Embedded Cards locally, configure the localhost origin in Sandbox and use the Sandbox iframe URL. At each origin, publish a text file at: The verification file must contain only the token The entire file contents must be the Ramp-issued verification token. Do not add spaces, line breaks, a byte-order mark, HTML, comments, or any other content. Return to Allowed origins and select Verify for the URL. Ramp must be able to fetch the file directly over HTTPS: redirects, wildcard origins, and non-default ports are not supported. The verification response must complete within 5 seconds and must not exceed 1 KiB. You can add multiple origins. Publish the same business verification token at /.well-known/ramp-verification.txt on every origin, then verify each origin separately. If you remove and later re-add an origin, you must verify it again. Verify: each URL shows a Verified status in Ramp before you try to render the iframe. If verification fails, confirm that the file is publicly accessible and its contents exactly match the displayed token. 3. Issue a card Create a fund using the Funds API; a virtual card is issued automatically. Capture its card_id to mint embed tokens for it. 4. 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. 5. 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 root URLs https://demo-embed.ramp.com and https://embed.ramp.com remain available only for legacy integrations. They do not use your business's self-service allowed-origin list. New integrations must use /business/{business_id}. Use the id returned by GET /developer/v1/business as business_id. 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. 6. Test the integration Navigate to the Embedded Card Demo, paste an embed_init_token, and press Load Embed. The origin hosting the iframe — must exactly match window.location.origin of the page loading the embed and an origin you verified in Ramp. Ramp validates the origin server-side, blocking unauthorized domains from rendering your users' card details. Examples: Production: "https://your-app-domain.com" Staging: "https://staging.your-app-domain.com" 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 Ramp reviews your use case, security controls, and PCI handling before the Vault API can return full PANs and CVVs in production. All customers can use the Vault API in Sandbox. Submit a Developer API support ticket to begin the review. 1. Enable the Vault scopes Enable cards:read_vault, limits:write, and funds:write (and optionally users:read) on your application. The Vault creation endpoint currently requires limits:write; terminating its backing fund requires funds:write. In Sandbox these work immediately; for production, begin the access review with 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 /cards/vault Create a fund, issue a virtual card, and return full card details in one request. Verify: call /cards/vault in Sandbox; the response should include a full pan 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. Use card details only transiently for the approved payment flow. Do not store or log PANs or CVVs. 5. Terminate the card Virtual cards created via POST /cards/vault return both a spend_limit_id and a card.id. The spend_limit_id is the backing fund's ID. To permanently terminate the card, synchronously terminate that fund with DELETE /developer/v1/funds/{fund_id}. The Vault API creates a fund with an associated virtual card. Terminating the fund terminates the card and can affect every card or member attached to that fund. Termination is irreversible. Verify every production parent_origin in Ramp (Embedded) or complete the production access review (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. Synchronous lifecycle. Fund creation and termination return their result directly; don't poll a deferred-task endpoint. Agent Cards — give an AI agent a purchase-scoped credential for one approved checkout. 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. Business — retrieve the business_id required in the self-service iframe URL. Funds — create funds, which auto-issue virtual cards. Cards (Virtual) — list virtual cards and retrieve their backing fund_id. Cards (Physical) — physical card management. Transactions — settled spend per card and per fund. Webhooks — transactions.cleared for spend events. Authorization — business:read, embedded_cards:write, cards:read_vault, limits:write, and funds:write scopes. FAQ From the Funds API — each card in a fund's cards array has a card_id. Yes. Enable embedded_cards:write for your production app, then add and verify every production origin in Ramp. 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) Ramp also exposes an inbound webhook endpoint for AI platforms that broadcast customer usage events into Ramp. If your product lets customers bring their Ramp API key and receive model, token, cost, and attribution data in Ramp, see AI Usage Tracking. That endpoint uses POST /developer/v1/ai-usage/unified and does not require a webhook subscription through POST /developer/v1/webhooks. Subscribe to the event types below for business workflows. Where a public OAuth scope is available, request the scope for the underlying resource so your integration can read the object after receiving the event. Resource Scope to request Event Description 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. bills.updated Bill has been edited. Fires for invoice number updates, PO matching, accounting field updates, and payment detail changes. Does not fire for bill approvals or payments; use bills.approved and bills.paid for those updates. Entities entities:read entities.created Business entity has been created. Item Receipts item_receipts:read item_receipts.created Item receipt has been created. 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. spend_requests.created Spend request has been created. Transactions transactions:read transactions.all_requirements_met_and_approved_changed The transaction's all_requirements_met_and_approved value changed in either direction, including from true to false. transactions.authorized Transaction has been authorized. transactions.body_coding_updated Transaction's body-level accounting coding has been created or changed. 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.receipt_added Receipt has been added to a transaction. 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. Vendor Agreements vendors:read vendor_agreements.archived Vendor agreement has been archived. vendor_agreements.created Vendor agreement has been created. vendor_agreements.deleted Vendor agreement has been deleted. vendor_agreements.document_added Document has been added to a vendor agreement. vendor_agreements.renewal_milestone Vendor agreement has reached its fixed 90-day renewal milestone. vendor_agreements.updated Vendor agreement has been updated. Vendors vendors.activated Vendor has been activated. vendors.approved Vendor has been approved. vendors.updated Vendor has been updated. Testing None tests.test_event Test event for mock webhook delivery only; not a business-event subscription. Ramp also sends webhooks.verification during endpoint verification. Do not use it for business-event subscriptions; 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 POST /developer/v1/webhooks. Your access token must include the required read scope for each selected business event. The new subscription starts in the pending_verification state and does not receive business events until verification succeeds. You can also include an optional additional_headers object in the request. Ramp sends these headers with both verification requests and event deliveries. You can configure up to five headers; header names can contain up to 100 characters and values can contain up to 1,000 characters. The following header names are reserved and cannot be used: Host, User-Agent, Content-Length, Content-Type, Accept, Accept-Encoding, Connection, and Upgrade. Header names that start with X-Forwarded, X-Real, or X-Original are also reserved. These restrictions are case-insensitive. Ramp will send a POST request with a challenge to your endpoint during setup. The verification request uses a different payload from a business event: Read the challenge value from the verification request and return a 2xx response. Submit the challenge to the verification endpoint. A successful request returns {"success": true} and activates the subscription: 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 and any event-specific metadata supplied for that event Business-event requests also include an X-Ramp-Webhook-ID header with the same event ID as the payload. Verification requests do not include this header. Transaction event: Bill event: Purchase order event: To get the full resource details, use the resource ID to fetch from the appropriate API endpoint, such as GET /developer/v1/transactions/{transaction_id} for transaction events or GET /developer/v1/reimbursements/{reimbursement_id} for reimbursement events. A transactions.cleared event can represent a purchase, refund, or reversal. The webhook payload does not include the transaction amount. Fetch the transaction and, if entity_amount is not null, check entity_amount.value, which is signed and can be negative for refunds or credits. If entity_amount is null, no settlement-currency amount is available, so do not classify the transaction by amount. Do not use the deprecated amount field. 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. Verify the exact raw request bytes before parsing or reserializing the JSON. Recreating the body with JSON.stringify(req.body) can change its formatting or key order and produce an invalid signature. 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: Status Code Behavior 2xx Delivery successful - no retries 3xx, 4xx (except 429) Instant delivery failure - no retries 429, 5xx (including timeouts and connection errors) Up to 10 total delivery attempts, with exponential backoff between attempts Retry timing: Failed deliveries use exponential backoff with full jitter. The first retry delay is between 0 and 2 seconds, and later retry delays increase up to a maximum of 60 seconds. Webhook requests time out 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 POST /developer/v1/webhooks/mock-webhook-event to create a mock event for all matching active subscriptions within the token's business and integration. The endpoint does not target a single subscription. Mock events use the normal event payload and signature, with no test marker added by Ramp. In production, live receivers can process these events as real activity. Use a sandbox access token and sandbox subscriptions for testing, as shown below. The request requires event_type, a valid resource UUID in object_id, and an object_metadata object: The endpoint returns the generated event payload with a 201 Created status. It returns an error if no active subscription matches the event type. 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' | null code?: string created_at: string /* date */ entity_remote_ids: string[] | null gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string | null ramp_id: string updated_at?: string /* date */ visibility?: 'HIDDEN' | 'VISIBLE' }[] page: { next: string | null } } --- 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 | null gl_accounts: { classification: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' code?: string entity_remote_ids?: string[] id: string name: string }[] } response: { accounting_connection_id?: string gl_accounts?: { accounting_connection_id: string classification?: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' | null code?: string created_at: string /* date */ entity_remote_ids: string[] | null gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string | null ramp_id: string updated_at?: string /* date */ visibility?: 'HIDDEN' | 'VISIBLE' }[] uploaded?: string[] } --- title: Delete a general ledger account path: /developer/v1/accounting/accounts/{gl_account_id} description: No description request: { accounting_connection_id?: string | null } 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' | null code?: string created_at: string /* date */ entity_remote_ids: string[] | null gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string | null ramp_id: string updated_at?: string /* date */ visibility?: 'HIDDEN' | 'VISIBLE' } --- 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 entity_remote_ids?: string[] | null name?: string reactivate?: boolean visibility?: 'HIDDEN' | 'VISIBLE' } response: { accounting_connection_id: string classification?: 'ANY' | 'ASSET' | 'CREDCARD' | 'EQUITY' | 'EXPENSE' | 'LIABILITY' | 'REVENUE' | 'UNKNOWN' | null code?: string created_at: string /* date */ entity_remote_ids: string[] | null gl_account_category_info?: { id?: string name?: string ramp_id?: string } id?: string is_active: boolean name: string provider_name: string | null ramp_id: string updated_at?: string /* date */ visibility?: 'HIDDEN' | 'VISIBLE' } --- 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null 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: { accounting_coding_selections: { accounting_field_id: string accounting_field_option_id?: string free_form_text?: string }[] object_id: string object_type: 'TRANSACTION' } --- 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null 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?: { entity_selection_enabled?: boolean reimbursement_sync_button_enabled?: boolean transaction_accounting_vendor_creation_on_sync_enabled?: boolean transaction_sync_button_enabled?: boolean vendor_credits_enabled?: boolean } | null } 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } --- 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null 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?: { entity_selection_enabled?: boolean 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } --- title: Mark an inactive accounting API based connection as ready to migrate path: /developer/v1/accounting/connection/{connection_id}/ready-to-migrate description: There must be a different active accounting connection that the customer will migrate away from. Marking an inactive accounting API based connection as ready to migrate makes it available to the customer in the ERP migration flow UI. See https://docs.ramp.com/developer-api/v1/accounting-erp-migration for more information. 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 */ | null remote_provider_name: string | null settings: { entity_selection_enabled: boolean reimbursement_sync_button_enabled: boolean transaction_accounting_vendor_creation_on_sync_enabled: boolean transaction_sync_button_enabled: boolean vendor_credits_enabled: boolean } | null status: 'failed_to_auth' | 'linked' | 'revoked' | 'unlinked' } --- title: Upload entities path: /developer/v1/accounting/entities description: You can upload up to 500 entities in an all-or-nothing fashion. request: { accounting_connection_id?: string | null entities: { country?: string | null currency?: string | null federal_id_number?: string | null id: string name: string }[] } response: { accounting_connection_id?: string entities: { accounting_connection_id: string country: string | null currency: string | null federal_id_number: string | null id?: string is_active: boolean name: string ramp_id: string }[] } --- title: Bulk delete field option filter rules path: /developer/v1/accounting/field-option-filter-rules description: Removes specific rules identified by their target option and required selections. Rules that don't exist are counted as duplicates (no-op). request: { accounting_connection_id?: string | null rules: { required_selections: { trigger_field_option_remote_id: string trigger_field_remote_id: string }[] target_field_option_remote_id: string target_field_remote_id: string }[] } response: { deleted_count: number not_found_count: number } --- title: List field option filter rules path: /developer/v1/accounting/field-option-filter-rules description: Returns rules that define which options of a target field are available based on selected options of trigger fields. Filterable by target_field_remote_id and target_field_option_remote_id. request: none response: { data: { required_selections: Record[] target_field_option_remote_id: string target_field_remote_id: string }[] page: { next: string | null } } --- title: Bulk create field option filter rules path: /developer/v1/accounting/field-option-filter-rules description: Rules define which options of a target tracking category are available based on selected options of trigger tracking categories. Multiple rules for the same target option use OR logic between them. Multiple required_selections within a single rule use AND logic. request: { accounting_connection_id?: string | null rules: { required_selections: { trigger_field_option_remote_id: string trigger_field_remote_id: string }[] target_field_option_remote_id: string target_field_remote_id: string }[] } response: { created_count: number duplicate_count: number } --- 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 entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' }[] page: { next: string | null } } --- 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 | null field_id: string options: { code?: string display_name?: string entity_remote_ids?: string[] id: string value: string }[] } response: { accounting_connection_id: string options?: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' }[] uploaded?: string[] } --- title: Delete a custom accounting field option path: /developer/v1/accounting/field-options/{field_option_id} description: No description request: { accounting_connection_id?: string | null } 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 entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null 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[] | null reactivate?: boolean value?: string visibility?: 'HIDDEN' | 'VISIBLE' } response: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null 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[] | null reactivate?: boolean value?: string visibility?: 'HIDDEN' | 'VISIBLE' } response: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null 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 | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null ramp_id?: string updated_at?: string /* date */ }[] page: { next: string | null } } --- 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 | null display_name?: string | null id: string input_type: 'BOOLEAN' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_required_for?: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name: string } response: { accounting_connection_id: string created_at?: string /* date */ display_name: string | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null ramp_id?: string updated_at?: string /* date */ } --- title: Delete a custom accounting field path: /developer/v1/accounting/fields/{field_id} description: No description request: { accounting_connection_id?: string | null } 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 | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null 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 | null is_splittable?: boolean name?: string } response: { accounting_connection_id: string created_at?: string /* date */ display_name: string | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null 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 | null } 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 | null 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 | null display_name?: string | null name?: string } response: { accounting_connection_id: string display_name: string | null 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 | null display_name?: string | null name: string } response: { accounting_connection_id: string display_name: string | null id: string name: string ramp_id: string } --- title: List inventory item options path: /developer/v1/accounting/inventory-item/options description: No description request: none response: { data: { accounting_connection_id: string entity_remote_ids: string[] | null gl_account_id: string | null id: string is_active: boolean name: string ramp_id: string }[] page: { next: string | null } } --- 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 | null options: { entity_remote_ids?: string[] gl_account_id?: string | null id: string name: string }[] } response: { options: { accounting_connection_id: string entity_remote_ids: string[] | null gl_account_id: string | null id: string is_active: boolean name: string ramp_id: string }[] } --- title: Delete an inventory item option path: /developer/v1/accounting/inventory-item/options/{option_id} description: No description request: { accounting_connection_id?: string | null } 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 | null entity_remote_ids?: string[] | null gl_account_id?: string name?: string reactivate?: boolean } response: { accounting_connection_id: string entity_remote_ids: string[] | null gl_account_id: string | null 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: { accounting_connection_id: string options?: { accounting_connection_id: string code?: string created_at?: string /* date */ display_name?: string entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null ramp_id?: string updated_at?: string /* date */ value?: string visibility?: 'HIDDEN' | 'VISIBLE' }[] uploaded?: string[] } --- 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 entity_remote_ids: string[] | null id?: string is_active?: boolean provider_name: string | null 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 | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null ramp_id?: string updated_at?: string /* date */ }[] page: { next: string | null } } --- title: Create a Ramp-only accounting field path: /developer/v1/accounting/ramp-fields description: No description request: { accounting_connection_id?: string | null display_name?: string | null id: string input_type: 'BOOLEAN' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_required_for?: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name: string } response: { accounting_connection_id: string created_at?: string /* date */ display_name: string | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null ramp_id?: string updated_at?: string /* date */ } --- title: Delete a Ramp-only accounting field path: /developer/v1/accounting/ramp-fields/{field_id} description: No description request: { accounting_connection_id?: string | null } 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 | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null 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 | null is_splittable?: boolean name?: string } response: { accounting_connection_id: string created_at?: string /* date */ display_name: string | null id?: string input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active?: boolean is_required_for: ('BILL' | 'BILL_PAYMENT' | 'CUSTOMER' | 'INVOICE' | 'PURCHASE_ORDER' | 'REIMBURSEMENT' | 'SPEND_PROGRAM' | 'TRANSACTION' | 'TRANSFER_LEDGER_ENTRY_MAPPING' | 'VENDOR_CREDIT')[] is_splittable?: boolean name?: string provider_name: string | null ramp_id?: string updated_at?: string /* date */ } --- title: Mark objects as ready to sync to your accounting provider path: /developer/v1/accounting/ready-to-sync description: Marking an object (for example a transaction) as ready to sync flags it as reviewed and complete, so it will be included in the next accounting sync that exports data from Ramp to your connected accounting provider (ERP), such as NetSuite, QuickBooks, Xero, or Sage Intacct. request: { object_ids: string[] object_type: 'REIMBURSEMENT' | '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: { sync_id: string } --- title: Delete tax code accounting field path: /developer/v1/accounting/tax/code description: No description request: { accounting_connection_id?: string | null } 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 | null 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 | null display_name?: string | null name?: string } response: { accounting_connection_id: string display_name: string | null 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 | null display_name?: string | null name: string } response: { accounting_connection_id: string display_name: string | null id: string name: string ramp_id: string } --- title: List tax code options path: /developer/v1/accounting/tax/code/options description: No description request: none response: { data: { accounting_connection_id: string entity_remote_ids: string[] | null id: string is_active: boolean name: string ramp_id: string tax_rate_ids: string[] }[] page: { next: string | null } } --- 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 | null options: { entity_remote_ids?: string[] id: string name: string tax_rate_ids?: string[] }[] } response: { options: { accounting_connection_id: string entity_remote_ids: string[] | null id: string is_active: boolean name: string ramp_id: string tax_rate_ids: string[] }[] } --- title: Delete a tax code option path: /developer/v1/accounting/tax/code/options/{option_id} description: No description request: { accounting_connection_id?: string | null } 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 | null entity_remote_ids?: string[] | null name?: string tax_rate_ids?: string[] } response: { accounting_connection_id: string entity_remote_ids: string[] | null 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 | null id: string name: string ramp_id: string rate: string }[] page: { next: string | null } } --- 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 | null tax_rates: { accounting_gl_account_id?: string | null id: string name: string rate: string | number }[] } response: { accounting_connection_id?: string tax_rates: { accounting_connection_id: string accounting_gl_account_id: string | null id: string name: string ramp_id: string rate: string }[] } --- title: Delete a tax rate path: /developer/v1/accounting/tax/rates/{tax_rate_id} description: No description request: { accounting_connection_id?: string | null } 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 | null 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 */ entity_remote_ids: string[] | null id?: string is_active: boolean is_synced: boolean name: string provider_name: string | null ramp_id: string updated_at: string /* date */ vendor_category_info?: { id?: string name?: string ramp_id?: string } }[] page: { next: string | null } } --- 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 | null vendors: { code?: string | null entity_remote_ids?: string[] id: string name: string }[] } response: { uploaded?: string[] vendors?: { accounting_connection_id: string code?: string created_at: string /* date */ entity_remote_ids: string[] | null id?: string is_active: boolean is_synced: boolean name: string provider_name: string | null ramp_id: string updated_at: string /* date */ vendor_category_info?: { id?: string name?: string ramp_id?: string } }[] } --- title: Delete a vendor path: /developer/v1/accounting/vendors/{vendor_id} description: No description request: { accounting_connection_id?: string | null } 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 */ entity_remote_ids: string[] | null id?: string is_active: boolean is_synced: boolean name: string provider_name: string | null 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 entity_remote_ids?: string[] | null name?: string reactivate?: boolean } response: { accounting_connection_id: string code?: string created_at: string /* date */ entity_remote_ids: string[] | null id?: string is_active: boolean is_synced: boolean name: string provider_name: string | null ramp_id: string updated_at: string /* date */ vendor_category_info?: { id?: string name?: string ramp_id?: string } } --- title: List provider API keys and their estimated spend path: /developer/v1/ai-spend/api-keys description: Results are sorted by estimated cost in descending order, then by API key ID in ascending order. A request can match at most 10,000 API keys. Use the providers or statuses filter to narrow larger result sets. Estimated cost is calculated for the requested period. All other fields reflect current metadata for the API key, independent of the requested dates. The statuses filter applies to each API key's current status. request: none response: { data: { active_spend_limit: { amount: { 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' | 'USDSUI' | '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' value: number } interval: 'annual' | 'daily' | 'monthly' | 'quarterly' | 'tertiary' | 'total' | 'weekly' | 'yearly' } | null estimated_cost: { 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' | 'USDSUI' | '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' value: number } external_id: string id: string name: string | null owner: { email: string | null first_name: string | null id: string | null last_name: string | null } | null provider: 'ANTHROPIC' | 'AWS' | 'CURSOR' | 'FIREWORKS' | 'GCP' | 'OPENAI' provider_created_at: string /* date */ | null provider_key_hint: string | null provider_last_used_at: string /* date */ | null status: 'active' | 'expired' | 'locked' | 'terminated' | null synced_at: string /* date */ tags: { key: string value: string }[] }[] page: { next: string | null } } --- title: List Ramp users with estimated AI spend during the requested period path: /developer/v1/ai-spend/team description: User profile fields reflect current Ramp user metadata, independent of the requested dates. Only users with positive estimated spend are returned. request: none response: { data: { department_name: string | null email: string estimated_cost: { 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' | 'USDSUI' | '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' value: number } estimated_cost_by_provider: { estimated_cost: { 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' | 'USDSUI' | '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' value: number } provider: 'ANTHROPIC' | 'CURSOR' | 'OPENAI' }[] first_name: string id: string is_anomalous: boolean is_ramp_user: boolean last_name: string user_status: 'active' | 'deleted' | 'draft' | 'inactive' | 'pending' }[] page: { next: string | null } } --- title: List daily AI usage and spend grouped by provider, model, and product path: /developer/v1/ai-spend/usage description: No description request: none response: { data: { cached_input_tokens: number estimated_cost: { 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' | 'USDSUI' | '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' value: number } input_tokens: number model: string | null output_tokens: number product: string | null provider: 'ANTHROPIC' | 'AWS' | 'CURSOR' | 'FIREWORKS' | 'GCP' | 'OPENAI' provider_reported_cost: { 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' | 'USDSUI' | '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' value: number } | null provider_reported_cost_components: { amount: { 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' | 'USDSUI' | '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' value: number } category: string }[] usage_date: string /* date */ web_search_requests: number }[] page: { next: string | null } } --- 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 | null } application_type?: 'BILL_PAY_ONLY' | 'RAMP_SUITE' beneficial_owners: { address?: { apt_suite?: string | null city?: string | null country?: string | null postal_code?: string | null state?: string | null street_address?: string | null } | null birth_date?: string | null email?: string | null first_name?: string | null last_name?: string | null ownership_percentage?: number | null passport_last_4?: string | null phone?: string | null ssn_last_4?: string | null title?: string | null }[] | null business: { address?: { apt_suite?: string | null city?: string | null postal_code?: string | null state?: string | null street_address?: string | null } | null business_description?: string | null business_name_dba?: string | null business_name_legal?: string | null business_name_on_card?: string | null business_website?: string | null incorporation?: { date_of_incorporation?: string /* date */ | null ein_number?: string | null entity_type?: 'COOPERATIVE' | 'CORPORATION' | 'LLC' | 'NON_PROFIT_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'SOLE_PROPRIETORSHIP' | null state_of_incorporation?: string | null } | null phone?: string | null } | null controlling_officer: { address?: { apt_suite?: string | null city?: string | null country?: string | null postal_code?: string | null state?: string | null street_address?: string | null } | null birth_date?: string | null email?: string | null first_name?: string | null is_beneficial_owner?: boolean last_name?: string | null ownership_percentage?: number | null passport_last_4?: string | null phone?: string | null ssn_last_4?: string | null title?: string | null } | null financial_details: { estimated_monthly_ap_spend_amount?: number | null estimated_monthly_spend_amount?: number | null } | null id: string incorporation_status: 'FORMED' | 'INCORPORATED_EXTERNALLY' | 'INCORPORATING' | 'NOT_INCORPORATED' needs_incorporation: boolean open_ramp_checking_account: boolean 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 | null } application_type?: 'BILL_PAY_ONLY' | 'RAMP_SUITE' beneficial_owners?: { address?: { apt_suite?: string | null city?: string | null country?: string | null postal_code?: string | null state?: string | null street_address?: string | null } | null birth_date?: string | null email?: string | null first_name?: string | null last_name?: string | null ownership_percentage?: number | null passport_last_4?: string | null phone?: string | null ssn_last_4?: string | null title?: string | null }[] | null business?: { address?: { apt_suite?: string | null city?: string | null postal_code?: string | null state?: string | null street_address?: string | null } | null business_description?: string | null business_name_dba?: string | null business_name_legal?: string | null business_name_on_card?: string | null business_website?: string | null incorporation?: { date_of_incorporation?: string /* date */ | null ein_number?: string | null entity_type?: 'COOPERATIVE' | 'CORPORATION' | 'LLC' | 'NON_PROFIT_CORPORATION' | 'OTHER' | 'PARTNERSHIP' | 'SOLE_PROPRIETORSHIP' | null state_of_incorporation?: string | null } | null phone?: string | null } | null controlling_officer?: { address?: { apt_suite?: string | null city?: string | null country?: string | null postal_code?: string | null state?: string | null street_address?: string | null } | null birth_date?: string | null email?: string | null first_name?: string | null is_beneficial_owner?: boolean last_name?: string | null ownership_percentage?: number | null passport_last_4?: string | null phone?: string | null ssn_last_4?: string | null title?: string | null } | null financial_details?: { estimated_monthly_ap_spend_amount?: number | null estimated_monthly_spend_amount?: number | null } | null lead_referral_partner_channel?: 'api' | 'cli' | 'mcp' | null lead_referral_partner_code?: 'base44' | 'clerky' | 'cofounder_co' | 'every' | 'nous_research_hermes' | 'paperclip' | 'south_park_commons' | 'yc' | null manual_bank_account?: { account_number: string account_subtype: string balance: string | number routing_number: string } | null oauth_authorize_params?: { code_challenge?: string | null redirect_uri: string state: string } | null ownership_acknowledgement?: 'CONFIRM_ALL_MAJOR_OWNERS_ENTERED' | 'CONFIRM_NO_INDIVIDUAL_OWNS_25_PCT' | null } 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 | null } | Record actor_id: string | null actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' additional_details: string | null event_details: { references: { label: string resource_name: 'Accounting rule group' | 'Approvals' | 'Bill payment' | 'Bill template' | 'Card' | 'Cash Manager recommendation' | 'Fixed asset class' | 'Fixed asset' | 'Forecast custom input' | 'Fund request' | 'Investment account' | 'Managed portfolio transfer' | 'Payment run' | 'Reimbursement' | 'SFTP Configurations' | 'Separation of duties' | 'Spend allocation' | 'Spend event' | 'Spend program' | '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' | 'AI usage limits updated' | '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 fixed asset changed' | 'Accounting fixed asset class changed' | 'Accounting lease changed' | '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' | 'Amortization schedule updated' | 'Approval chain updated' | 'Approval policy set as default' | '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' | 'Automatic investment transfer canceled' | 'Automatic rule management actions reviewed' | 'Automation deleted' | 'Bank account ACH details viewed' | 'Bank account entity owner changed' | 'Bank account sensitive details viewed' | 'Bank account updated' | 'Bank letter downloaded' | 'Bill created by AP coworker' | 'Bill linked to PO' | 'Bill linked to contract' | 'Bill linked' | 'Bill pay AP coworker questions answered' | 'Bill pay accepted PDR bank account ownership match' | '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 accrual synced' | '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 marked as unpaid' | 'Bill pay matched transaction to bill' | 'Bill pay matched transfer to bill' | 'Bill pay payment failed' | 'Bill pay payment posted' | 'Bill pay payment reversal failed' | 'Bill pay payment reversal posted' | 'Bill pay payment reversal succeeded' | '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 pay submission policy updated' | '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' | 'Bookkeeping agent response stopped' | '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 application agent action' | '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' | 'Check PDF downloaded' | 'Checking Account terms accepted' | 'Close task restored' | 'Combined contracts with this contract' | 'Communication sent' | 'Complete revision' | 'Compliance flag updated' | 'Counterparty created' | 'Counterparty details changed' | 'Counterparty details configuration changed' | 'Counterparty details configuration created' | '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' | 'Dormant funds automation changed' | '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 allocation request' | '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 credential rotated' | 'External agent key created' | 'External agent key revoked' | 'External agent key updated' | 'External agent wallet execution changed' | 'External ticket created asana' | 'External ticket created jira' | 'External ticket created linear' | 'External ticket created zendesk' | 'Flex fee redeemed' | 'Flexible limits default changed' | 'Forecast custom input added' | 'Forecast custom input deleted' | 'Forecast custom input updated' | 'Forecast settings updated' | 'Fraud Omni investigation started' | 'Funds activated from reissued virtual card' | 'Generated renewal brief for contract' | 'Governed change applied' | 'Governed change became stale' | 'Governed change rejected' | 'Governed change submitted for review' | 'Governed changes turned off' | 'Governed changes turned on' | 'HRIS integration setting updated' | 'IP allowlist updated' | 'Identity locked' | 'Identity unlocked' | 'Impersonation upgraded to read-write' | 'Initiated digital wallet provisioning (audit)' | 'Internal impersonation upgraded to read-write' | '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' | 'Legal entity updated' | 'Linked funds to spend program' | 'Locked access to funds' | 'Locked card' | 'Login methods updated' | 'Managed portfolio transfer updated' | 'Manager updated' | 'Manual redemption redeemed' | '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 vendor approval policy 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' | 'Passkey removal request denied' | '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 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' | 'Preview mode entered' | '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' | 'Purchase order accrual lines updated' | 'Purchase order accrual synced' | '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' | 'Repayment accounting sync success' | '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' | 'SSO certificate updated' | 'SSO domain-sharing request resolved' | 'SSO provider created' | 'SSO provider deleted' | 'SSO provider domains updated' | 'SaaS fee redeemed' | 'Separation of duties disabled' | 'Separation of duties enabled' | 'Set member limit on shared fund' | 'Shortfall coverage updated' | 'Snowflake connection configuration changed' | 'Snowflake connection created' | 'Snowflake connection removed' | 'Snowflake connection scope changed' | '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' | 'Spend settings updated' | 'Stack connector updated' | 'Status updated by intake agent' | 'Status updated' | 'Strict MFA setting updated' | 'Submission policy updated' | 'Submitted procurement change request' | 'Synced draft policy from workflow' | '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 approvers updated' | 'Ticket assignee updated' | 'Ticket status updated' | 'Totp authenticator created' | 'Totp authenticator deleted' | 'Totp authenticator updated' | 'Transaction added to trip' | 'Transaction approval policy updated' | 'Transaction cleared' | 'Transaction entity changed' | 'Transaction missing item reminder event' | 'Transaction paid' | 'Transaction receipt updated' | 'Transaction removed from trip' | 'Transaction submission policy exemption event' | 'Transfer created' | 'Transfer initiated' | 'Transferred ownership of funds' | 'Travel policy selection updated' | 'Trip changed' | 'Unarchived funds' | '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 connection migrated' | 'Vendor Network updates enabled' | 'Vendor added to group' | 'Vendor awarded' | 'Vendor credit action' | 'Vendor edit approval policy updated' | '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 memory file setting updated' | 'Vendor parent set' | 'Vendor parent unset' | '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' | 'Workflow updated' id: string primary_reference: { id: string | null label: string resource_name: 'Accounting rule group' | 'Approvals' | 'Bill payment' | 'Bill template' | 'Card' | 'Cash Manager recommendation' | 'Fixed asset class' | 'Fixed asset' | 'Forecast custom input' | 'Fund request' | 'Investment account' | 'Managed portfolio transfer' | 'Payment run' | 'Reimbursement' | 'SFTP Configurations' | 'Separation of duties' | 'Spend allocation' | 'Spend event' | 'Spend program' | '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 } | null user_details: { actor_type: 'policy_agent' | 'ramp' | 'spend_request_agent' | 'user' id: string | null } | null }[][] page: { next: string | null } } --- title: List bank accounts path: /developer/v1/bank-accounts description: No description request: none response: { data: { account_name: string account_number_last_four: string account_subtype: string connection_provider: 'finicity' | 'manual' | 'plaid' | 'ramp_brokerage' | 'ramp_wallet' | 'teller' financial_institution_name: string | null id: string }[] page: { next: string | null } } --- 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 account_subtype: string connection_provider: 'finicity' | 'manual' | 'plaid' | 'ramp_brokerage' | 'ramp_wallet' | 'teller' financial_institution_name: string | null id: string } --- title: List banking accounts path: /developer/v1/banking/accounts description: Returns all banking accounts for the business, including checking accounts, brokerage accounts, and investment accounts. Each account includes its unique identifier, account type, and display name. request: none response: { data: { account_type: 'BROKERAGE_ACCOUNT' | 'MANAGED_PORTFOLIO_ACCOUNT' | 'WALLET_ACCOUNT' id: string name: string }[] page: { next: string | null } } --- title: Get balance history for a banking account path: /developer/v1/banking/accounts/{account_id}/balance-history description: Returns daily available balance snapshots for the specified banking account. Use the ``start_date`` and ``end_date`` query parameters to filter results to a specific date range (ISO 8601 format). request: none response: { data: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } date: string /* date */ }[] page: { next: string | null } } --- title: List syncable banking transactions path: /developer/v1/banking/syncable-transactions description: Returns banking transactions that are available for syncing to an accounting provider. Requires an active accounting provider connection. Use query parameters to filter by date range, entity, or sync status. request: none response: { data: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } date: string /* date */ description: string destination_account_name: string | null entity_id: string | null id: string source_account_name: string | null sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' treasury_transfer_type: 'BROKERAGE_ORDER' | 'MANAGED_PORTFOLIO_ACTIVITY' | 'MANAGED_PORTFOLIO_TRANSFER' | 'WALLET_TRANSFER' }[] page: { next: string | null } } --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: ApiAmount withholding_amount: ApiAmount withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: ApiAmount withholding_amount: ApiAmount withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: ApiCardPaymentDetailsResource | ApiManualPaymentDetailsResource | ApiVendorPaymentDetailsResource effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null vendor_memo?: string }[] page: { next: string | null } } --- 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 | null free_form_text?: string | null }[] attachment_id?: string | null 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 | null free_form_text?: string | null }[] memo?: string | null quantity: string | number unit_price: string | number }[] | null 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' | 'USDSUI' | '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 | null free_form_text?: string | null }[] amount: string | number memo?: string | null }[] | null memo?: string | null 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 | null } | { 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 */ } | null payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ | null purchase_order_ids?: string[] remote_id?: string | null target_payment_arrival_date?: string /* date */ | null use_default_payment_method?: boolean use_default_vendor_contact?: boolean vendor_contact_id?: string | null vendor_id: string vendor_memo?: string | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: { fund_id?: string 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' | null } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null is_same_day: boolean source_bank_account_id: string | null vendor_account_id: string | null } effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null vendor_memo?: string } --- title: List draft bills path: /developer/v1/bills/drafts description: No description request: none response: { data: { accounting_date: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null bill_owner: { first_name?: string id: string last_name?: string } | null created_at: string /* date */ due_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null quantity: number | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] invoice_number: string | null invoice_urls: string[] issued_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null posting_date: string /* date */ | null remote_id: string | null status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } | null vendor_memo: string | null }[] page: { next: string | null } } --- 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 | null free_form_text?: string | null }[] 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 | null free_form_text?: string | null }[] memo?: string | null purchase_order_line_item_id?: string | null quantity: string | number unit_price: string | number }[] | null 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' | 'USDSUI' | '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 | null free_form_text?: string | null }[] amount: string | number memo?: string | null purchase_order_line_item_id?: string | null }[] | null memo?: string | null payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ | null purchase_order_ids?: string[] remote_id?: string | null use_default_payment_method?: boolean vendor_contact_id?: string vendor_id: string vendor_memo?: string | null } response: { accounting_date: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null bill_owner: { first_name?: string id: string last_name?: string } | null created_at: string /* date */ due_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null quantity: number | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] invoice_number: string | null invoice_urls: string[] issued_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null posting_date: string /* date */ | null remote_id: string | null status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } | null vendor_memo: string | null } --- title: Fetch a draft bill path: /developer/v1/bills/drafts/{draft_bill_id} description: No description request: none response: { accounting_date: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null bill_owner: { first_name?: string id: string last_name?: string } | null created_at: string /* date */ due_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null quantity: number | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] invoice_number: string | null invoice_urls: string[] issued_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null posting_date: string /* date */ | null remote_id: string | null status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } | null vendor_memo: string | null } --- 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 | null free_form_text?: string | null }[] 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 | null free_form_text?: string | null }[] memo?: string | null purchase_order_line_item_id?: string | null quantity: string | number unit_price: string | number }[] | null 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' | 'USDSUI' | '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 | null free_form_text?: string | null }[] amount: string | number memo?: string | null purchase_order_line_item_id?: string | null }[] | null memo?: string | null payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ | null purchase_order_ids?: string[] remote_id?: string | null use_default_payment_method?: boolean vendor_contact_id?: string vendor_id?: string vendor_memo?: string | null } response: { accounting_date: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null bill_owner: { first_name?: string id: string last_name?: string } | null created_at: string /* date */ due_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null quantity: number | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] invoice_number: string | null invoice_urls: string[] issued_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null posting_date: string /* date */ | null remote_id: string | null status: none sync_status: none vendor: { id: string name: string remote_code?: string remote_id?: string remote_name?: string type?: 'BUSINESS' | 'INDIVIDUAL' } | null vendor_memo: string | null } --- 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 with value 'INVOICE' or 'FILE'. request: { attachment_type: 'EMAIL' | 'FILE' | 'INVOICE' | 'VENDOR_CREDIT' file: string } response: { id: string } --- title: Submit a draft bill path: /developer/v1/bills/drafts/{draft_bill_id}/submit 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: { fund_id?: string 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' | null } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null is_same_day: boolean source_bank_account_id: string | null vendor_account_id: string | null } effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null vendor_memo?: string } --- 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: Record --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: { fund_id?: string 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' | null } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null is_same_day: boolean source_bank_account_id: string | null vendor_account_id: string | null } effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null 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 | null free_form_text?: string | null }[] due_at?: string /* date */ entity_id?: string inventory_line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string | null free_form_text?: string | null }[] memo?: string | null purchase_order_line_item_id?: string | null quantity: string | number unit_price: string | number }[] | null invoice_number?: string issued_at?: string /* date */ line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string | null free_form_text?: string | null }[] amount: string | number memo?: string | null purchase_order_line_item_id?: string | null }[] | null memo?: string | null payment_date?: string /* date */ | null payment_method?: 'ACH' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DOMESTIC_WIRE' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'SWIFT' posting_date?: string /* date */ | null purchase_order_ids?: string[] remote_id?: string | null vendor_contact_id?: string vendor_id?: string vendor_memo?: string | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: { fund_id?: string 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' | null } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null is_same_day: boolean source_bank_account_id: string | null vendor_account_id: string | null } effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null 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 with value 'INVOICE' or 'FILE'. request: { attachment_type: 'EMAIL' | 'FILE' | 'INVOICE' | 'VENDOR_CREDIT' file: string } response: { id: string } --- title: Hold Bill path: /developer/v1/bills/{bill_id}/hold description: Blocks all payments rails on a bill and deschedules payments. request: { reason?: string | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: { fund_id?: string 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' | null } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null is_same_day: boolean source_bank_account_id: string | null vendor_account_id: string | null } effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null vendor_memo?: string } --- title: Release Bill Hold path: /developer/v1/bills/{bill_id}/release description: Allows payments to be scheduled on a bill. 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } applied_vendor_credits: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string }[] approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null archived_at: string /* date */ | null bill_owner: { first_name?: string id: string last_name?: string } created_at: string /* date */ deep_link_url?: string draft_bill_created_at: string /* date */ | null draft_bill_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null quantity: number unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] invoice_number?: string invoice_urls: string[] is_withholding_release?: boolean | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } item_receipt_line_item_ids: string[] memo?: string purchase_order_line_item_id: string | null withholding_line_item?: { gross_amount: { 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' | 'USDSUI' | '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' value: number } withholding_amount: { 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' | 'USDSUI' | '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' value: number } withholding_percentage: string | null } | null }[] memo?: string paid_at?: string /* date */ payment: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bank_debit_trace_id?: { descriptor?: string trace_id?: string } customer_friendly_payment_id: string | null details: { fund_id?: string 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' | null } | { approval_status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' | null is_same_day: boolean source_bank_account_id: string | null vendor_account_id: string | null } effective_date: string /* date */ | null id: string | null payment_date: string /* date */ | null payment_method: 'ACH' | 'AUTOMATIC_CARD_PAYMENT' | 'CARD' | 'CHECK' | 'CRYPTO_WALLET_TRANSFER' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' | null trace_id: { descriptor?: string trace_id?: string } | null } | null 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_TRANSFER_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 | null vendor_memo?: string } --- title: Fetch a bill remittance receipt path: /developer/v1/bills/{bill_id}/remittance-receipt description: No description request: none response: binary file (application/pdf) --- 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: { unified_request_id: string vendor_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' | 'QUESTIONNAIRE' | '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' } 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 }[] | null status?: string | null url?: string | null } response: { approval_trigger_instance_id: string recipients?: { email: string name: string }[] | null status?: string | null url?: string | null } --- 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 initial_approved_limit_amount: { 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' | 'USDSUI' | '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' value: number } | null 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 | null } available_flex_limit?: number available_flex_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } balance_including_pending?: number balance_including_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } card_balance_excluding_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } card_balance_including_pending?: number card_balance_including_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } card_limit?: number card_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } flex_balance?: number flex_balance_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } flex_limit?: number flex_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } float_balance_excluding_pending?: number float_balance_excluding_pending_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } global_limit?: number global_limit_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } max_balance?: number max_balance_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } next_billing_date?: string prev_billing_date?: string statement_balance?: number statement_balance_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } --- title: List physical cards path: /developer/v1/cards/physical description: Returns a paginated list of physical cards for the business. Cards can be filtered by user, activation status, termination status, and display name. request: none response: { data: { automatic_routing_enabled?: boolean cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: CardPersonalizationNameLine name_line_2?: CardPersonalizationNameLine } } cardholder_uuid?: string | null fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string | null recipient_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' | null return_address?: CardShippingAddress | null } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } | null fund_id?: string | null has_program_overridden: boolean id?: string is_physical?: boolean is_primary?: boolean is_suspended: boolean last_four: string state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' }[] page: { next: string | null } } --- title: Create a physical card path: /developer/v1/cards/physical description: No description request: { automatic_routing_enabled?: boolean fund_id?: string | null shipping_address: { address1: string address2?: string | null city: string country: string postal_code: string state?: string | null } user_id: string } response: { automatic_routing_enabled?: boolean cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: { value?: string | null } name_line_2?: { value?: string | null } } } cardholder_uuid?: string | null fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string | null recipient_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' | null return_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } | null } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } | null fund_id?: string | null has_program_overridden: boolean id?: string is_physical?: boolean is_primary?: boolean is_suspended: boolean last_four: string state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' } --- title: Terminate a card path: /developer/v1/cards/physical/{card_id} description: Please note that this action is irreversible. request: none response: none --- title: Fetch a physical card path: /developer/v1/cards/physical/{card_id} description: No description request: none response: { automatic_routing_enabled?: boolean cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: { value?: string | null } name_line_2?: { value?: string | null } } } cardholder_uuid?: string | null fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string | null recipient_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' | null return_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } | null } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } | null fund_id?: string | null has_program_overridden: boolean id?: string is_physical?: boolean is_primary?: boolean is_suspended: boolean last_four: string state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' } --- title: Update a physical card path: /developer/v1/cards/physical/{card_id} description: No description request: { automatic_routing_enabled?: boolean display_name?: string fund_id?: string | null } response: { automatic_routing_enabled?: boolean cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: { value?: string | null } name_line_2?: { value?: string | null } } } cardholder_uuid?: string | null fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string | null recipient_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' | null return_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } | null } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } | null fund_id?: string | null has_program_overridden: boolean id?: string is_physical?: boolean is_primary?: boolean is_suspended: boolean last_four: string state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' } --- title: Unsuspend a card path: /developer/v1/cards/physical/{card_id}/suspension description: No description request: none response: { automatic_routing_enabled?: boolean cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: { value?: string | null } name_line_2?: { value?: string | null } } } cardholder_uuid?: string | null fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string | null recipient_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' | null return_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } | null } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } | null fund_id?: string | null has_program_overridden: boolean id?: string is_physical?: boolean is_primary?: boolean is_suspended: boolean last_four: string state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' } --- title: Suspend a card path: /developer/v1/cards/physical/{card_id}/suspension description: The suspension is revertable. request: none response: { automatic_routing_enabled?: boolean cardholder_id?: string cardholder_name?: string created_at?: string /* date */ display_name: string expiration: string fulfillment: { card_personalization?: { text?: { name_line_1?: { value?: string | null } name_line_2?: { value?: string | null } } } cardholder_uuid?: string | null fulfillment_status?: 'DELIVERED' | 'DIGITALLY_PRESENTED' | 'ISSUED' | 'ORDERED' | 'REJECTED' | 'SHIPPED' shipping?: { method?: string | null recipient_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } recipient_address_verification_state?: 'NOT_VERIFIED' | 'OVERRIDEN' | 'VERIFIED' | null return_address?: { address1: string address2?: string | null city: string country: string first_name: string last_name: string phone?: string | null postal_code: string state?: string | null } | null } shipping_date?: string /* date */ shipping_eta?: string /* date */ shipping_tracking_url?: string } | null fund_id?: string | null has_program_overridden: boolean id?: string is_physical?: boolean is_primary?: boolean is_suspended: boolean last_four: string state?: 'ACTIVE' | 'CHIP_LOCKED' | 'SUSPENDED' | 'TERMINATED' | 'UNACTIVATED' } --- title: Create a spend limit and retrieve sensitive card details path: /developer/v1/cards/vault 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 | null 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: { allowed_overage_percent_override: string | null card: { created_at?: string /* date */ cvv?: string expiration?: string id?: string pan?: string } created_at: string /* date */ display_name: string | null restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ | null 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 | null } | null next_interval_reset: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } spend_limit_id: string spend_program_id: string | null user_id: string } --- title: Fetch a card's sensitive details path: /developer/v1/cards/vault/{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 virtual cards path: /developer/v1/cards/virtual description: No description request: none response: { data: { created_at?: string /* date */ fund_id: string | null id?: string is_card_suspended: boolean user_id?: string }[] page: { next: string | null } } --- title: Fetch a virtual card path: /developer/v1/cards/virtual/{card_id} description: No description request: none response: { created_at?: string /* date */ fund_id: string | null id?: string is_card_suspended: boolean user_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 | null } created_at?: string /* date */ entity_id?: string id?: string sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' }[] page: { next: string | null } } --- 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 | null } 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 | null } } --- 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: { created_at: string /* date */ id: string message: string user_id: string } --- 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 | null }[] label: string | null } | null } 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 | null corresponding_column_name?: string | null foreign_table: { table_name: string type?: 'custom_table' } | { table_name: 'accounting_field_options' | 'approver_groups' | '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' | 'approver_groups' | '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 | null corresponding_column_name?: string | null foreign_table: { table_name: string type?: 'custom_table' } | { table_name: 'accounting_field_options' | 'approver_groups' | '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 | null } } --- 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 | null 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 | null table_id: string table_name: 'accounting_field_options' | 'approver_groups' | '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 | null id: number is_active: boolean uuid: string } | null 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 | null } } --- 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' | 'approver_groups' | '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 | null } } --- 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 | null 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 | null 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 | null 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 | null table_name: 'accounting_field_options' | 'business_entities' | 'departments' | 'locations' | 'users' type?: 'native_table' } | { type?: 'number' } label: string name?: string | null }[] label: string name?: string | null result_columns: { cardinality: 'many_to_many' | 'many_to_one' label: string name?: string | null native_table: { accounting_field_ramp_id?: string | null table_name: 'accounting_field_options' | 'approver_groups' | 'users' type?: 'native_table' } }[] } response: { table_id: string } --- 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 | null native_table: { accounting_field_ramp_id?: string | null table_name: 'accounting_field_options' | 'approver_groups' | 'users' type?: 'native_table' } } response: { column_id: string } --- 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[] | null filters?: { column_name: string one_of: string[] }[] | null page_size?: number start?: string | null } response: { data: { id: string inputs: { column_name: string display_name: string | null identifier?: { column_name: string value: string } | { value: number } | null }[] results: { column_name: string display_name: string | null identifier: { column_name: string value: string } | null }[] }[] page: { next: string | null } 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 } | null number_identifier?: number | string | null }[] results: { column_name: string identifier: { column_name: string value: string } | null }[] }[] } 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 } | null number_identifier?: number | string | null }[] results: { column_name: string identifier: { column_name: string value: string } | null }[] }[] 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 } | null number_identifier?: number | string | null }[] results: { column_name: string identifier: { column_name: string value: string } | null }[] }[] } 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' | 'approver_groups' | '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 | null } } --- 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 | null 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 | null table_id: string table_name: 'accounting_field_options' | 'approver_groups' | '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 | null id: number is_active: boolean uuid: string } | null 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 | null } } --- 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' | 'approver_groups' | '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 | null } } --- 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 | null 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 | null 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 | null name: string }[] row: { column_name: string value: string } }[] skip_removing_already_missing?: boolean } 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 | null } } --- title: Create a department path: /developer/v1/departments description: No description request: { name: string } response: { id: string name: string } --- 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 | null 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_ACH_CREDIT_BANK_ACCOUNT' | 'AR_BAD_DEBT_ACCOUNT' | 'AR_CARD_FEES_ACCOUNT' | 'AR_CASH_ACCOUNT_DEFAULT' | 'AR_CHARGEBACK_CLEARING_ACCOUNT' | 'AR_DEFERRED_REVENUE_ACCOUNT_DEFAULT' | 'AR_INCOME_ACCOUNT_DEFAULT' | 'AR_REFUNDS_CLEARING_ACCOUNT' | 'AR_SALES_TAX_PAYABLE_ACCOUNT' | 'AR_UNBILLED_ACCOUNTS_RECEIVABLE_ACCOUNT' | 'AR_UNDEPOSITED_FUNDS_ACCOUNT' | 'BILL_PAY_ACCOUNTS_PAYABLE_ACCOUNT' | 'BILL_PAY_BANK_ACCOUNT' | 'BILL_PAY_FX_GAIN_LOSS_ACCOUNT' | 'BILL_PAY_RETAINAGE_PAYABLE_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' | 'FIXED_ASSET_ACCUMULATED_IMPAIRMENT_ACCOUNT' | 'FIXED_ASSET_GAIN_ACCOUNT' | 'FIXED_ASSET_IMPAIRMENT_LOSS_ACCOUNT' | 'FIXED_ASSET_LOSS_ACCOUNT' | 'FIXED_ASSET_PROCEEDS_ON_DISPOSAL_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' | null }[] connected_subsidiary: { external_id: string id: string name: string } | null 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' | 'USDSUI' | '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' | null 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' | 'approver_groups' | '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_bill_pay_payment_account_id: string | null entity_name: string id: string is_primary: boolean | null location_ids: string[] payment_accounts: { account_name: string account_number_last_four: string currency: string id: string }[] }[] page: { next: string | null } } --- title: Get a business entity path: /developer/v1/entities/{entity_id} description: No description request: none response: { accounts: { bank_account_id: string | null 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_ACH_CREDIT_BANK_ACCOUNT' | 'AR_BAD_DEBT_ACCOUNT' | 'AR_CARD_FEES_ACCOUNT' | 'AR_CASH_ACCOUNT_DEFAULT' | 'AR_CHARGEBACK_CLEARING_ACCOUNT' | 'AR_DEFERRED_REVENUE_ACCOUNT_DEFAULT' | 'AR_INCOME_ACCOUNT_DEFAULT' | 'AR_REFUNDS_CLEARING_ACCOUNT' | 'AR_SALES_TAX_PAYABLE_ACCOUNT' | 'AR_UNBILLED_ACCOUNTS_RECEIVABLE_ACCOUNT' | 'AR_UNDEPOSITED_FUNDS_ACCOUNT' | 'BILL_PAY_ACCOUNTS_PAYABLE_ACCOUNT' | 'BILL_PAY_BANK_ACCOUNT' | 'BILL_PAY_FX_GAIN_LOSS_ACCOUNT' | 'BILL_PAY_RETAINAGE_PAYABLE_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' | 'FIXED_ASSET_ACCUMULATED_IMPAIRMENT_ACCOUNT' | 'FIXED_ASSET_GAIN_ACCOUNT' | 'FIXED_ASSET_IMPAIRMENT_LOSS_ACCOUNT' | 'FIXED_ASSET_LOSS_ACCOUNT' | 'FIXED_ASSET_PROCEEDS_ON_DISPOSAL_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' | null }[] connected_subsidiary: { external_id: string id: string name: string } | null 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' | 'USDSUI' | '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' | null 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' | 'approver_groups' | '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_bill_pay_payment_account_id: string | null entity_name: string id: string is_primary: boolean | null location_ids: string[] payment_accounts: { account_name: string account_number_last_four: string currency: string id: string }[] } --- title: List funds path: /developer/v1/funds description: No description request: none response: { data: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null }[] page: { next: string | null } } --- title: Create a fund path: /developer/v1/funds description: Fund may either be created with spend_program_id (inherits program defaults) or standalone (must provide display_name, spending_restrictions, and permitted_spend_types). request: { accounting_rules?: { field_id: string field_option_id: string }[] display_name?: string is_exempt_from_policy_agent?: boolean is_shareable?: boolean permitted_spend_types?: { physical_card: boolean reimbursements: boolean virtual_card: boolean } spend_program_id?: string spending_restrictions?: { allowed_category_codes?: number[] allowed_vendor_ids?: string[] blocked_category_codes?: number[] blocked_mcc_codes?: string[] blocked_vendor_ids?: string[] interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code?: string } lock_date?: string /* date */ | null transaction_amount_limit?: { amount: number currency_code?: string } } user_id: string } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Terminate a fund path: /developer/v1/funds/{fund_id} description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Fetch a fund path: /developer/v1/funds/{fund_id} description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Update a fund path: /developer/v1/funds/{fund_id} description: No description request: { accounting_rules?: { field_id: string field_option_id: string }[] display_name?: string is_exempt_from_policy_agent?: boolean is_shareable?: boolean permitted_spend_types?: { physical_card: boolean reimbursements: boolean virtual_card: boolean } spend_program_id?: string | null spending_restrictions?: { allowed_category_codes?: number[] allowed_vendor_ids?: string[] blocked_category_codes?: number[] blocked_mcc_codes?: string[] blocked_vendor_ids?: string[] interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' is_temporary_increase?: boolean limit?: { amount: number currency_code?: string } lock_date?: string /* date */ | null transaction_amount_limit?: { amount: number currency_code?: string } } } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Remove members from a fund path: /developer/v1/funds/{fund_id}/members description: No description request: { user_ids: string[] } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Add members to a fund path: /developer/v1/funds/{fund_id}/members description: No description request: { user_ids: string[] } response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Unsuspend a fund member path: /developer/v1/funds/{fund_id}/members/{user_id}/suspension description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Suspend a fund member path: /developer/v1/funds/{fund_id}/members/{user_id}/suspension description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Unsuspend a fund path: /developer/v1/funds/{fund_id}/suspension description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: Suspend a fund path: /developer/v1/funds/{fund_id}/suspension description: No description request: none response: { balance: { cleared: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total: { amount: number currency_code: string minor_unit_conversion_rate: number | null } } | null cards: { card_id: string created_at: string /* date */ display_name: string expiration: string last_four: string user_id: string }[] created_at: string /* date */ display_name: string entity_id: string | null id: string is_exempt_from_policy_agent: boolean is_shareable: boolean members: { suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null user_id: string }[] overrides_spend_program: boolean permitted_spend_types: { physical_card_enabled: boolean reimbursements_enabled: boolean virtual_card_enabled: boolean } spend_program_id: string | null spending_restrictions: { allowed_category_codes: number[] | null allowed_vendor_ids: string[] | null auto_lock_date: string /* date */ | null blocked_category_codes: number[] | null blocked_vendor_ids: string[] | null interval?: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null next_interval_resets_at: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null state: 'ACTIVE' | 'ARCHIVED' | 'SUSPENDED' | 'TERMINATED' suspension: { suspended_at: string /* date */ | null suspended_by_ramp: boolean suspended_by_user_id: string | null } | null } --- title: List item receipts path: /developer/v1/item-receipts description: No description request: none response: { data: { archived_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null id: string inventory_assignments: { expiration_date: string /* date */ | null id: string lot_number: string quantity: string }[] memo: string | null purchase_order_line_item_id: string quantity: number | null remote_id: string | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] memo: string | null purchase_order_id: string received_at: string /* date */ remote_id: string | null }[] page: { next: string | null } } --- title: Create an item receipt path: /developer/v1/item-receipts description: No description request: { item_receipt_line_items: { inventory_assignments?: { expiration_date?: string /* date */ | null lot_number: string quantity: string | number }[] purchase_order_line_item_id: string unit_quantity?: number | null }[] item_receipt_number: string memo?: string | null purchase_order_id: string received_at: string /* date */ } response: { archived_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null id: string inventory_assignments: { expiration_date: string /* date */ | null id: string lot_number: string quantity: string }[] memo: string | null purchase_order_line_item_id: string quantity: number | null remote_id: string | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] memo: string | null purchase_order_id: string received_at: string /* date */ remote_id: string | null } --- title: Delete an item receipt path: /developer/v1/item-receipts/{item_receipt_id} description: No description request: none response: Record --- title: Fetch an item receipt path: /developer/v1/item-receipts/{item_receipt_id} description: No description request: none response: { archived_at: string /* date */ | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null id: string inventory_assignments: { expiration_date: string /* date */ | null id: string lot_number: string quantity: string }[] memo: string | null purchase_order_line_item_id: string quantity: number | null remote_id: string | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null }[] memo: string | null purchase_order_id: string received_at: string /* date */ remote_id: string | null } --- title: List locations path: /developer/v1/locations description: No description request: none response: { data: { entity_id: string id: string name: string }[] page: { next: string | null } } --- title: Create a location path: /developer/v1/locations description: No description request: { entity_id?: string name: string } response: { entity_id: string id: string name: string } --- 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 | null } } --- 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 | null }[] page: { next: string | null } } --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null }[] page: { next: string | null } } --- 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 | null free_form_text?: string | null }[] 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' | 'USDSUI' | '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 | null line_items: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string | null free_form_text?: string | null }[] description?: string | null external_id?: string | null unit_price: string | number unit_quantity: number withholding_rate?: string | number | null }[] memo?: string | null net_payment_terms?: number | null owner_id?: string | null promise_date?: string /* date */ | null purchase_order_number?: string | null spend_end_date?: string /* date */ | null spend_start_date?: string /* date */ | null three_way_match_enabled: boolean vendor_id?: string | null withholding_default_rate?: string | number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null created_at: string /* date */ creation_source: 'ACCOUNTING_PROVIDER' | 'DEVELOPER_API' | 'EXTERNAL_IMPORT' | 'RAMP' entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null } --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null 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: { allowed_dynamic_user_group_uuids?: string[] | null attachments?: RampDocumentSchema[] conditions: CustomFormConditionWithActions | null description: string | null exclude_from_ai_prefill?: boolean field: CustomFormFieldResponseDumpSchemaV2 field_id: string global_library_field_id?: string | null is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_approval_step?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean required_if_conditions?: CustomFormConditionWithActions | null short_title?: string | null validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string | null }[] label: string | null }[] label: string | null } | null } | null entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } custom_field_values: { column_display_name: string column_id: string is_archived: boolean 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' | 'approver_groups' | '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 } }[] description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null } --- 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 | null free_form_text?: string | null }[] memo?: string | null spend_end_date?: string /* date */ spend_start_date?: string /* date */ withholding_default_rate?: string | number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null 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: { allowed_dynamic_user_group_uuids?: string[] | null attachments?: RampDocumentSchema[] conditions: CustomFormConditionWithActions | null description: string | null exclude_from_ai_prefill?: boolean field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormUserFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string | null is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_approval_step?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean required_if_conditions?: CustomFormConditionWithActions | null short_title?: string | null validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string | null }[] label: string | null }[] label: string | null } | null } | null entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } custom_field_values: { column_display_name: string column_id: string is_archived: boolean 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' | 'approver_groups' | '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 } }[] description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null } --- title: Archive a purchase order path: /developer/v1/purchase-orders/{purchase_order_id}/archive description: No description request: { archived_reason?: string | null } response: Record --- 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 | null free_form_text?: string | null }[] description?: string | null external_id?: string | null unit_price: string | number unit_quantity: number withholding_rate?: string | number | null }[] } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null 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: { allowed_dynamic_user_group_uuids?: string[] | null attachments?: RampDocumentSchema[] conditions: CustomFormConditionWithActions | null description: string | null exclude_from_ai_prefill?: boolean field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormUserFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string | null is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_approval_step?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean required_if_conditions?: CustomFormConditionWithActions | null short_title?: string | null validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string | null }[] label: string | null }[] label: string | null } | null } | null entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } custom_field_values: { column_display_name: string column_id: string is_archived: boolean 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' | 'approver_groups' | '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 } }[] description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null } --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null 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: { allowed_dynamic_user_group_uuids?: string[] | null attachments?: RampDocumentSchema[] conditions: CustomFormConditionWithActions | null description: string | null exclude_from_ai_prefill?: boolean field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormUserFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string | null is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_approval_step?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean required_if_conditions?: CustomFormConditionWithActions | null short_title?: string | null validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string | null }[] label: string | null }[] label: string | null } | null } | null entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } custom_field_values: { column_display_name: string column_id: string is_archived: boolean 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' | 'approver_groups' | '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 } }[] description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null } --- 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 | null free_form_text?: string | null }[] description?: string | null unit_price?: string | number unit_quantity?: number withholding_rate?: string | number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } archived_at: string /* date */ | null bill_ids: string[] billing_status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null 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: { allowed_dynamic_user_group_uuids?: string[] | null attachments?: RampDocumentSchema[] conditions: CustomFormConditionWithActions | null description: string | null exclude_from_ai_prefill?: boolean field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormUserFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string | null is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_approval_step?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean required_if_conditions?: CustomFormConditionWithActions | null short_title?: string | null validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string | null }[] label: string | null }[] label: string | null } | null } | null entity_id: string external_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } custom_field_values: { column_display_name: string column_id: string is_archived: boolean 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' | 'approver_groups' | '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 } }[] description: string | null end_date: string /* date */ | null external_id: string | null id: string quantity: number | null remote_id: string | null start_date: string /* date */ | null unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null withholding_rate: string | null }[] memo: string | null name: string | null net_payment_terms: number | null owner_id: string | null promise_date: string /* date */ | null purchase_order_number: string | null ramp_url: string receipt_status: 'FULLY_RECEIVED' | 'NOT_RECEIVED' | 'OVER_RECEIVED' | 'PARTIALLY_RECEIVED' remote_id: string | null ship_to_address: { address1: string address2: string | null city: string country: string postal_code: string | null state: string | null } | null ship_to_company_name: string | null shipping_contact_email: string | null shipping_contact_first_name: string | null shipping_contact_last_name: string | null shipping_contact_phone_number: string | null spend_end_date: string /* date */ | null spend_program_id: string | null spend_request_id: string | null spend_start_date: string /* date */ | null spend_total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null three_way_match_enabled: boolean transaction_ids: string[] user_id: string | null vendor_id: string | null withholding_default_rate: string | null } --- 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: { email?: string id?: string } --- 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 | null line_items?: { item_date?: string /* date */ | null item_name?: string | null item_quantity?: number | null item_total_price?: number | null item_unit_price?: number | null }[] taxes?: { tax_amount?: number | null tax_name?: string | null tax_rate?: number | null }[] } | null receipt_url: string reimbursement_id?: string transaction_id?: string user_id?: string }[] page: { next: string | null } } --- 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 receipt: string transaction_id?: string | null user_id: string } response: { id?: string } --- 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 | null line_items?: { item_date?: string /* date */ | null item_name?: string | null item_quantity?: number | null item_total_price?: number | null item_unit_price?: number | null }[] taxes?: { tax_amount?: number | null tax_name?: string | null tax_rate?: number | null }[] } | null receipt_url: string reimbursement_id?: 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 */ | null accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] approved_at: string /* date */ | null attendees: { name: string user_id: string | null }[] created_at: string /* date */ direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number | null employee_id: string | null end_location: string | null entity_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_id: string | null id: string line_items: { accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null merchant: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_id: string | null payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null payment_batch_id: string | null payment_id: string | null payment_processed_at: string /* date */ | null receipts: string[] spend_limit_id: string | null start_location: string | null 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 */ | null sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ | null trace_id?: { descriptor: string | null trace_id: string | null } transaction_date: string /* date */ | null trip_id: string | null type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ | null user_email: string user_full_name: string user_id: string waypoints: string[] }[] page: { next: string | null } } --- 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 | null start_location?: string trip_date: string /* date */ waypoints?: string[] } response: { accounting_date: string /* date */ | null accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] approved_at: string /* date */ | null attendees: { name: string user_id: string | null }[] created_at: string /* date */ direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number | null employee_id: string | null end_location: string | null entity_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_id: string | null id: string line_items: { accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null merchant: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_id: string | null payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null payment_batch_id: string | null payment_id: string | null payment_processed_at: string /* date */ | null receipts: string[] spend_limit_id: string | null start_location: string | null 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 */ | null sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ | null trace_id?: { descriptor: string | null trace_id: string | null } transaction_date: string /* date */ | null trip_id: string | null type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ | null 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 receipt: string reimbursee_id: string reimbursement_id?: string | null } response: { accounting_date: string /* date */ | null accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] approved_at: string /* date */ | null attendees: { name: string user_id: string | null }[] created_at: string /* date */ direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number | null employee_id: string | null end_location: string | null entity_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_id: string | null id: string line_items: { accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null merchant: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_id: string | null payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null payment_batch_id: string | null payment_id: string | null payment_processed_at: string /* date */ | null receipts: string[] spend_limit_id: string | null start_location: string | null 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 */ | null sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ | null trace_id?: { descriptor: string | null trace_id: string | null } transaction_date: string /* date */ | null trip_id: string | null type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ | null user_email: string user_full_name: string user_id: string waypoints: string[] } --- title: Fetch a reimbursement path: /developer/v1/reimbursements/{reimbursement_id} description: No description request: none response: { accounting_date: string /* date */ | null accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] approved_at: string /* date */ | null attendees: { name: string user_id: string | null }[] created_at: string /* date */ direction: 'BUSINESS_TO_USER' | 'USER_TO_BUSINESS' distance: number | null employee_id: string | null end_location: string | null entity_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_id: string | null id: string line_items: { accounting_field_selections: { category_info: { external_id: string | null id: string | null name: string | null 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' | null } | null display_name: string | null external_code: string | null external_id: string | null id: string | null name: string | null provider_name: string | null source: { type?: string } | null 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' | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null memo: string | null }[] memo: string | null merchant: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_id: string | null payee_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null payment_batch_id: string | null payment_id: string | null payment_processed_at: string /* date */ | null receipts: string[] spend_limit_id: string | null start_location: string | null 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 */ | null sync_status: 'NOT_SYNC_READY' | 'SYNCED' | 'SYNC_READY' synced_at: string /* date */ | null trace_id?: { descriptor: string | null trace_id: string | null } transaction_date: string /* date */ | null trip_id: string | null type: 'MILEAGE' | 'OUT_OF_POCKET' | 'PAYBACK_FULL' | 'PAYBACK_PARTIAL' | 'PER_DIEM' updated_at: string /* date */ | null 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 | null id: string original_transaction_id: string | null repaid_at: string /* date */ | null repayment_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null status: 'AWAITING_MANUAL_REPAYMENT' | 'AWAITING_PAYMENT' | 'NONE' | 'REPAID' | 'REPAYMENT_FAILED' | 'REQUESTED_BY_REVIEWER' user_id: string | null user_signature: string | null }[] page: { next: string | null } } --- title: List custom roles path: /developer/v1/roles description: No description request: none response: { data: { base_role: string description: string | null id: string name: string product_capabilities: { access: string | null description: string name: 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 } | null restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ | null 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 | null } | null next_interval_reset: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null }[] page: { next: string | null } } --- 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[] } | null requestable?: { applies_to_all?: boolean department_ids?: string[] location_ids?: string[] user_custom_field_ids?: string[] } | null } | null 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: { 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 } | null restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ | null 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 | null } | null next_interval_reset: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null } --- 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 | null }[] label: string | null } | null } | null 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' }[] line_item_custom_fields: { description: string | null display_name: string field_type: 'boolean' | 'category' | 'currency' | 'date' | 'email' | 'multi_select' | 'number' | 'numeric_id' | 'paragraph' | 'percentage' | 'phone' | 'select' | 'text' | 'url' id: string is_required: boolean }[] permitted_spend_types: { primary_card_enabled: boolean reimbursements_enabled: boolean } | null restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ | null 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 | null } | null next_interval_reset: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } | null } --- 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 | null node_id: string service_key: string | null }[] } --- 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: { document: string 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 | null } credits: { amount: number currency_code: string minor_unit_conversion_rate: number | null } ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } entity_id: string id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } payments: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] charges: { amount: number currency_code: string minor_unit_conversion_rate: number | null } credits: { amount: number currency_code: string minor_unit_conversion_rate: number | null } end_date: string /* date */ ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } payments: { amount: number currency_code: string minor_unit_conversion_rate: number | null } preceding_statement_id?: string start_date: string /* date */ statement_lines: { cleared_at?: string /* date */ | null created_at: string /* date */ id?: string type?: 'CARD_TRANSACTION' | 'CASHBACK' | 'TRANSFER_PAYMENT' }[] statement_url?: string }[] page: { next: string | null } } --- 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 | null } credits: { amount: number currency_code: string minor_unit_conversion_rate: number | null } ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } entity_id: string id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } payments: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] charges: { amount: number currency_code: string minor_unit_conversion_rate: number | null } credits: { amount: number currency_code: string minor_unit_conversion_rate: number | null } end_date: string /* date */ ending_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } id: string opening_balance: { amount: number currency_code: string minor_unit_conversion_rate: number | null } payments: { amount: number currency_code: string minor_unit_conversion_rate: number | null } preceding_statement_id?: string start_date: string /* date */ statement_lines: { cleared_at?: string /* date */ | null 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` is required. If `scope` is omitted, the access token has no scopes. 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 | null 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 */ | null 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' } display_name: string | null 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' }[] all_requirements_met_and_approved: boolean amount?: number attendees?: { name: string user_id: string | null }[] 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 declined_amount: { 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' | 'USDSUI' | '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' value: number } | null 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_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_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' } display_name: string | null 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 | null } | null converted_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null id?: string | null memo?: string }[] memo?: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_category_code?: string merchant_category_code_description?: string merchant_data?: { auto_rental: { check_out?: string days?: number } | null flight: { departure_date: string | null passenger_name?: string segments: ApiTransactionPurchaseFlightSegment[] | null } | null lodging: { check_in?: string nights: number | null } | null receipt: { items?: ApiTransactionPurchaseReceiptLineItem[] } | null reference: string | null } merchant_descriptor?: string merchant_id: string | null merchant_location: { city: string | null country: string | null postal_code: string | null state: string | null } | null merchant_name?: string | null minor_unit_conversion_rate: number | null network_merchant_id: string | null original_transaction_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null original_transaction_id: string | null 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 | null sk_category_name: string | null 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 */ | null trip_id: string | null trip_name: string | null updated_at: string /* date */ | null user_transaction_time?: string /* date */ }[] page: { next: string | null } } --- 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 */ | null 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' } display_name: string | null 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' }[] all_requirements_met_and_approved: boolean amount?: number attendees?: { name: string user_id: string | null }[] 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 declined_amount: { 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' | 'USDSUI' | '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' value: number } | null 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_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_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' } display_name: string | null 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 | null } | null converted_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null id?: string | null memo?: string }[] memo?: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_category_code?: string merchant_category_code_description?: string merchant_data?: { auto_rental: { check_out?: string days?: number } | null flight: { departure_date: string | null passenger_name?: string segments: { arrival_airport_code?: string carrier?: string departure_airport_code?: string flight_number?: string service_class?: string stopover_allowed?: boolean }[] | null } | null lodging: { check_in?: string nights: number | null } | null receipt: { items?: { commodity_code: string | null description?: string discount: number | null quantity?: number tax: number | null total?: number unit_cost?: number }[] } | null reference: string | null } merchant_descriptor?: string merchant_id: string | null merchant_location: { city: string | null country: string | null postal_code: string | null state: string | null } | null merchant_name?: string | null minor_unit_conversion_rate: number | null network_merchant_id: string | null original_transaction_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null original_transaction_id: string | null policy_violations?: { created_at?: string /* date */ id?: string memo?: string type?: string }[] receipt_affidavit?: string | null receipts?: string[] requires_accounting_vendor_creation_to_sync?: boolean settlement_date?: string /* date */ sk_category_id: number | null sk_category_name: string | null 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 */ | null trip_id: string | null trip_name: string | null updated_at: string /* date */ | null user_transaction_time?: string /* date */ } --- title: Split a transaction into line items, or update an existing split path: /developer/v1/transactions/{transaction_id} description: Send line_items with amounts (in minor units) to create or replace the transaction's split; the line item amounts must sum to the transaction amount. Each line item can carry its own memo and accounting field selections. Send an empty line_items array to unsplit (remove all line items). Returns the updated transaction. request: { line_items?: { accounting_field_selections?: { field_external_id: string field_option_external_id?: string | null free_form_text?: string | null }[] amount: number memo?: string | null }[] | null } 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 */ | null 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' } display_name: string | null 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' }[] all_requirements_met_and_approved: boolean amount?: number attendees?: { name: string user_id: string | null }[] 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 declined_amount: { 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' | 'USDSUI' | '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' value: number } | null 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_amount: { 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' | 'USDSUI' | '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' value: number } | null entity_id: string | null fund_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' } display_name: string | null 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 | null } | null converted_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null id?: string | null memo?: string }[] memo?: string | null merchant_amount: { 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' | 'USDSUI' | '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' value: number } | null merchant_category_code?: string merchant_category_code_description?: string merchant_data?: { auto_rental: { check_out?: string days?: number } | null flight: { departure_date: string | null passenger_name?: string segments: { arrival_airport_code?: string carrier?: string departure_airport_code?: string flight_number?: string service_class?: string stopover_allowed?: boolean }[] | null } | null lodging: { check_in?: string nights: number | null } | null receipt: { items?: { commodity_code: string | null description?: string discount: number | null quantity?: number tax: number | null total?: number unit_cost?: number }[] } | null reference: string | null } merchant_descriptor?: string merchant_id: string | null merchant_location: { city: string | null country: string | null postal_code: string | null state: string | null } | null merchant_name?: string | null minor_unit_conversion_rate: number | null network_merchant_id: string | null original_transaction_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null original_transaction_id: string | null policy_violations?: { created_at?: string /* date */ id?: string memo?: string type?: string }[] receipt_affidavit?: string | null receipts?: string[] requires_accounting_vendor_creation_to_sync?: boolean settlement_date?: string /* date */ sk_category_id: number | null sk_category_name: string | null 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 */ | null trip_id: string | null trip_name: string | null updated_at: string /* date */ | null 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 | null } bank_account_id: string | null 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 | null } } --- 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 | null } bank_account_id: string | null 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 | null end_date: string /* date */ id: string length_in_days: number locations: { end_date: string /* date */ location: { city: string | null country: string | null latitude: number | null longitude: number | null state: string | null } 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 total_spend_amount: { 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' | 'USDSUI' | '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' value: number } | null travel_types: ('CAR' | 'FLIGHT' | 'HOTEL')[] updated_at: string /* date */ user_id: string }[][] page: { next: string | null } } --- title: Fetch a trip path: /developer/v1/trips/{trip_id} description: No description request: none response: { created_at: string /* date */ description: string | null end_date: string /* date */ id: string length_in_days: number locations: { end_date: string /* date */ location: { city: string | null country: string | null latitude: number | null longitude: number | null state: string | null } 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 total_spend_amount: { 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' | 'USDSUI' | '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' value: number } | null 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 | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ | null display_request_number: string | null entity: BusinessEntityLight id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { blank_canvas_execution_id: string | null earliest_due_date: string /* date */ | null has_blocking_approval_requirements: boolean | null 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 */ | null sla_duration_in_seconds: number | null spend_end_date?: string /* date */ | null spend_frequency: SpendRequestFrequency | null spend_start_date?: string /* date */ | null tasks: SpendRequestTask[] } & { existing_spend_request: { id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null spend_request_type: 'APPROVAL_ONLY' unified_spend_request_type: 'APPROVAL_ONLY' } | { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ | null display_request_number: string | null entity: BusinessEntityLight id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { blank_canvas_execution_id: string | null earliest_due_date: string /* date */ | null has_blocking_approval_requirements: boolean | null 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 */ | null sla_duration_in_seconds: number | null spend_end_date?: string /* date */ | null spend_frequency: SpendRequestFrequency | null spend_start_date?: string /* date */ | null tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money | null } & { existing_spend_request: { amount_details?: Money custom_form_collection_response_uuid?: string | null id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null purchase_order: ReducedPurchaseOrderForProcurementRequest | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null is_shareable: boolean lock_date?: string /* date */ | null lock_display: string | null relative_lock_duration_count: number | null relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' | null resulting_spend_allocation_id: string | null spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight | null } | null spend_eligibility_starts_at?: string /* date */ | null spend_request_type: 'SPEND_LIMIT' unified_spend_request_type: 'PROCUREMENT_SPEND_ALLOCATION' } | { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ | null display_request_number: string | null entity: BusinessEntityLight id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { blank_canvas_execution_id: string | null earliest_due_date: string /* date */ | null has_blocking_approval_requirements: boolean | null 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 */ | null sla_duration_in_seconds: number | null spend_end_date?: string /* date */ | null spend_frequency: SpendRequestFrequency | null spend_start_date?: string /* date */ | null tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money | null } & { existing_spend_request: { amount_details?: Money custom_form_collection_response_uuid?: string | null id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null purchase_order: ReducedPurchaseOrderForProcurementRequest | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null purchase_order: { id: string purchase_order_number: string | null } spend_request_type: 'PURCHASE_ORDER' unified_spend_request_type: 'PURCHASE_ORDER' } | { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ | null display_request_number: string | null entity: BusinessEntityLight id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { amount_details: Money spend_frequency: SpendRequestFrequency | null } & { existing_spend_allocation_id: string | null existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null is_shareable: boolean issuance_parameters: { is_physical?: boolean is_temporary_edit_requested?: boolean requesting_physical_card?: boolean } | null lock_date?: string /* date */ | null lock_display: string | null payment_restrictions: { primary_card_enabled?: boolean reimbursements_enabled?: boolean virtual_card_enabled?: boolean } | null post_spend_approval_instance_policy: { id: string is_default: boolean name: string | null } | null prediction: { explanations?: string[] feedback?: SpendAllocationRequestReviewPredictionFeedback[] overall_decision: string prediction_id: string single_sentence_summary?: string system_string_rationale: string } | null relative_lock_duration_count: number | null relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' | null restricted_request_type: 'SPEND_ALLOCATION' resulting_spend_allocation_id: string | null spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight | null } | null spend_eligibility_starts_at?: string /* date */ | null spend_request_type: 'SPEND_LIMIT' spending_restrictions?: { interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } travel_metadata: { origin: PublicTravelLocation | null payment_method: 'NONE' | 'SPEND_ALLOCATION' travel_location: PublicTravelLocation travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } | null unified_spend_request_type: 'SPEND_ALLOCATION' } | { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: ReducedUserForBaseUnifiedRequest deleted_at: string /* date */ | null display_request_number: string | null entity: BusinessEntityLight id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { resulting_spend_allocation_id: string | null spend_allocation_outcome_settings: { amount_details: Money is_shareable: boolean lock_date: string /* date */ | null payment_restrictions: PaymentRestrictions spend_eligibility_starts_at: string /* date */ | null spend_frequency: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } | null spend_request_type: 'TRAVEL' travel_metadata: { origin: PublicTravelLocation | null 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 | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null 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 */ | null display_request_number: string | null entity: { entity_name: string id: string } id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { blank_canvas_execution_id: string | null earliest_due_date: string /* date */ | null has_blocking_approval_requirements: boolean | null 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 */ | null sla_duration_in_seconds: number | null spend_end_date?: string /* date */ | null spend_frequency: SpendRequestFrequency | null spend_start_date?: string /* date */ | null tasks: SpendRequestTask[] } & { existing_spend_request: { id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null spend_request_type: 'APPROVAL_ONLY' unified_spend_request_type: 'APPROVAL_ONLY' } & { ai_intake_thread_id: string | null ai_request_copilot_thread_id: string | null 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 | null approver_comment?: string | null budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } | null change_request_custom_form_collection_response_uuid?: string | null comment_thread_uuid: string | null custom_form_collection_response_uuid?: string | null deleted_by_user?: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } | null deleted_reason?: string | null display_request_number: string | null internal_memo?: string | null pending_change_request?: { submitted_at: string /* date */ uuid: string } | null ramp_event_history_uuid: string | null } & { agent_executions: { agents?: AgentInWorkflow[] completed_agent_executions: CompletedAgentExecution[] } agreements: { auto_renewal: boolean available_actions: PayeeAgreementForUnifiedRequestDetailDumpAvailableActions currency: string days_remaining: PayeeAgreementDaysRemainingPydanticSchema description: string | null end_date: string /* date */ | null id: string last_date_to_terminate: string /* date */ | null name: string payee: ReducedPayeePydanticSchema renewal_brief: RenewalBriefForUnifiedRequestDetailSchema | null source: PayeeAgreementSpendRequestMappingSource start_date: string /* date */ | null total_value: number }[] ai_summary_async_job_uuid: string | null ai_summary_data: { span_id?: string | null summary?: string | null takeaways?: string[] | null title?: string | null } | null approval_chain_data: { approval_instance_uuid: string | null approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null is_delegate: boolean is_in_approval_reminder_cooldown: boolean | null is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string | null revert_note: string | null revert_note_author: string | null status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } | null approval_events: { _ramp_event_type: string acting_user_id: number | null approval_chain_events: SanitizedApprovalStep[] | null date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string | null }[] 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_ match_unmatch_transactions: ActionDetailSchema_MatchUnmatchTransactionsDenialReason_ request_again: ActionDetailSchema_RequestAgainDenialReason_ request_changes: ActionDetailSchema_RequestChangesDenialReason_ send_pdf_to_vendor: ActionDetailSchema_SendPdfToVendorDenialReason_ upload_bill: ActionDetailSchema_UploadBillDenialReason_ } blank_canvas_execution_id: string | null change_request_diff: { fields: (ProcurementChangeRequestAccountingFieldDiff | ProcurementChangeRequestFilesFieldDiff | ProcurementChangeRequestLegacyFieldDiff | ProcurementChangeRequestLineItemFieldDiff | ProcurementChangeRequestLinkFieldDiff | ProcurementChangeRequestTextFieldDiff)[] } | null 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' | 'QUESTIONNAIRE' | '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 | null download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null network_vendor_document_id: string | null original_filename: string ramp_document: ProcurementRampDocumentSchema | null spend_request_document_uuid: string | null url: string uuid: string }[] default_question_config_summary: { amount_config?: SpendIntentAmountQuestionConfig frequency_config?: SpendIntentFrequencyQuestionConfig funds_config?: SpendIntentFundsQuestionConfig request_name_config?: SpendIntentRequestNameQuestionConfig } draft_revision: number 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 | null is_requesting_new_vendor?: boolean is_user_on_approval_instance: boolean linkable_agreements: { auto_renewal: boolean | null currency?: Currency | null description: string | null end_date: string /* date */ | null last_date_to_terminate?: string /* date */ | null name: string | null payee_agreement_id: string payee_logo?: string | null payee_name?: string | null start_date: string /* date */ | null total_value: number | null 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' | 'QUESTIONNAIRE' | '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 | null external_document_url: string | null filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'ics' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'py' | 'txt' | 'webp' | 'xls' | 'xlsm' | 'xlsx' | 'xml' | 'zip' | null id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null original_filename: string | null payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse | null ramp_document: ProcurementRampDocumentSchema | null spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string | null spend_request_view_document_url: string type: none }[] renewals: { auto_renewal: boolean | null available_actions: PayeeRenewalForSpendRequestAvailableActionsSchema cancellation_reason: string | null created_at: string /* date */ currency: string | null days_remaining: PayeeRenewalDaysRemainingPydanticSchema deleted_at: string /* date */ | null effective_status: RenewalStatus end_date: string /* date */ | null id: string is_active: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null notifications_on: boolean num_seats: number | null source: PayeeRenewalSpendRequestMappingSource start_date: string /* date */ | null status: RenewalStatus | null total_value: number | null 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 | null raw_step_order: number status: 'ADMIN_APPROVED' | 'ADMIN_REJECTED' | 'APPROVED' | 'COMPLETED' | 'MANUALLY_SKIPPED' | 'PENDING' | 'REJECTED' | 'SKIPPED' | 'TERMINATED' step_creator_user_id: string | null step_date: string | null substeps: SanitizedApprovalSubstep[] trigger_entity_metadata?: TriggerEntityMetadata | null }[] | null sourcing_event: { current_rfx: RFXForProcurementRequestDetail | null id: string name: string } | null spend_intent_config_snapshot: { purchase_order?: PurchaseOrderConfigSnapshot | null } | null 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' | 'QUESTIONNAIRE' | '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 | null external_document_url: string | null filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'ics' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'py' | 'txt' | 'webp' | 'xls' | 'xlsm' | 'xlsx' | 'xml' | 'zip' | null id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null original_filename: string | null payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse | null ramp_document: ProcurementRampDocumentSchema | null spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string | null spend_request_view_document_url: string type: none }[] workflow_execution_status: { last_updated: string status: WorkflowExecutionStatus } | null 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' | 'QUESTIONNAIRE' | '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 | null download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null network_vendor_document_id: string | null original_filename: string ramp_document: ProcurementRampDocumentSchema | null spend_request_document_uuid: string | null url: string uuid: string }[] } | { ai_intake_thread_id: string | null ai_request_copilot_thread_id: string | null 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 | null approver_comment?: string | null budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } | null change_request_custom_form_collection_response_uuid?: string | null comment_thread_uuid: string | null custom_form_collection_response_uuid?: string | null deleted_by_user?: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } | null deleted_reason?: string | null display_request_number: string | null internal_memo?: string | null pending_change_request?: { submitted_at: string /* date */ uuid: string } | null ramp_event_history_uuid: string | null } & { agent_executions: { agents?: AgentInWorkflow[] completed_agent_executions: CompletedAgentExecution[] } agreements: { auto_renewal: boolean available_actions: PayeeAgreementForUnifiedRequestDetailDumpAvailableActions currency: string days_remaining: PayeeAgreementDaysRemainingPydanticSchema description: string | null end_date: string /* date */ | null id: string last_date_to_terminate: string /* date */ | null name: string payee: ReducedPayeePydanticSchema renewal_brief: RenewalBriefForUnifiedRequestDetailSchema | null source: PayeeAgreementSpendRequestMappingSource start_date: string /* date */ | null total_value: number }[] ai_summary_async_job_uuid: string | null ai_summary_data: { span_id?: string | null summary?: string | null takeaways?: string[] | null title?: string | null } | null approval_chain_data: { approval_instance_uuid: string | null approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null is_delegate: boolean is_in_approval_reminder_cooldown: boolean | null is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string | null revert_note: string | null revert_note_author: string | null status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } | null approval_events: { _ramp_event_type: string acting_user_id: number | null approval_chain_events: SanitizedApprovalStep[] | null date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string | null }[] 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_ match_unmatch_transactions: ActionDetailSchema_MatchUnmatchTransactionsDenialReason_ request_again: ActionDetailSchema_RequestAgainDenialReason_ request_changes: ActionDetailSchema_RequestChangesDenialReason_ send_pdf_to_vendor: ActionDetailSchema_SendPdfToVendorDenialReason_ upload_bill: ActionDetailSchema_UploadBillDenialReason_ } blank_canvas_execution_id: string | null change_request_diff: { fields: (ProcurementChangeRequestAccountingFieldDiff | ProcurementChangeRequestFilesFieldDiff | ProcurementChangeRequestLegacyFieldDiff | ProcurementChangeRequestLineItemFieldDiff | ProcurementChangeRequestLinkFieldDiff | ProcurementChangeRequestTextFieldDiff)[] } | null 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' | 'QUESTIONNAIRE' | '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 | null download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null network_vendor_document_id: string | null original_filename: string ramp_document: ProcurementRampDocumentSchema | null spend_request_document_uuid: string | null url: string uuid: string }[] default_question_config_summary: { amount_config?: SpendIntentAmountQuestionConfig frequency_config?: SpendIntentFrequencyQuestionConfig funds_config?: SpendIntentFundsQuestionConfig request_name_config?: SpendIntentRequestNameQuestionConfig } draft_revision: number 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 | null is_requesting_new_vendor?: boolean is_user_on_approval_instance: boolean linkable_agreements: { auto_renewal: boolean | null currency?: Currency | null description: string | null end_date: string /* date */ | null last_date_to_terminate?: string /* date */ | null name: string | null payee_agreement_id: string payee_logo?: string | null payee_name?: string | null start_date: string /* date */ | null total_value: number | null 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' | 'QUESTIONNAIRE' | '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 | null external_document_url: string | null filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'ics' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'py' | 'txt' | 'webp' | 'xls' | 'xlsm' | 'xlsx' | 'xml' | 'zip' | null id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null original_filename: string | null payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse | null ramp_document: ProcurementRampDocumentSchema | null spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string | null spend_request_view_document_url: string type: none }[] renewals: { auto_renewal: boolean | null available_actions: PayeeRenewalForSpendRequestAvailableActionsSchema cancellation_reason: string | null created_at: string /* date */ currency: string | null days_remaining: PayeeRenewalDaysRemainingPydanticSchema deleted_at: string /* date */ | null effective_status: RenewalStatus end_date: string /* date */ | null id: string is_active: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null notifications_on: boolean num_seats: number | null source: PayeeRenewalSpendRequestMappingSource start_date: string /* date */ | null status: RenewalStatus | null total_value: number | null 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 | null raw_step_order: number status: 'ADMIN_APPROVED' | 'ADMIN_REJECTED' | 'APPROVED' | 'COMPLETED' | 'MANUALLY_SKIPPED' | 'PENDING' | 'REJECTED' | 'SKIPPED' | 'TERMINATED' step_creator_user_id: string | null step_date: string | null substeps: SanitizedApprovalSubstep[] trigger_entity_metadata?: TriggerEntityMetadata | null }[] | null sourcing_event: { current_rfx: RFXForProcurementRequestDetail | null id: string name: string } | null spend_intent_config_snapshot: { purchase_order?: PurchaseOrderConfigSnapshot | null } | null 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' | 'QUESTIONNAIRE' | '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 | null external_document_url: string | null filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'ics' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'py' | 'txt' | 'webp' | 'xls' | 'xlsm' | 'xlsx' | 'xml' | 'zip' | null id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null original_filename: string | null payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse | null ramp_document: ProcurementRampDocumentSchema | null spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string | null spend_request_view_document_url: string type: none }[] workflow_execution_status: { last_updated: string status: WorkflowExecutionStatus } | null 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' | 'QUESTIONNAIRE' | '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 | null download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null network_vendor_document_id: string | null original_filename: string ramp_document: ProcurementRampDocumentSchema | null spend_request_document_uuid: string | null url: string uuid: string }[] } & { purchase_order: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string | null purchase_order_fund_uuid: string | null purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string | null should_create_fund_on_approval: boolean } purchase_order_detail: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string | null purchase_order_fund_uuid: string | null purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string | null should_create_fund_on_approval: boolean } total_amount_details_in_business_default_currency: { amount: number 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' | 'USDSUI' | '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' currency_sign: string formatted_amount: string formatted_explicit_amount: string formatted_short_amount: string name: string num_decimal_places: number } | null } & { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null 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 */ | null display_request_number: string | null entity: { entity_name: string id: string } id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { blank_canvas_execution_id: string | null earliest_due_date: string /* date */ | null has_blocking_approval_requirements: boolean | null 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 */ | null sla_duration_in_seconds: number | null spend_end_date?: string /* date */ | null spend_frequency: SpendRequestFrequency | null spend_start_date?: string /* date */ | null tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money | null } & { existing_spend_request: { amount_details?: Money custom_form_collection_response_uuid?: string | null id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null purchase_order: ReducedPurchaseOrderForProcurementRequest | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null is_shareable: boolean lock_date?: string /* date */ | null lock_display: string | null relative_lock_duration_count: number | null relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' | null resulting_spend_allocation_id: string | null spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight | null } | null spend_eligibility_starts_at?: string /* date */ | null spend_request_type: 'SPEND_LIMIT' unified_spend_request_type: 'PROCUREMENT_SPEND_ALLOCATION' } | { ai_intake_thread_id: string | null ai_request_copilot_thread_id: string | null 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 | null approver_comment?: string | null budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } | null change_request_custom_form_collection_response_uuid?: string | null comment_thread_uuid: string | null custom_form_collection_response_uuid?: string | null deleted_by_user?: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } | null deleted_reason?: string | null display_request_number: string | null internal_memo?: string | null pending_change_request?: { submitted_at: string /* date */ uuid: string } | null ramp_event_history_uuid: string | null } & { agent_executions: { agents?: AgentInWorkflow[] completed_agent_executions: CompletedAgentExecution[] } agreements: { auto_renewal: boolean available_actions: PayeeAgreementForUnifiedRequestDetailDumpAvailableActions currency: string days_remaining: PayeeAgreementDaysRemainingPydanticSchema description: string | null end_date: string /* date */ | null id: string last_date_to_terminate: string /* date */ | null name: string payee: ReducedPayeePydanticSchema renewal_brief: RenewalBriefForUnifiedRequestDetailSchema | null source: PayeeAgreementSpendRequestMappingSource start_date: string /* date */ | null total_value: number }[] ai_summary_async_job_uuid: string | null ai_summary_data: { span_id?: string | null summary?: string | null takeaways?: string[] | null title?: string | null } | null approval_chain_data: { approval_instance_uuid: string | null approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null is_delegate: boolean is_in_approval_reminder_cooldown: boolean | null is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string | null revert_note: string | null revert_note_author: string | null status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } | null approval_events: { _ramp_event_type: string acting_user_id: number | null approval_chain_events: SanitizedApprovalStep[] | null date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string | null }[] 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_ match_unmatch_transactions: ActionDetailSchema_MatchUnmatchTransactionsDenialReason_ request_again: ActionDetailSchema_RequestAgainDenialReason_ request_changes: ActionDetailSchema_RequestChangesDenialReason_ send_pdf_to_vendor: ActionDetailSchema_SendPdfToVendorDenialReason_ upload_bill: ActionDetailSchema_UploadBillDenialReason_ } blank_canvas_execution_id: string | null change_request_diff: { fields: (ProcurementChangeRequestAccountingFieldDiff | ProcurementChangeRequestFilesFieldDiff | ProcurementChangeRequestLegacyFieldDiff | ProcurementChangeRequestLineItemFieldDiff | ProcurementChangeRequestLinkFieldDiff | ProcurementChangeRequestTextFieldDiff)[] } | null 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' | 'QUESTIONNAIRE' | '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 | null download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null network_vendor_document_id: string | null original_filename: string ramp_document: ProcurementRampDocumentSchema | null spend_request_document_uuid: string | null url: string uuid: string }[] default_question_config_summary: { amount_config?: SpendIntentAmountQuestionConfig frequency_config?: SpendIntentFrequencyQuestionConfig funds_config?: SpendIntentFundsQuestionConfig request_name_config?: SpendIntentRequestNameQuestionConfig } draft_revision: number 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 | null is_requesting_new_vendor?: boolean is_user_on_approval_instance: boolean linkable_agreements: { auto_renewal: boolean | null currency?: Currency | null description: string | null end_date: string /* date */ | null last_date_to_terminate?: string /* date */ | null name: string | null payee_agreement_id: string payee_logo?: string | null payee_name?: string | null start_date: string /* date */ | null total_value: number | null 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' | 'QUESTIONNAIRE' | '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 | null external_document_url: string | null filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'ics' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'py' | 'txt' | 'webp' | 'xls' | 'xlsm' | 'xlsx' | 'xml' | 'zip' | null id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null original_filename: string | null payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse | null ramp_document: ProcurementRampDocumentSchema | null spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string | null spend_request_view_document_url: string type: none }[] renewals: { auto_renewal: boolean | null available_actions: PayeeRenewalForSpendRequestAvailableActionsSchema cancellation_reason: string | null created_at: string /* date */ currency: string | null days_remaining: PayeeRenewalDaysRemainingPydanticSchema deleted_at: string /* date */ | null effective_status: RenewalStatus end_date: string /* date */ | null id: string is_active: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null notifications_on: boolean num_seats: number | null source: PayeeRenewalSpendRequestMappingSource start_date: string /* date */ | null status: RenewalStatus | null total_value: number | null 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 | null raw_step_order: number status: 'ADMIN_APPROVED' | 'ADMIN_REJECTED' | 'APPROVED' | 'COMPLETED' | 'MANUALLY_SKIPPED' | 'PENDING' | 'REJECTED' | 'SKIPPED' | 'TERMINATED' step_creator_user_id: string | null step_date: string | null substeps: SanitizedApprovalSubstep[] trigger_entity_metadata?: TriggerEntityMetadata | null }[] | null sourcing_event: { current_rfx: RFXForProcurementRequestDetail | null id: string name: string } | null spend_intent_config_snapshot: { purchase_order?: PurchaseOrderConfigSnapshot | null } | null 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' | 'QUESTIONNAIRE' | '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 | null external_document_url: string | null filetype: 'base64' | 'csv' | 'doc' | 'docx' | 'eml' | 'gif' | 'gz' | 'heic' | 'html' | 'ics' | 'iif' | 'jpeg' | 'json' | 'jsonl' | 'md' | 'msg' | 'npy' | 'ods' | 'parquet' | 'pdf' | 'pgp' | 'png' | 'py' | 'txt' | 'webp' | 'xls' | 'xlsm' | 'xlsx' | 'xml' | 'zip' | null id: string is_ocr_document: boolean mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null original_filename: string | null payee_agreement_ids: string[] procurement_document_result_response: ProcurementDocumentResultResponse | null ramp_document: ProcurementRampDocumentSchema | null spend_request_document_url: string spend_request_download_document_url: string spend_request_uuid: string | null spend_request_view_document_url: string type: none }[] workflow_execution_status: { last_updated: string status: WorkflowExecutionStatus } | null 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' | 'QUESTIONNAIRE' | '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 | null download_url: string mime_type: 'application/json' | 'application/msword' | 'application/pdf' | 'application/vnd.apache.parquet' | 'application/vnd.ms-excel' | 'application/vnd.ms-excel.sheet.macroEnabled.12' | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' | 'image/gif' | 'image/heic' | 'image/jpeg' | 'image/png' | 'image/webp' | 'text/calendar' | 'text/csv' | 'text/markdown' | 'text/x-python' | null network_vendor_document_id: string | null original_filename: string ramp_document: ProcurementRampDocumentSchema | null spend_request_document_uuid: string | null url: string uuid: string }[] } & { purchase_order: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string | null purchase_order_fund_uuid: string | null purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string | null should_create_fund_on_approval: boolean } purchase_order_detail: { accounting_tracking_category_selections: PurchaseOrderAccountingTrackingCategorySelectionDump[] id: string punchout_order_id: string | null purchase_order_fund_uuid: string | null purchase_order_line_item_log_entries: PurchaseOrderLineItemLogEntryForProcurementRequestDetail[] purchase_order_number: string | null should_create_fund_on_approval: boolean } total_amount_details_in_business_default_currency: { amount: number 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' | 'USDSUI' | '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' currency_sign: string formatted_amount: string formatted_explicit_amount: string formatted_short_amount: string name: string num_decimal_places: number } | null } & { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null 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 */ | null display_request_number: string | null entity: { entity_name: string id: string } id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { blank_canvas_execution_id: string | null earliest_due_date: string /* date */ | null has_blocking_approval_requirements: boolean | null 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 */ | null sla_duration_in_seconds: number | null spend_end_date?: string /* date */ | null spend_frequency: SpendRequestFrequency | null spend_start_date?: string /* date */ | null tasks: SpendRequestTask[] } & { amount_details: Money total_amount_details: Money | null } & { existing_spend_request: { amount_details?: Money custom_form_collection_response_uuid?: string | null id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null purchase_order: ReducedPurchaseOrderForProcurementRequest | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null purchase_order: { id: string purchase_order_number: string | null } spend_request_type: 'PURCHASE_ORDER' unified_spend_request_type: 'PURCHASE_ORDER' } | { ai_intake_thread_id: string | null ai_request_copilot_thread_id: string | null 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 | null approver_comment?: string | null budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } | null change_request_custom_form_collection_response_uuid?: string | null comment_thread_uuid: string | null custom_form_collection_response_uuid?: string | null deleted_by_user?: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } | null deleted_reason?: string | null display_request_number: string | null internal_memo?: string | null pending_change_request?: { submitted_at: string /* date */ uuid: string } | null ramp_event_history_uuid: string | null } & { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null 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 */ | null display_request_number: string | null entity: { entity_name: string id: string } id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { amount_details: Money spend_frequency: SpendRequestFrequency | null } & { existing_spend_allocation_id: string | null existing_spend_request: { amount_details?: Money id?: string is_shareable?: boolean lock_date?: string /* date */ | null post_spend_approval_instance_policy: ApprovalPolicyLightSchema | null spend_eligibility_starts_at?: string /* date */ | null spend_frequency?: SpendRequestFrequency | null unified_request_id: string | null unified_spend_request_type: 'APPROVAL_ONLY' | 'PROCUREMENT_SPEND_ALLOCATION' | 'PURCHASE_ORDER' | 'SPEND_ALLOCATION' | 'TRAVEL' } | null is_shareable: boolean issuance_parameters: { is_physical?: boolean is_temporary_edit_requested?: boolean requesting_physical_card?: boolean } | null lock_date?: string /* date */ | null lock_display: string | null payment_restrictions: { primary_card_enabled?: boolean reimbursements_enabled?: boolean virtual_card_enabled?: boolean } | null post_spend_approval_instance_policy: { id: string is_default: boolean name: string | null } | null prediction: { explanations?: string[] feedback?: SpendAllocationRequestReviewPredictionFeedback[] overall_decision: string prediction_id: string single_sentence_summary?: string system_string_rationale: string } | null relative_lock_duration_count: number | null relative_lock_duration_unit: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' | null restricted_request_type: 'SPEND_ALLOCATION' resulting_spend_allocation_id: string | null spend_allocation: { id: string payment_restrictions: PaymentRestrictions submission_policy?: PolicyLight | null } | null spend_eligibility_starts_at?: string /* date */ | null spend_request_type: 'SPEND_LIMIT' spending_restrictions?: { interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } travel_metadata: { origin: PublicTravelLocation | null payment_method: 'NONE' | 'SPEND_ALLOCATION' travel_location: PublicTravelLocation travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } | null unified_spend_request_type: 'SPEND_ALLOCATION' } & { accounting_auto_mark_ready_rule_enabled: boolean accounting_rules: { id?: number tracking_category: { additional_data: TrackingCategorySchemaAdditionalData | null cardholder_edits_allowed: boolean default_option: TrackingCategoryOption | null display_name: string display_name_short: string entity_settings: TrackingCategoryEntitySetting[] helper_text: string | null id: number input_type: 'BOOLEAN' | 'DATE' | 'FREE_FORM_TEXT' | 'SINGLE_CHOICE' is_active: boolean is_custom_field: boolean is_erp_sourced: boolean is_hidden: boolean is_internal: boolean is_splittable: boolean refresh_status: TrackingCategoryRefreshStatusItem | null remote_field_locations: ('BODY' | 'EXPENSE_LINE' | 'ITEM_LINE' | 'LINE_ITEM')[] | null 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 | null display_name: string | null id: number is_active: boolean label: string parent?: TrackingCategoryOptionLight remote_code: string | null remote_id: string | null remote_name: string subtitle: string | null title: string uuid: string visibility: 'HIDDEN' | 'VISIBLE' } }[] approval_chain_data: { approval_instance_uuid: string | null approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null is_delegate: boolean is_in_approval_reminder_cooldown: boolean | null is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string | null revert_note: string | null revert_note_author: string | null status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } approval_events: { _ramp_event_type: string acting_user_id: number | null approval_chain_events: SanitizedApprovalStep[] | null date: string displayed_event_text: string event_order: number event_type: string notes: FormattedTextDataclass | string | null }[] archive_date: string /* date */ | null available_actions: { archive: { can_perform: boolean denial_reason: string | null } edit: { can_perform: boolean denial_reason: string | null } } available_actions_v2: { archive: ActionAllowedSchema | ActionDeniedSchema_ArchiveDenialReason_ edit_primary_fields: ActionAllowedSchema | ActionDeniedSchema_EditPrimaryFieldsDenialReason_ } default_transaction_memo: string | null 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 | null }[] spending_restrictions: { amount?: number amount_details: Money | null categories_blacklist?: number[] categories_whitelist?: number[] currency?: { 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' | 'USDSUI' | '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' currency_sign: string name: string num_decimal_places: number } interval: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' lock_date?: string /* date */ | null lock_display?: string | null relative_lock_duration_count?: number | null relative_lock_duration_unit?: 'DAYS' | 'MONTHS' | 'WEEKS' | 'YEARS' | null start_date?: string /* date */ | null transaction_amount_limit?: number | null vendor_blacklist?: number[] vendor_whitelist?: number[] } submission_policy_id: string | null travel_metadata: { origin: PublicTravelLocation | null payment_method: 'NONE' | 'SPEND_ALLOCATION' spend_estimate_line_items: TravelSpendEstimateLineItem[] travel_location: { city?: string | null country?: string | null lat?: number | null lng?: number | null state?: string | null timezone?: string trip_destination_id?: string | null } travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } | null trip: { id: string trip_name: string } | null } | { ai_intake_thread_id: string | null ai_request_copilot_thread_id: string | null 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 | null approver_comment?: string | null budget_path: { amount_details: BudgetAmountCellResponseSchemaBase path_entities: BudgetEntityCellWithTrackingCategoryResponseSchema[] path_id: string } | null change_request_custom_form_collection_response_uuid?: string | null comment_thread_uuid: string | null custom_form_collection_response_uuid?: string | null deleted_by_user?: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null role: 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'GUEST_USER' | 'IT_ADMIN' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' uuid: string } | null deleted_reason?: string | null display_request_number: string | null internal_memo?: string | null pending_change_request?: { submitted_at: string /* date */ uuid: string } | null ramp_event_history_uuid: string | null } & { approval_instance_id: string | null approved_at: string /* date */ | null created_at: string /* date */ created_by_user: { deleted_at: string /* date */ | null department: DepartmentDisplay | null email: string first_name: string full_name: string has_physical_card: boolean last_name: string location: LocationDisplay | null profile_picture_url: string | null 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 */ | null display_request_number: string | null entity: { entity_name: string id: string } id: string name: string | null ramp_url: string reason: string | null rejected_at: string /* date */ | null request_duration: number | null submitted_at: string /* date */ | null wbp_info: WbpInfoResponseSchema | null workflow_backed_policy_id: string | null } & { coordinator: ReducedUserForBaseUnifiedRequest | null laminar_session_id: string | null name: string | null omni_chat_thread_id: string | null owner: ReducedUserForBaseUnifiedRequest payee: ReducedPayee | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' secondary_display_name: string | null spend_intent: ReducedSpendIntentForBaseUnifiedSpendRequest | null spend_request_id: string spend_request_vendor_type: 'EXISTING' | 'NEW' | null unified_request_type: 'SPEND_REQUEST' user_defined_name: string | null } & { resulting_spend_allocation_id: string | null spend_allocation_outcome_settings: { amount_details: Money is_shareable: boolean lock_date: string /* date */ | null payment_restrictions: PaymentRestrictions spend_eligibility_starts_at: string /* date */ | null spend_frequency: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' } | null spend_request_type: 'TRAVEL' travel_metadata: { origin: PublicTravelLocation | null 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 | null approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null is_delegate: boolean is_in_approval_reminder_cooldown: boolean | null is_last_step_for_user: boolean needs_user_action: boolean needs_user_trigger_action: boolean reminder_communication_last_sent_at: string | null revert_note: string | null revert_note_author: string | null status: 'APPROVED' | 'INITIALIZED' | 'PENDING' | 'REJECTED' | 'TERMINATED' } attendees_count: number available_actions: { archive: { can_perform: boolean denial_reason: string | null } edit: { can_perform: boolean denial_reason: string | null } } group_trip: { id: string } | null 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 | null }[] 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 */ | null payment_restrictions: PaymentRestrictions post_spend_approval_instance_policy: ApprovalPolicyLightSchema spend_eligibility_starts_at: string /* date */ | null spend_frequency: 'ANNUAL' | 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'TERTIARY' | 'TOTAL' | 'WEEKLY' | 'YEARLY' submission_policy: PolicyLight vendor_blacklist: number[] vendor_whitelist: number[] } | null travel_metadata: { origin: PublicTravelLocation | null payment_method: 'NONE' | 'SPEND_ALLOCATION' spend_estimate_line_items: TravelSpendEstimateLineItem[] travel_location: { city?: string | null country?: string | null lat?: number | null lng?: number | null state?: string | null timezone?: string trip_destination_id?: string | null } travel_request_type: 'GROUP' | 'INDIVIDUAL' trip_end_date: string /* date */ trip_start_date: string /* date */ } trip: { id: string trip_name: string } | null } --- title: List users path: /developer/v1/users description: No description request: none response: { data: { business_id: string | null custom_fields: { name: string value: string }[] department_id: string | null email?: string employee_id: string | null entity_id: string | null first_name?: string id?: string is_manager: boolean last_name?: string location_id: string | null manager_id: string | null phone: string | null 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 */ | null scheduled_invitation_date: string /* date */ | null status: 'INVITE_EXPIRED' | 'INVITE_PENDING' | 'USER_ACTIVE' | 'USER_DRAFT' | 'USER_INACTIVE' | 'USER_ONBOARDING' | 'USER_SUSPENDED' }[] page: { next: string | null } } --- 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 */ | null } response: { id: string } --- 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 | null custom_fields: { name: string value: string }[] department_id: string | null email?: string employee_id: string | null entity_id: string | null first_name?: string id?: string is_manager: boolean last_name?: string location_id: string | null manager_id: string | null phone: string | null 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 */ | null scheduled_invitation_date: string /* date */ | null 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 | null 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 */ | null } 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 | null 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: { allowed_overage_percent_override: string | null card: { created_at?: string /* date */ cvv?: string expiration?: string id?: string pan?: string } created_at: string /* date */ display_name: string | null restrictions: { allowed_categories: number[] allowed_vendors: string[] auto_lock_date: string /* date */ | null 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 | null } | null next_interval_reset: string /* date */ | null start_of_interval: string /* date */ | null temporary_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null transaction_amount_limit: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null } spend_limit_id: string spend_program_id: string | null user_id: string } --- 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 | null address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } addresses: { address_line_1: string address_line_2?: string city: string country: string id: string is_default: boolean 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 | null default_payment_method: { policy?: DefaultPaymentMethodAddressPolicy | DefaultPaymentMethodBankAccountPolicy | DefaultPaymentMethodCardPolicy | null update_source?: 'AUTO' | 'MANUAL' | null } | null description?: string external_vendor_id: string | null 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 parent_vendor_id: string | null 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 | null } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_owner_id: string | null vendor_type?: 'BUSINESS' | 'INDIVIDUAL' }[] page: { next: string | null } } --- 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. Admin/owner tokens may set `requesting_user_id` in the body to choose the requestor recorded on any payment/tax details request created for this vendor. `acting_user_id` is accepted but ignored for backward compatibility. request: { accounting_vendor_remote_id?: string acting_user_id?: string | null address?: { address_line_1: string address_line_2?: string | null city: string country?: string | null postal_code: string state?: string | null } business_vendor_contacts: { email: string first_name?: string last_name?: string phone?: string } country: string default_entity_id?: string | null external_vendor_id?: string | null name?: string parent_vendor_id?: string | null request_payment_details?: boolean request_tax_details?: boolean requesting_user_id?: string | null state?: string | null vendor_owner_id?: string | null vendor_tracking_category_option_id?: string } response: { accounting_vendor_remote_id: string | null address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } addresses: { address_line_1: string address_line_2?: string city: string country: string id: string is_default: boolean 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 | null 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 account_number_last_four: string | null 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' | 'USDSUI' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | null update_source?: 'AUTO' | 'MANUAL' | null } | null description?: string external_vendor_id: string | null 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 parent_vendor_id: string | null 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 | null } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_owner_id: string | null 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' } | null auto_renews?: boolean | null contract_owner_ids?: string[] | null department_ids?: string[] | null end_date_range?: { end?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } start?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } } | null exclude_snoozed?: boolean | null has_end_date?: boolean | null has_pending_expansion_requests?: boolean | null has_reminders?: boolean | null include_archived?: boolean is_active?: boolean | null is_up_for_renewal?: boolean | null last_date_to_terminate_range?: { end?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } start?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } } | null max_days_remaining?: number | null max_end_date?: string /* date */ | null max_last_date_to_terminate?: string /* date */ | null max_start_date?: string /* date */ | null max_total_value?: string | number | null min_days_remaining?: number | null min_end_date?: string /* date */ | null min_last_date_to_terminate?: string /* date */ | null min_start_date?: string /* date */ | null min_total_value?: string | number | null page_size?: number payee_agreement_ids?: string[] | null payee_ids?: string[] | null payee_owner_ids?: string[] | null renewal_status?: ('CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED')[] | null renewal_status_exclude?: ('CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED')[] | null start?: string start_date_range?: { end?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } start?: { offset: number unit: 'day' | 'month' | 'quarter' | 'week' | 'year' } } | null } 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 | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null department?: { id: string name: string } | null description?: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date?: string /* date */ | null has_approved_renewal_request: boolean id: string is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate?: string /* date */ | null latest_renewal_request?: { currency: string id: string name?: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } | null logo?: string | null name: string notifications_on: boolean payee_id: string payee_name: string renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date?: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } updated_at: string /* date */ vendor_owners: { first_name: string full_name: string id: string last_name: string }[] }[] page: { next: string | null } } --- 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 */ | null auto_renewal: boolean available_actions: { can_action: { status: 'allowed' } | { denial_reason: 'NO_PERMISSION' status: 'denied' } 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' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'NO_PERMISSION' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string | null contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null description: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date: string /* date */ | null has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null latest_rejected_renewal_request?: { can_view: boolean id: string reason: string | null rejected_at: string /* date */ | null unified_request_id: string user_full_name: string } | null line_items?: Record[] | null 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 | null 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' } | null notifications_on: boolean payee: { approval_instance_uuid: string | null approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number | null } | null card_merchants: { merchant_name: string uuid: string }[] dba_name: string | null deleted_at: string /* date */ | null image_url: string | null is_draft: boolean name: string owners: { department: string | null email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string | null profile_picture_url: string | null }[] uuid: string website: string | null } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean | null approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } | null approvals_paused?: boolean | null approvals_paused_by?: { deleted_at: string | null email: string first_name: string id: string last_name: string lifecycle_status?: UserLifecycleStatus | null profile_picture_url: string | null role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'MACHINE_USER' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } | null can_add_steps?: boolean | null can_skip?: boolean | null current_step_in_chain: number | null has_blocking_approval_requirements?: boolean | null is_last_step_for_user: boolean is_pausable?: boolean | null last_action_date: string | null needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null approval_trigger_type: ApprovalTriggerType | null assigned_user_full_name: string assigned_user_id: string | null delegator_user_full_name: string | null delegator_user_id: string | null entity_full_name: string entity_id: string | null entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string | null notes: string | null provider_type?: string | null }[] number_of_approvals: number rejection_note?: string | null 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 | null id: string name: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string | null submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ | null id: string name: string | null paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } purchase_order_number: string | null spend_request: { approved_at: string /* date */ | null currency: string id: string name: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } start_date: string /* date */ | null status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] ramp_event_history_id: string renewal_action?: Record | null renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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 | null end_date?: string /* date */ | null last_date_to_terminate?: string /* date */ | null name?: string notifications_on?: boolean renewal_action?: { type?: 'NOT_STARTED' } | { mark_vendor_inactive?: boolean reason: string type?: 'CANCELLED' } | { type?: 'PLANNING' } | { reason: string type?: 'RENEWED' } renewal_notification_settings?: { notification_triggers?: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number }[] | null recipient_approval_group_uuids?: string[] | null recipient_dynamic_user_group_uuids?: string[] | null recipient_user_uuids?: string[] | null should_notify_contract_owner_managers?: boolean } | null renewal_notification_snooze?: { duration: number unit?: 'DAYS' } | { duration: number unit?: 'MONTHS' } | { duration: number unit?: 'WEEKS' } | null 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' | 'USDSUI' | '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 */ | null auto_renewal: boolean available_actions: { can_action: { status: 'allowed' } | { denial_reason: 'NO_PERMISSION' status: 'denied' } 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' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'NO_PERMISSION' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string | null contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null description: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date: string /* date */ | null has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null latest_rejected_renewal_request?: { can_view: boolean id: string reason: string | null rejected_at: string /* date */ | null unified_request_id: string user_full_name: string } | null line_items?: Record[] | null 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 | null 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' } | null notifications_on: boolean payee: { approval_instance_uuid: string | null approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number | null } | null card_merchants: { merchant_name: string uuid: string }[] dba_name: string | null deleted_at: string /* date */ | null image_url: string | null is_draft: boolean name: string owners: { department: string | null email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string | null profile_picture_url: string | null }[] uuid: string website: string | null } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean | null approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } | null approvals_paused?: boolean | null approvals_paused_by?: { deleted_at: string | null email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' | null profile_picture_url: string | null role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'MACHINE_USER' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } | null can_add_steps?: boolean | null can_skip?: boolean | null current_step_in_chain: number | null has_blocking_approval_requirements?: boolean | null is_last_step_for_user: boolean is_pausable?: boolean | null last_action_date: string | null needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null assigned_user_full_name: string assigned_user_id: string | null delegator_user_full_name: string | null delegator_user_id: string | null entity_full_name: string entity_id: string | null entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string | null notes: string | null provider_type?: string | null }[] number_of_approvals: number rejection_note?: string | null 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 | null id: string name: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string | null submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ | null id: string name: string | null paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } purchase_order_number: string | null spend_request: { approved_at: string /* date */ | null currency: string id: string name: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } start_date: string /* date */ | null status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] ramp_event_history_id: string renewal_action?: Record | null renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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: { documents?: string[] } 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 */ | null auto_renewal: boolean available_actions: { can_action: { status: 'allowed' } | { denial_reason: 'NO_PERMISSION' status: 'denied' } 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' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'NO_PERMISSION' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string | null contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null description: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date: string /* date */ | null has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null latest_rejected_renewal_request?: { can_view: boolean id: string reason: string | null rejected_at: string /* date */ | null unified_request_id: string user_full_name: string } | null line_items?: Record[] | null 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 | null 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' } | null notifications_on: boolean payee: { approval_instance_uuid: string | null approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number | null } | null card_merchants: { merchant_name: string uuid: string }[] dba_name: string | null deleted_at: string /* date */ | null image_url: string | null is_draft: boolean name: string owners: { department: string | null email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string | null profile_picture_url: string | null }[] uuid: string website: string | null } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean | null approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } | null approvals_paused?: boolean | null approvals_paused_by?: { deleted_at: string | null email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' | null profile_picture_url: string | null role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'MACHINE_USER' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } | null can_add_steps?: boolean | null can_skip?: boolean | null current_step_in_chain: number | null has_blocking_approval_requirements?: boolean | null is_last_step_for_user: boolean is_pausable?: boolean | null last_action_date: string | null needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null assigned_user_full_name: string assigned_user_id: string | null delegator_user_full_name: string | null delegator_user_id: string | null entity_full_name: string entity_id: string | null entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string | null notes: string | null provider_type?: string | null }[] number_of_approvals: number rejection_note?: string | null 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 | null id: string name: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string | null submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ | null id: string name: string | null paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } purchase_order_number: string | null spend_request: { approved_at: string /* date */ | null currency: string id: string name: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } start_date: string /* date */ | null status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] ramp_event_history_id: string renewal_action?: Record | null renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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 */ | null auto_renewal: boolean available_actions: { can_action: { status: 'allowed' } | { denial_reason: 'NO_PERMISSION' status: 'denied' } 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' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'NO_PERMISSION' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string | null contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null description: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date: string /* date */ | null has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null latest_rejected_renewal_request?: { can_view: boolean id: string reason: string | null rejected_at: string /* date */ | null unified_request_id: string user_full_name: string } | null line_items?: Record[] | null 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 | null 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' } | null notifications_on: boolean payee: { approval_instance_uuid: string | null approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number | null } | null card_merchants: { merchant_name: string uuid: string }[] dba_name: string | null deleted_at: string /* date */ | null image_url: string | null is_draft: boolean name: string owners: { department: string | null email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string | null profile_picture_url: string | null }[] uuid: string website: string | null } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean | null approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } | null approvals_paused?: boolean | null approvals_paused_by?: { deleted_at: string | null email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' | null profile_picture_url: string | null role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'MACHINE_USER' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } | null can_add_steps?: boolean | null can_skip?: boolean | null current_step_in_chain: number | null has_blocking_approval_requirements?: boolean | null is_last_step_for_user: boolean is_pausable?: boolean | null last_action_date: string | null needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null assigned_user_full_name: string assigned_user_id: string | null delegator_user_full_name: string | null delegator_user_id: string | null entity_full_name: string entity_id: string | null entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string | null notes: string | null provider_type?: string | null }[] number_of_approvals: number rejection_note?: string | null 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 | null id: string name: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string | null submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ | null id: string name: string | null paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } purchase_order_number: string | null spend_request: { approved_at: string /* date */ | null currency: string id: string name: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } start_date: string /* date */ | null status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] ramp_event_history_id: string renewal_action?: Record | null renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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 */ | null auto_renewal: boolean available_actions: { can_action: { status: 'allowed' } | { denial_reason: 'NO_PERMISSION' status: 'denied' } 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' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'NO_PERMISSION' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string | null contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null description: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date: string /* date */ | null has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null latest_rejected_renewal_request?: { can_view: boolean id: string reason: string | null rejected_at: string /* date */ | null unified_request_id: string user_full_name: string } | null line_items?: Record[] | null 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 | null 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' } | null notifications_on: boolean payee: { approval_instance_uuid: string | null approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number | null } | null card_merchants: { merchant_name: string uuid: string }[] dba_name: string | null deleted_at: string /* date */ | null image_url: string | null is_draft: boolean name: string owners: { department: string | null email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string | null profile_picture_url: string | null }[] uuid: string website: string | null } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean | null approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } | null approvals_paused?: boolean | null approvals_paused_by?: { deleted_at: string | null email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' | null profile_picture_url: string | null role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'MACHINE_USER' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } | null can_add_steps?: boolean | null can_skip?: boolean | null current_step_in_chain: number | null has_blocking_approval_requirements?: boolean | null is_last_step_for_user: boolean is_pausable?: boolean | null last_action_date: string | null needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null assigned_user_full_name: string assigned_user_id: string | null delegator_user_full_name: string | null delegator_user_id: string | null entity_full_name: string entity_id: string | null entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string | null notes: string | null provider_type?: string | null }[] number_of_approvals: number rejection_note?: string | null 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 | null id: string name: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string | null submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ | null id: string name: string | null paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } purchase_order_number: string | null spend_request: { approved_at: string /* date */ | null currency: string id: string name: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } start_date: string /* date */ | null status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] ramp_event_history_id: string renewal_action?: Record | null renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] applied_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bill_id: string }[] applied_draft_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bill_id: string }[] created_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } memo?: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } unit_quantity: number }[] reference_bill_id: string | null reference_number: string | null remaining_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_applied_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_id: string }[][] page: { next: string | null } } --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] applied_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bill_id: string }[] applied_draft_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bill_id: string }[] created_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } memo?: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } unit_quantity: number }[] reference_bill_id: string | null reference_number: string | null remaining_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_applied_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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, spend requests, or child vendors. 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 | null address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } addresses: { address_line_1: string address_line_2?: string city: string country: string id: string is_default: boolean postal_code: string state?: string }[] approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' 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: { allowed_dynamic_user_group_uuids?: string[] | null attachments?: RampDocumentSchema[] conditions: CustomFormConditionWithActions | null description: string | null exclude_from_ai_prefill?: boolean field: CustomFormAddressFieldResponseDumpSchema | CustomFormBooleanFieldResponseDumpSchema | CustomFormContactFieldResponseDumpSchema | CustomFormDateFieldResponseDumpSchema | CustomFormDepartmentFieldResponseDumpSchema | CustomFormEmailFieldResponseDumpSchema | CustomFormFileUploadFieldResponseDumpSchema | CustomFormLinkFieldResponseDumpSchema | CustomFormMerchantCategoryFieldResponseDumpSchema | CustomFormMerchantFieldResponseDumpSchema | CustomFormMonetaryAmountFieldResponseDumpSchema | CustomFormNumberFieldResponseDumpSchema | CustomFormParagraphFieldResponseDumpSchema | CustomFormTextFieldResponseDumpSchema | CustomFormTextMultiSelectFieldResponseDumpSchema | CustomFormTextSingleSelectFieldResponseDumpSchema | CustomFormUserFieldResponseDumpSchema | CustomFormVendorFieldResponseDumpSchema field_id: string global_library_field_id?: string | null is_mapped_to_ironclad_field?: boolean is_used_in_approval_workflow_approval_step?: boolean is_used_in_approval_workflow_condition?: boolean is_used_in_custom_form_workflow_condition?: boolean label: string required: boolean required_if_conditions?: CustomFormConditionWithActions | null short_title?: string | null validation_errors?: CustomFormFieldValidationErrorSchemaV2[] value_display_string: string | null }[] label: string | null }[] label: string | null } | null } | null 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' | 'approver_groups' | '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 } }[] | null default_entity_id: string | null 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 account_number_last_four: string | null 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' | 'USDSUI' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | null update_source?: 'AUTO' | 'MANUAL' | null } | null description?: string external_vendor_id: string | null 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 parent_vendor_id: string | null 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 | null } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_owner_id: string | null 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 | null city: string country?: string | null postal_code: string state?: string | null } country?: string default_entity_id?: string | null description?: string external_vendor_id?: string | null is_active?: boolean name?: string request_payment_details?: boolean request_tax_details?: boolean state?: string | null vendor_tracking_category_option_id?: string } response: { accounting_vendor_remote_id: string | null address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } addresses: { address_line_1: string address_line_2?: string city: string country: string id: string is_default: boolean 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 | null 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 account_number_last_four: string | null 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' | 'USDSUI' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | null update_source?: 'AUTO' | 'MANUAL' | null } | null description?: string external_vendor_id: string | null 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 parent_vendor_id: string | null 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 | null } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_owner_id: string | null 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 account_number_last_four: string | null 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' | 'USDSUI' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' }[] page: { next: string | null } } --- 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 account_number_last_four: string | null 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' | 'USDSUI' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | '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 | null } 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[] | null description?: string | null end_date?: string /* date */ | null last_date_to_terminate?: string /* date */ | null line_items?: { discount?: number | string | null price_per_unit: number | string product_or_service_name: string quantity: number | string term?: string | null time_unit?: string | null total_price?: number | string | null unit?: string | null }[] | null name: string notifications_on: boolean renewal_notification_settings?: { notification_triggers?: { contract_event: 'CONTRACT_ENDS_OR_RENEWS' | 'LAST_DATE_TO_TERMINATE' days_before: number }[] | null recipient_approval_group_uuids?: string[] | null recipient_dynamic_user_group_uuids?: string[] | null recipient_user_uuids?: string[] | null should_notify_contract_owner_managers?: boolean } | null 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' | 'USDSUI' | '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 */ | null auto_renewal: boolean available_actions: { can_action: { status: 'allowed' } | { denial_reason: 'NO_PERMISSION' status: 'denied' } 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' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } request_renewal: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'MARKED_AS_RENEWED' | 'MARKED_AS_WONT_RENEW' | 'NO_PERMISSION' | 'PENDING_EXPANSION_REQUEST' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } set_status: { status: 'allowed' } | { denial_reason: 'APPROVED_RENEWAL_REQUEST' | 'NO_PERMISSION' | 'PENDING_RENEWAL_REQUEST' status: 'denied' } } comment_thread_uuid: string | null contract_owners: { email: string first_name: string full_name: string id: string last_name: string profile_picture_url?: string | null }[] 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' | 'approver_groups' | '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' | null is_expired?: boolean | null is_overdue?: boolean | null num_days_until_end?: number | null } deleted_at?: string /* date */ | null description: string | null draft_spend_requests: { id: string name?: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' total_amount?: string | null unified_request_id: string updated_at?: string /* date */ | null }[] end_date: string /* date */ | null has_approved_renewal_request: boolean id: string is_active: boolean is_snoozed: boolean is_up_for_renewal: boolean last_date_to_terminate: string /* date */ | null latest_rejected_renewal_request?: { can_view: boolean id: string reason: string | null rejected_at: string /* date */ | null unified_request_id: string user_full_name: string } | null line_items?: Record[] | null 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 | null 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' } | null notifications_on: boolean payee: { approval_instance_uuid: string | null approval_status: 'APPROVED' | 'PENDING' | 'REJECTED' available_actions: { can_edit: boolean can_view: boolean } business_vendor: { uuid: string vendor_tracking_category_option_id: number | null } | null card_merchants: { merchant_name: string uuid: string }[] dba_name: string | null deleted_at: string /* date */ | null image_url: string | null is_draft: boolean name: string owners: { department: string | null email: string full_name: string id: string is_inactive: boolean is_terminated: boolean location: string | null profile_picture_url: string | null }[] uuid: string website: string | null } pending_spend_requests: { approval_chain_metadata: { allow_self_approvals?: boolean | null approval_reminder_cooldown?: { can_send_reminder: boolean period_in_days: number reminder_communication_last_sent_at: string } | null approvals_paused?: boolean | null approvals_paused_by?: { deleted_at: string | null email: string first_name: string id: string last_name: string lifecycle_status?: 'ACTIVE' | 'DELETED' | 'DRAFT' | 'INACTIVE' | 'PENDING' | null profile_picture_url: string | null role: 'ADVISOR_CONSOLE_ADMIN' | 'ADVISOR_CONSOLE_USER' | 'AUDITOR' | 'BUSINESS_ADMIN' | 'BUSINESS_BOOKKEEPER' | 'BUSINESS_OWNER' | 'BUSINESS_USER' | 'DEVELOPER_ADMIN' | 'GUEST_USER' | 'IT_ADMIN' | 'MACHINE_USER' | 'PRESALES_DEMO_USER' | 'UNBUNDLED_ADMIN' | 'UNBUNDLED_BOOKKEEPER' | 'UNBUNDLED_OWNER' | 'UNBUNDLED_USER' | 'VENDOR_NETWORK_ADMIN' } | null can_add_steps?: boolean | null can_skip?: boolean | null current_step_in_chain: number | null has_blocking_approval_requirements?: boolean | null is_last_step_for_user: boolean is_pausable?: boolean | null last_action_date: string | null needs_user_action: boolean next_approvers: { approval_trigger_instance_error_message: string | null approval_trigger_instance_error_redirect_url: string | null 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' | null assigned_user_full_name: string assigned_user_id: string | null delegator_user_full_name: string | null delegator_user_id: string | null entity_full_name: string entity_id: string | null entity_type: 'ANY_ADMIN' | 'GROUP' | 'MANAGER' | 'TRIGGER' | 'USER' | 'VENDOR_OWNER' | 'VENDOR_OWNER_MANAGER' external_url: string | null notes: string | null provider_type?: string | null }[] number_of_approvals: number rejection_note?: string | null 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 | null id: string name: string | null request_status: 'APPROVED' | 'DRAFT' | 'REJECTED' | 'SUBMITTED' source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' spend_intent_name: string | null submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string }[] purchase_orders: { can_view: boolean documents: Record[] end_date: string /* date */ | null id: string name: string | null paid_by_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } paid_by_card_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } pending_bill_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } purchase_order_number: string | null spend_request: { approved_at: string /* date */ | null currency: string id: string name: string | null source: 'EXPANSION_REQUEST' | 'RENEWAL' | 'REQUEST_APPROVAL' | 'REQUEST_LINKED_TO_AGREEMENT' submitted_at?: string /* date */ | null total_amount?: { amount: number currency_code: string minor_unit_conversion_rate: number | null } | null unified_request_id: string user_full_name: string } start_date: string /* date */ | null status?: 'CLOSED' | 'DELETED' | 'FULLY_BILLED' | 'OPEN' | 'PARTIALLY_BILLED' | null total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } }[] ramp_event_history_id: string renewal_action?: Record | null renewal_status: 'CANCELLED' | 'EXPIRED' | 'INITIATED' | 'NOT_STARTED' | 'PLANNING' | 'REJECTED' | 'RENEWED' start_date: string /* date */ | null total_value: { amount: number currency_code: string minor_unit_conversion_rate: number | null } updated_at: string /* date */ } --- title: List child vendors of a parent vendor path: /developer/v1/vendors/{vendor_id}/children description: No description request: none response: { data: { accounting_vendor_remote_id: string | null address?: { address_line_1: string address_line_2?: string city: string country: string postal_code: string state?: string } addresses: { address_line_1: string address_line_2?: string city: string country: string id: string is_default: boolean 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 | null 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 account_number_last_four: string | null 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' | 'USDSUI' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | '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' | 'DIRECT_DEBIT' | 'DOMESTIC_WIRE' | 'FED_NOW' | 'INTERNATIONAL' | 'LOCAL_BANK_TRANSFER' | 'ONE_TIME_CARD' | 'ONE_TIME_CARD_DELIVERY' | 'PAID_MANUALLY' | 'RTP' | 'SWIFT' | 'UNSPECIFIED' | 'VENDOR_CREDIT' kind: 'ADDRESS' | 'BANK_ACCOUNT' | 'CARD' | 'MANUAL' } | null update_source?: 'AUTO' | 'MANUAL' | null } | null description?: string external_vendor_id: string | null 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 parent_vendor_id: string | null 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 | null } total_spend_last_30_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_last_365_days: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_spend_ytd: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_owner_id: string | null vendor_type?: 'BUSINESS' | 'INDIVIDUAL' }[] page: { next: string | null } } --- 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 | null id: string is_default: boolean last_name: string | null phone: string | null }[] page: { next: string | null } } --- title: Create a vendor contact path: /developer/v1/vendors/{vendor_id}/contacts description: No description request: { email: string first_name?: string | null is_default?: boolean last_name?: string | null phone?: string | null } response: { contact_id?: string | null proposal_id?: string | null status: 'approved' | 'pending_approval' vendor_id: 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 | null id: string is_default: boolean last_name: string | null phone: string | null } --- 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] applied_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bill_id: string }[] applied_draft_bills: { amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } bill_id: string }[] created_at: string /* date */ | null entity_id: string | null 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } 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' } display_name: string | null external_code?: string | null external_id: string id: string name: string provider_name: string | null }[] amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } memo?: string unit_price: { amount: number currency_code: string minor_unit_conversion_rate: number | null } unit_quantity: number }[] reference_bill_id: string | null reference_number: string | null remaining_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } total_applied_amount: { amount: number currency_code: string minor_unit_conversion_rate: number | null } vendor_id: string }[][] page: { next: string | null } } --- title: Place a hold on a vendor path: /developer/v1/vendors/{vendor_id}/hold description: Blocks payments to this vendor by placing a vendor-scoped hold. Open, unpaid bills for the vendor that can still be modified are removed from scheduled payment flows. An optional `reason` can be supplied to record why the hold was placed. request: { reason?: string | null } response: none --- title: Release Vendor Hold path: /developer/v1/vendors/{vendor_id}/release description: Releases the active vendor-scoped hold and allows new payments to be scheduled for the vendor. Payments that were removed from scheduled payment flows while the hold was active must be scheduled again after the hold is released. request: none response: none --- 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 - Crypto: stablecoin wallet with a wallet address and network request: { account_nickname?: string ach_details?: { account_name?: string account_number: string account_owner_type?: 'BUSINESS' | 'INDIVIDUAL' account_type?: 'Checking' | 'Savings' routing_number: string } crypto_details?: { account_name?: string | null network: 'ARBITRUM_MAINNET' | 'AVALANCHE_MAINNET' | 'BASE_MAINNET' | 'ETHEREUM_MAINNET' | 'OPTIMISM_MAINNET' | 'PLASMA_MAINNET' | 'POLYGON_MAINNET' | 'SOLANA_MAINNET' | 'STELLAR_MAINNET' | 'SUI_MAINNET' | 'TEMPO_MAINNET' wallet_address: string } is_default?: boolean wire_details?: { account_name?: string account_number: string beneficiary_address?: { address_line_1: string address_line_2?: string | null city: string country: string postal_code: string state?: string | null } routing_number: string } } response: { payment_method_id?: string | null payment_method_type?: 'ach' | 'crypto' | 'wire' | null proposal_id?: string | null status: 'approved' | 'pending_approval' vendor_id: string } --- 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' | 'bills.updated' | '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' | 'spend_requests.created' | 'tests.test_event' | 'transactions.all_requirements_met_and_approved_changed' | 'transactions.authorized' | 'transactions.body_coding_updated' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.receipt_added' | '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' | 'vendor_agreements.archived' | 'vendor_agreements.created' | 'vendor_agreements.deleted' | 'vendor_agreements.document_added' | 'vendor_agreements.renewal_milestone' | 'vendor_agreements.updated' | 'vendors.activated' | 'vendors.approved' | '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' | 'bills.updated' | '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' | 'spend_requests.created' | 'tests.test_event' | 'transactions.all_requirements_met_and_approved_changed' | 'transactions.authorized' | 'transactions.body_coding_updated' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.receipt_added' | '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' | 'vendor_agreements.archived' | 'vendor_agreements.created' | 'vendor_agreements.deleted' | 'vendor_agreements.document_added' | 'vendor_agreements.renewal_milestone' | 'vendor_agreements.updated' | 'vendors.activated' | 'vendors.approved' | 'vendors.updated' | 'webhooks.verification')[] } response: { additional_headers: Record 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' | 'bills.updated' | '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' | 'spend_requests.created' | 'tests.test_event' | 'transactions.all_requirements_met_and_approved_changed' | 'transactions.authorized' | 'transactions.body_coding_updated' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.receipt_added' | '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' | 'vendor_agreements.archived' | 'vendor_agreements.created' | 'vendor_agreements.deleted' | 'vendor_agreements.document_added' | 'vendor_agreements.renewal_milestone' | 'vendor_agreements.updated' | 'vendors.activated' | 'vendors.approved' | 'vendors.updated' | 'webhooks.verification')[] id: string secret: string status: 'active' | 'inactive' | 'pending_verification' updated_at: string /* date */ } --- 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' | 'bills.updated' | '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' | 'spend_requests.created' | 'tests.test_event' | 'transactions.all_requirements_met_and_approved_changed' | 'transactions.authorized' | 'transactions.body_coding_updated' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.receipt_added' | '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' | 'vendor_agreements.archived' | 'vendor_agreements.created' | 'vendor_agreements.deleted' | 'vendor_agreements.document_added' | 'vendor_agreements.renewal_milestone' | 'vendor_agreements.updated' | 'vendors.activated' | 'vendors.approved' | 'vendors.updated' | 'webhooks.verification' object_id: string object_metadata: Record } response: { business_id: string created_at: string id: string object: Record type: 'applications.status_updated' | 'bills.approved' | 'bills.archived' | 'bills.created' | 'bills.paid' | 'bills.ready_to_sync' | 'bills.rejected' | 'bills.updated' | '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' | 'spend_requests.created' | 'tests.test_event' | 'transactions.all_requirements_met_and_approved_changed' | 'transactions.authorized' | 'transactions.body_coding_updated' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.receipt_added' | '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' | 'vendor_agreements.archived' | 'vendor_agreements.created' | 'vendor_agreements.deleted' | 'vendor_agreements.document_added' | 'vendor_agreements.renewal_milestone' | 'vendor_agreements.updated' | 'vendors.activated' | 'vendors.approved' | 'vendors.updated' | 'webhooks.verification' } --- title: Delete a webhook subscription by id path: /developer/v1/webhooks/{webhook_id} description: No description request: none response: Record --- 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' | 'bills.updated' | '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' | 'spend_requests.created' | 'tests.test_event' | 'transactions.all_requirements_met_and_approved_changed' | 'transactions.authorized' | 'transactions.body_coding_updated' | 'transactions.cleared' | 'transactions.declined' | 'transactions.ready_for_review' | 'transactions.ready_to_sync' | 'transactions.receipt_added' | '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' | 'vendor_agreements.archived' | 'vendor_agreements.created' | 'vendor_agreements.deleted' | 'vendor_agreements.document_added' | 'vendor_agreements.renewal_milestone' | 'vendor_agreements.updated' | 'vendors.activated' | 'vendors.approved' | '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 } ---