# Finance for teams that run on agents > Ramp helps agents buy, pay, procure, and complete work for the business with the controls finance teams need. --- URL: https://agents.ramp.com/ # Finance for teams that run on agents Ramp lets your AI agents buy, pay, procure, and complete work through Ramp while every transaction stays connected to the business context finance teams need. Built on Ramp, the finance platform powering more than $200 billion in annual purchase volume across cards and bill payments. ## One identity per agent. Every action attributed. - **One key per agent** — tied to a human sponsor on your team. - **Flexible permissions** — decide what each agent can read and do. - **Long-running access** — for background agents that run on a schedule. - **Full attribution** — every action traces back to the agent that took it. ## Let your agents pay. You stay in control. - **Flexible spend restrictions** — per agent, per task, per merchant. - **Customizable human-in-the-loop policy** — auto-approve the routine, hold what matters for a human. - **Auto-expiring cards** — from seconds to quarters. - **No pre-funding needed** — run on credit, settle later. ## Talk to the team first Talk to the team at /talk-to-team for beta access, embedded payments, internal agent tools, or rollout help. If you want a self-serve starting point after that, begin with /skills/ramp-agentic-purchase. --- URL: https://agents.ramp.com/talk-to-team # Talk to the Team Share the agent payments use case you are exploring. Ramp routes it to the right team for beta access, embedded payments, internal agent tools, or company rollout questions. Open the contact form at /talk-to-team. --- URL: https://agents.ramp.com/skills # Skills Official Ramp skills for AI agents — portable instruction sets that teach compatible agents how to work with Ramp: cards, bill pay, procurement, travel, banking, and accounting. The catalog is synced from the public repo at github.com/ramp-public/skills. Install skills with `npx skills add ramp-public/skills`, or point an agent at a skill's SKILL.md directly. Browse the full set at /skills. --- URL: https://agents.ramp.com/community # Community See what builders ship with agents. Join the Ramp agents community to swap MCP setups, CLI workflows, and skills. Join on Slack from /community. --- URL: https://agents.ramp.com/events # Events Workshops and meetups for builders using Ramp MCP and CLI. Bring your laptop, meet the team, and ship something live. Upcoming sessions include Build with Campfire + Ramp MCP, CLI & Cocktails in San Francisco, and Build with Rillet + Ramp MCP. Browse dates and register at /events. --- URL: https://agents.ramp.com/docs/overview/introduction # Introduction ## Two ways Ramp models agents ### Agents acting on behalf of users This is the model available today. A person connects Ramp, and the agent acts with that person's identity and permissions. The agent can only see and do what the authenticated Ramp user is allowed to see and do. ### Agents with their own identities This model gives an agent a distinct identity, permissions, and audit trail. [Learn more about identity](/docs/guides/identity) ## How agents use Ramp Ramp is designed to work across any agent runtime and harness. There are three general paths: - **CLI (Recommended)** for agents with access to a terminal or command line. - **MCP** for Claude, ChatGPT, and other general-purpose assistants that discover and call tools. - **Developer API** for deterministic, programmatic integrations. If your agent can run terminal commands, we recommend starting with the CLI. The [Ramp dashboard](https://app.ramp.com/) is also available for manual verification and agents using a general-purpose browser. [Learn more about connection options](/docs/guides/connecting) --- URL: https://agents.ramp.com/docs/overview/getting-started # Getting Started Copy one prompt into your coding agent. It will check whether you already use Ramp, guide signup if needed, install the Ramp CLI, and connect your account. Once setup is complete, start with a read-only overview of the work waiting for you. Already use Ramp? Continue to step 2. [Sign up for Ramp](https://ramp.com/signup) Choose the assistant you already use. [See other ways to connect](/docs/guides/connecting) After connecting, start with a read-only overview of the work waiting for you. --- URL: https://agents.ramp.com/docs/guides/connecting # Connecting Instant to 15 minutes Instant Hours to days Inside a conversational assistant In a terminal, local agent, script, or CI In deterministic code Actions are attributed to the acting user or agent. The agent acts as the Ramp user who authenticated the connection. Permissions do not exceed the user or agent's role. Actions are attributed to the acting user or agent. The agent acts as the Ramp user who authenticated the connection. Permissions do not exceed the user or agent's role. Actions are scoped to the business owner's identity. Easy setup, already available in some cases, and instant with Claude chat or an out-of-the-box connector Structured output, broad workflows, and easy local automation Maximum control over interfaces, workflows, and backend logic File uploads and downloads not available, slower performance Requires installation and access to a coding agent or terminal Requires the most engineering, security, and lifecycle ownership Use the [Ramp app](https://app.ramp.com) when a person needs to review context, handle an exception, or complete work directly. The full list of tools available in the CLI and MCP can be found [here](/docs/reference/agent-tools). ## CLI Use the CLI when the agent has terminal access, needs structured output, or should follow a repeatable skill. The CLI works well in Claude Code, Codex, Cursor, scripts, and CI. ## Connect via MCP Choose the client you already use. Each link opens the fastest available way to add Ramp. ### Custom MCP clients Use this path when your client does not have a ready-made Ramp connector. Connect a live Ramp business to: ```text https://mcp.ramp.com/mcp ``` Use sample data instead at: ```text https://demo-mcp.ramp.com/mcp ``` Clients that read MCP JSON usually expect: ```json { "mcpServers": { "ramp": { "url": "https://mcp.ramp.com/mcp" } } } ``` The connection acts as the Ramp user who completes browser authorization. What the client can see and change follows that user's Ramp permissions. Custom clients and gateways must have their exact redirect URI allowlisted before Ramp authorization can complete: - Use `https://`, `localhost`, or `127.0.0.1`. - Submit the exact host. Wildcard subdomains are not supported. - [Request redirect URI access](https://docs.ramp.com/developer-api/v1/mcp-redirect-whitelist-request) for the client or gateway. ## Developer API Use the API when your product owns the interface and backend workflow. Your team is responsible for OAuth, scopes, webhooks, retries, and the customer experience. [View API reference](https://docs.ramp.com/developer-api/v1) ## Troubleshooting ### Authentication drops or tools look stale Reconnect Ramp in the client so OAuth and the cached tool list refresh: - **Claude**: disconnect and reconnect Ramp in **Settings → Connectors**. - **Cursor**: toggle Ramp in **Cursor Settings → MCP**. - **ChatGPT**: disconnect and reconnect Ramp in **Settings → Apps** or the connector settings. - **Perplexity**: remove Ramp and add it again in connector settings. If a custom client keeps stale credentials, clear its cached MCP auth. Confirm that the browser completed authorization against the intended Ramp business. ### The CLI keeps logging out Read-write CLI sessions normally refresh for 24 hours, while read-only sessions can refresh for one week. If the CLI logs out sooner, confirm that the runtime preserves `~/.config/ramp/config.toml`. Ephemeral coding environments may replace that file between sessions. ### A query returns too much data MCP caps a query response at 100 rows. Narrow the date range, vendor, cardholder, department, entity, or another available filter. ### ETL operation limit reached Wait for current data operations to finish, or clear unused tables before trying again. Persistent capacity errors usually resolve within minutes. ### Unsupported redirect URI Custom clients and gateways need their exact redirect URI allowlisted. Use the [Custom MCP clients](#custom-mcp-clients) instructions to submit the URI. ### A receipt attachment does not reach MCP Use the Ramp CLI, Ramp dashboard, or another supported upload path for receipt images and PDFs. Chat attachments are not automatically forwarded to Ramp MCP. --- URL: https://agents.ramp.com/docs/guides/identity # Identity Ramp supports two identity models. Use a user identity when an agent assists one person. Use a standalone identity when the business wants an agent to own work, permissions, and its lifecycle independently. An individual Ramp user The business Follows the connected user's Ramp permissions Receives access explicitly assigned by an admin Personal assistance and interactive work Background automation and shared company workflows Depends on the user's connection and access Managed independently through its own lifecycle Work runs with the user's identity and permissions Supported activity is attributed to the agent ## Agents acting on behalf of users MCP and CLI actions run as the Ramp user who completed OAuth. Visibility and actions follow that user's permissions. If Sarah connects Ramp, her agent sees the same Ramp businesses, cards, funds, and workflows Sarah can access. Admins can manage which users have access to MCP connectors via the [Integrations page in app](https://app.ramp.com/settings/integrations/overview?category=AGENTS). ## Agents with their own identities Standalone agents are first-class virtual employees on Ramp. They have their own credentials, explicitly assigned permissions, an accountable human owner, and a lifecycle that the business manages independently. This model works well for background automation and shared workflows that should not depend on one employee's account. It is available in limited early access. ### Example: first-level bill review An invoice review agent can compare hundreds of line items with the company's system of record, approve clean bills, and send mismatches to a person. The agent appears in the approval chain under its own identity instead of making every decision under an employee's account. ### Controls for standalone agents - **Least privilege:** The agent starts with minimal access. An admin grants only the permissions required for its job. - **Human ownership:** Every standalone agent has an accountable Ramp user who owns its setup and operation. - **Immediate control:** Admins can pause access, rotate credentials, or remove the agent independently. - **Separate attribution:** Supported activity identifies the agent instead of borrowing a person's identity. Adding an agent to an approval workflow does not grant authority by itself. The agent must also have the permissions required to review or approve that work. Reach out to the team to get early access. --- URL: https://agents.ramp.com/docs/guides/agentic-payments # Payments > Standalone agents are in limited early access. Reach out to the team to get > started. Use business credentials to create roles, agents, and funds. Switch to the agent's credentials only after connecting its runtime; those credentials are what identify the agent when it requests payment credentials and completes the purchase record. Python examples use the [official Ramp SDK](https://github.com/ramp-public/ramp-python). Preview businesses receive a supported version that includes the provisioning resources shown below. ## Optional: Create a role Use one of Ramp's default agent roles: **Purchasing**, **Bill approvals**, **Data analysis**, **Expense Completion**, or **Full Access**. Create a custom role only when none of the defaults matches the agent's job. The API and SDK accept custom roles only; built-in role IDs are not available through those surfaces. The business integration needs `users:read` and `users:write`, the person authorizing it must be a role admin, and custom roles must be enabled for the business. Open [**Company → Agents**](https://app.ramp.com/company/agents), select **New agent**, and enter the agent's name. On the **Role** step, choose **Purchasing agent**, **Bill approvals**, **Data analysis**, or **Expense completion**. Ramp creates or reuses the matching role as part of setup. ```python from ramp import Ramp business_client = Ramp.from_env(environment="production") # Reuse a matching custom role when one exists. roles = business_client.roles.list()["data"] role = next( (item for item in roles if item["name"] == "Purchasing Agent Role"), None, ) if role is None: # Otherwise create a role with the approved capability map. role = business_client.roles.create( name="Purchasing Agent Role", description="Purchases approved goods and services", product_capabilities={ "": "", }, ) ``` ```bash # List existing custom roles. curl --request GET \ --url https://api.ramp.com/developer/v1/roles \ --header "Authorization: Bearer $RAMP_BUSINESS_ACCESS_TOKEN" # Create a role when none matches the agent's job. curl --request POST \ --url https://api.ramp.com/developer/v1/roles \ --header "Authorization: Bearer $RAMP_BUSINESS_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "name": "", "description": "", "product_capabilities": { "": "" } }' ``` ```bash # List existing custom roles. ramp --profile human roles list # Create a role when none matches the agent's job. ramp --profile human roles create --json '{ "name": "Purchasing Agent Role", "description": "Purchases approved goods and services", "product_capabilities": { "": "" } }' ``` ## 1. Create an agent Create a company-owned identity for the software. The business integration needs `agents:write`, the person authorizing it must be a role admin, and standalone agents must be enabled for the business. When supplied, the owner must be an active human with Ramp access in the same business. Open [**Company → Agents**](https://app.ramp.com/company/agents) and select **New agent**. Enter the agent's name, continue to **Role**, and choose the role that matches its job. The UI stages the agent until you finish the **Wallet** step. ```python from uuid import UUID # Create the standalone agent and capture its show-once credentials. agent = business_client.agents.create( name="Purchasing Agent", description="Purchases approved goods and services", owner_id=UUID(""), role_ids=[UUID(str(role["id"]))], ) agent_id = str(agent["id"]) agent_client_id = str(agent["client_id"]) agent_client_secret = str(agent["client_secret"]) ``` ```bash # Create the standalone agent. curl --request POST \ --url https://api.ramp.com/developer/v1/agents \ --header "Authorization: Bearer $RAMP_BUSINESS_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "name": "Purchasing Agent", "description": "Purchases approved goods and services", "owner_id": "", "role_ids": [""] }' # Store client_id and the show-once client_secret from the response. ``` ```bash # Create the standalone agent. ramp --profile human agent create \ --name "Purchasing Agent" \ --description "Purchases approved goods and services" \ --owner_id "" \ --role-id "" # Store the returned Client ID and show-once Client secret. ``` ## 2. Assign a fund Give the agent a budget, merchant rules, approvals, and accounting defaults. The SDK, API, and CLI examples below show every control supported for a standalone fund. Amounts in fund controls use the currency's smallest unit—for example, `10000` means $100.00 USD. Configure approval chains in Ramp. On the **Wallet** step, search for an existing fund and select **Add**. You can preview its limits, eligibility, policies, and recent activity before assigning it. To make a new fund, select **Create funds** and set its name, spend limit, cadence, optional per-transaction limit, and merchant or category rules. The new fund is selected automatically. Select **Create agent** when the wallet is ready. Ramp creates the agent, assigns the selected funds, and opens the **Credential** step. Save the Client ID and show-once Client secret in a secret manager. ```python from uuid import UUID # Create a standalone, shareable fund for the agent. fund = business_client.funds.create( idempotency_key="", user_id=UUID(""), display_name="Agent purchases", is_shareable=True, is_exempt_from_policy_agent=False, accounting_rules=[ { "field_id": "", "field_option_id": "", }, ], spending_restrictions={ "limit": { "amount": 10000, "currency_code": "USD", }, "interval": "MONTHLY", "transaction_amount_limit": { "amount": 5000, "currency_code": "USD", }, "lock_date": "", "blocked_mcc_codes": [""], "allowed_vendor_ids": [""], "allowed_category_codes": [14], }, permitted_spend_types={ "reimbursements": False, "virtual_card": True, "physical_card": False, }, ) # Assign the agent to the fund. membership = business_client.funds.add_members( fund_id=str(fund["id"]), user_ids=[agent_id], ) ``` ```bash # Create a standalone, shareable fund. curl --request POST \ --url https://api.ramp.com/developer/v1/funds \ --header "Authorization: Bearer $RAMP_BUSINESS_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --header "X-Idempotency-Key: " \ --data '{ "user_id": "", "display_name": "Agent purchases", "is_shareable": true, "is_exempt_from_policy_agent": false, "accounting_rules": [ { "field_id": "", "field_option_id": "" } ], "spending_restrictions": { "limit": { "amount": 10000, "currency_code": "USD" }, "interval": "MONTHLY", "transaction_amount_limit": { "amount": 5000, "currency_code": "USD" }, "lock_date": "", "blocked_mcc_codes": [""], "allowed_vendor_ids": [""], "allowed_category_codes": [14] }, "permitted_spend_types": { "reimbursements": false, "virtual_card": true, "physical_card": false } }' ``` ```bash # Assign the agent to the fund. curl --request POST \ --url https://api.ramp.com/developer/v1/funds/{fund_id}/members \ --header "Authorization: Bearer $RAMP_BUSINESS_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "user_ids": [""] }' ``` ```bash # Create a standalone, shareable fund. ramp --profile human funds create-fund "" \ --idempotency_key "" \ --display_name "Agent purchases" \ --is_shareable \ --json '{ "is_exempt_from_policy_agent": false, "accounting_rules": [ { "field_id": "", "field_option_id": "" } ], "spending_restrictions": { "limit": { "amount": 10000, "currency_code": "USD" }, "interval": "MONTHLY", "transaction_amount_limit": { "amount": 5000, "currency_code": "USD" }, "lock_date": "", "blocked_mcc_codes": [""], "allowed_vendor_ids": [""], "allowed_category_codes": [14] }, "permitted_spend_types": { "reimbursements": false, "virtual_card": true, "physical_card": false } }' # Assign the agent to the fund. ramp --profile human funds add-members "" \ --user_ids '[""]' ``` ## 3. Connect a runtime Store the agent's credentials in the system that will operate it. Add Ramp through the hosted agent's secure connection or secret-storage flow. Store the Client ID and Client secret as credentials, not in the agent's instructions. Hosted standalone-agent connections are part of the limited preview. ```python from ramp import Ramp # Authenticate future purchase actions as the agent. agent_client = Ramp( client_id=agent_client_id, client_secret=agent_client_secret, environment="production", ) ``` ```bash # Exchange the agent's credentials for an access token. token_response="$( curl --fail-with-body --silent --show-error --request POST \ --url https://api.ramp.com/developer/v1/token \ --user "$RAMP_AGENT_CLIENT_ID:$RAMP_AGENT_CLIENT_SECRET" \ --header "Content-Type: application/x-www-form-urlencoded" \ --data "grant_type=client_credentials" )" RAMP_AGENT_ACCESS_TOKEN="$(jq -er '.access_token' <<<"$token_response")" export RAMP_AGENT_ACCESS_TOKEN unset RAMP_AGENT_CLIENT_ID RAMP_AGENT_CLIENT_SECRET token_response ``` ```bash # Refresh commands after Ramp enables the preview. ramp --env production tools refresh # Save the agent credentials in a dedicated CLI profile. export RAMP_CLIENT_ID="$RAMP_AGENT_CLIENT_ID" export RAMP_CLIENT_SECRET="$RAMP_AGENT_CLIENT_SECRET" ramp --env production agent login unset RAMP_CLIENT_ID RAMP_CLIENT_SECRET # Confirm that future commands will run as the agent. ramp --env production --profile agent auth status ``` ## 4. Generate card credentials Request a fresh credential after the fund, merchant, amount, and purpose are approved. The agent integration needs `cards:read_agentic` for fund discovery and credential generation. Ask the connected agent to use a specific fund for a named merchant and maximum amount. Have it confirm the fund and final total before checkout. The agent should send the credential directly to checkout, not display the PAN or CVV in chat. ```python # Confirm the fund is assigned to the agent. eligible_funds = agent_client.agent_tools.agent_cards.list_funds( rationale="Find funds assigned to this agent", ) # Generate credentials for one approved checkout attempt. credentials = agent_client.agent_tools.agent_cards.create_payment_token( fund_id="", amount="100.00", currency_code="USD", merchant_name="", merchant_url="https://", merchant_country_code="US", rationale="Complete the approved purchase", idempotency_key="", ) ``` ```bash # Confirm the fund is assigned to the agent. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-agent-card-funds \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "rationale": "Find funds assigned to this agent" }' ``` ```bash # Generate credentials for one approved checkout attempt. credential_response="$( curl --fail-with-body --silent --show-error --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-agent-card-creds \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --header "X-Idempotency-Key: " \ --data '{ "fund_id": "", "amount": "100.00", "currency_code": "USD", "merchant_name": "", "merchant_url": "https://", "merchant_country_code": "US", "rationale": "Complete the approved purchase" }' )" # Pass credential_response directly to checkout here without logging it. # Then clear it from the shell. unset credential_response ``` ```bash # Confirm the fund is assigned to the agent. ramp --profile agent --agent funds get-agent-card-funds \ --rationale "Find funds assigned to this agent" # Generate credentials without printing the PAN or CVV. set +x agent_card_credentials="$( ramp --profile agent --agent funds creds "" \ --amount "100.00" \ --currency_code "USD" \ --merchant_name "" \ --merchant_url "https://" \ --merchant_country_code "US" \ --rationale "Complete the approved purchase" \ --idempotency_key "" | jq -cer '.data[0]' )" # Pass agent_card_credentials directly to checkout here without logging it. # Then clear it from the shell. unset agent_card_credentials ``` The credential is limited to the merchant and requested amount. It expires after the first authorization or 12 hours, whichever comes first. Agent Card amounts use decimal strings: `100.00` means $100.00 USD. Fund limits above use the currency's smallest unit, where `10000` means $100.00 USD. ## 5. Complete the purchase record After the charge posts, add the receipt, memo, and required accounting fields. Credential generation does not return the posted transaction ID. Find the matching transaction after it posts. If Ramp requires accounting fields, list the available categories and options before editing. The agent integration needs `transactions:read`, `transactions:write`, `accounting:read`, and `receipts:write` to finish this step. The examples treat the memo and accounting choices as agent-selected. If the user supplied either value directly, include its field name in `user_submitted_fields` instead. Open the transaction in Ramp. Upload the receipt, add a specific memo, confirm the fund, and complete any required accounting or tracking fields. Finish when Ramp shows no missing items. ```python import base64 from pathlib import Path from uuid import UUID next_page_cursor = None matching_transactions = [] # Find exactly one posted transaction for this purchase. while True: transactions = agent_client.agent_tools.transactions.list( transactions_to_retrieve="my_transactions", next_page_cursor=next_page_cursor, page_size=50, rationale="Find the posted purchase", ) matching_transactions.extend( transaction for transaction in transactions["transactions"] if transaction["merchant_name"] == "" and transaction["amount"] == "100.00" and transaction["spend_allocation_id"] == "" and transaction["transaction_time"].startswith("") and transaction["transaction_uuid"] is not None ) next_page_cursor = transactions.get("next_page_cursor") if next_page_cursor is None: break if len(matching_transactions) != 1: raise RuntimeError("Expected exactly one matching transaction") transaction_id = UUID(matching_transactions[0]["transaction_uuid"]) # Find valid accounting values before editing the transaction. categories = agent_client.agent_tools.accounting.categories( transaction_uuid=str(transaction_id), rationale="List required accounting categories", ) options = agent_client.agent_tools.accounting.category_options( tracking_category_uuid="", transaction_uuid=str(transaction_id), query_string="", page_size=10, rationale="List accounting options", ) # Add the memo and accounting selections. agent_client.agent_tools.transactions.edit( transaction_uuid=str(transaction_id), memo="", tracking_category_selections=[ { "category_uuid": "", "option_selection": "", }, ], user_submitted_fields=[], rationale="Complete the approved purchase record", ) # Attach the receipt and verify that nothing is missing. receipt_bytes = Path("").read_bytes() agent_client.agent_tools.receipts.upload( filename="", content_type="", file_content_base64=base64.b64encode(receipt_bytes).decode("ascii"), transaction_uuid=str(transaction_id), rationale="Attach the purchase receipt", ) missing_items = agent_client.agent_tools.transactions.missing( id=transaction_id, rationale="Verify the purchase record is complete", ) agent_client.close() business_client.close() ``` ```bash # Find the first page of posted transactions. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-transactions \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "transactions_to_retrieve": "my_transactions", "page_size": 50, "rationale": "Find the posted purchase" }' # Continue with the cursor returned by the previous page. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-transactions \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "transactions_to_retrieve": "my_transactions", "next_page_cursor": "", "page_size": 50, "rationale": "Find the next page of posted purchases" }' # Find valid accounting categories and options. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-tracking-categories \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "transaction_uuid": "", "rationale": "List required accounting categories" }' curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-tracking-category-options \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "tracking_category_uuid": "", "transaction_uuid": "", "query_string": "", "page_size": 10, "rationale": "List accounting options" }' ``` ```bash # Add the memo and accounting selections. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/edit-transaction \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "transaction_uuid": "", "memo": "", "tracking_category_selections": [ { "category_uuid": "", "option_selection": "" } ], "user_submitted_fields": [], "rationale": "Complete the approved purchase record" }' ``` ```bash # Attach the receipt. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/upload-receipt-file \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "filename": "", "content_type": "", "file_content_base64": "", "transaction_uuid": "", "rationale": "Attach the purchase receipt" }' ``` ```bash # Verify that no required items remain. curl --request POST \ --url https://api.ramp.com/developer/v1/agent-tools/get-transaction-missing-items \ --header "Authorization: Bearer $RAMP_AGENT_ACCESS_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "id": "", "rationale": "Verify the purchase record is complete" }' unset RAMP_AGENT_ACCESS_TOKEN ``` ```bash # Find every page of posted transactions. ramp --profile agent --agent transactions list \ --transactions_to_retrieve my_transactions \ --page_size 50 \ --rationale "Find the posted transaction" # Repeat with each cursor returned in pagination.next_cursor. ramp --profile agent --agent transactions list \ --transactions_to_retrieve my_transactions \ --next_page_cursor "" \ --page_size 50 \ --rationale "Find the next page of posted transactions" # Add the memo and find valid accounting values. ramp --profile agent --agent transactions edit "" \ --memo "" \ --rationale "Add the purchase memo" ramp --profile agent --agent accounting categories \ --transaction_uuid "" \ --rationale "List required accounting categories" ramp --profile agent --agent accounting category-options "" \ --transaction_uuid "" \ --query_string "" \ --page_size 10 \ --rationale "List accounting options" # Add the accounting selections. ramp --profile agent --agent transactions edit --json '{ "transaction_uuid": "", "tracking_category_selections": [ { "category_uuid": "", "option_selection": "" } ], "user_submitted_fields": [], "rationale": "Complete transaction accounting" }' # Attach the receipt and verify that nothing is missing. receipt_path="/path/to/receipt.pdf" receipt_base64="$(base64 < "$receipt_path" | tr -d '\r\n')" ramp --profile agent --agent receipts upload \ --filename "${receipt_path##*/}" \ --content_type "application/pdf" \ --file_content_base64 "$receipt_base64" \ --transaction_uuid "" \ --rationale "Attach the purchase receipt" unset receipt_base64 ramp --profile agent --agent transactions missing "" \ --rationale "Verify the purchase record is complete" ``` ## More payment methods ACH, checks, wires, and crypto-native payment methods are in private preview. Talk to the team to enable the standalone-agent payment flow for your business. --- URL: https://agents.ramp.com/docs/guides/travel # Travel Connected agents can search Ramp Travel, compare policy-aware options, and book flights and hotels in plain language. The agent follows the signed-in user's Ramp permissions, travel policy, available funds, and approval workflows. *Available Skills*: - [Book a flight](/skills/ramp-book-flight/) for one-way and round-trip flights - [Book a hotel](/skills/ramp-book-hotel/) for single-property stays Both skills work with Ramp MCP and the Ramp CLI. After [connecting Ramp](/docs/guides/connecting), give the skill to your agent and describe the trip in plain language. Requires [Ramp Plus](https://ramp.com/pricing) ## How booking works 1. **Describe the trip.** Give the agent the route or destination and travel dates. Add preferences only when they matter, such as a nonstop flight, an evening departure, a refundable room, or a hotel near an office. 2. **Compare current options.** The agent searches Ramp Travel and presents relevant choices with prices and policy status. Saved travel preferences and loyalty programs can improve recommendations. 3. **Choose the exact itinerary or room.** The agent waits for the traveler to select a flight, hotel, and room rate. It does not silently choose an option. 4. **Review the final terms.** Before money moves, Ramp returns a fresh booking preview with the total, policy result, funding source, required approvals, and applicable fare or cancellation terms. 5. **Confirm and verify.** The agent books only after a new, explicit confirmation. It then checks whether the reservation is confirmed, awaiting approval, still processing, or unsuccessful. A submitted request is not always a confirmed reservation. For example, a flight that needs manager approval remains pending until that approval and ticketing finish. The agent should report the current state instead of saying the traveler is booked early. ## Read trips and traveler information An agent can also answer travel questions without starting a new booking: - **Trips:** List upcoming, ongoing, or completed trips. - **Bookings:** Retrieve current flight, hotel, and rental-car reservations and booking requests. - **Booking details:** Check an itinerary or stay, approval status, amount, payment timing, cancellation state, associated spend, or booking error. - **Traveler profile:** Check whether identity and contact details are ready for booking, including Known Traveler Number and redress information. - **Loyalty programs:** List the airline and hotel memberships saved to the traveler profile. - **Office locations:** Find company addresses to use as the center of a hotel search. For example, ask "What trips do I have next month?", "Is my hotel still awaiting approval?", or "Which airline loyalty programs are saved to my profile?" The [Agent Tools reference](/docs/reference/agent-tools) lists the current tools and their inputs. Runtime access depends on the connected user's permissions, Ramp Travel settings, and the tools available in that client. ## Traveler profiles and delegated booking Ramp uses the intended traveler's profile for the reservation. If required identity or contact details are missing, the agent asks the traveler to complete them before booking. Saved airline and hotel loyalty programs, Known Traveler Number, home airport, and travel preferences can carry into supported searches and reservations. An authorized delegate or Travel Manager can ask an agent to book for another employee. The agent resolves the exact traveler first and applies that traveler's profile, policy, eligible funds, and approval path while respecting the delegate's permissions. It never falls back to booking for the requester when the intended traveler cannot be found or accessed. [Learn about delegate booking](https://support.ramp.com/travel-delegate-booking-via-assistant-role/) ## Policy, funds, and approvals Travel policy is evaluated during search and again against the final booking. Depending on the company's setup, Ramp can consider price, advance-booking windows, cabin class, refundable hotel requirements, and per diem limits. - **In-policy options** can follow the company's normal booking and approval flow. - **Out-of-policy options** require the traveler to provide a reason that approvers can review. - **Existing funds** are shown only when the traveler can use them for the booking. - **New funding** can be requested when no existing fund is selected or available, with approval required before booking when applicable. If the price, funding choice, policy result, or cancellation terms change after the preview, the agent shows the new terms and asks for confirmation again. ## Changes, cancellations, and limitations For supported flight and hotel bookings, an agent can look up the reservation and may be able to preview current cancellation terms. Cancellation requires a separate explicit confirmation and applies to the entire booking. When a reservation is not eligible for self-service cancellation, the agent directs the traveler to the appropriate Ramp Travel support path. The agent booking flow does not currently support: - Multi-city or open-jaw flight itineraries - Group, multi-room, or rental-car bookings - Seat selection, points redemption, or applying airline credits - Flight or hotel changes and exchanges Use [Ramp Travel](https://app.ramp.com/home/travel) or travel support for those workflows. Availability and supplier rules can vary by booking. ## Have another travel workflow? Talk to the team if you want to use agents for another travel use case or need help deciding whether a workflow belongs in Ramp Travel, an agent skill, or a custom integration. --- URL: https://agents.ramp.com/docs/guides/incorporation # Incorporation If you do not have a US business entity yet, your agent can form a US LLC as part of Ramp signup. The agent and the `incorporate-with-ramp` skill handle the application while this guide explains the cost, timing, and limits. ## Pricing ## Timelines | Milestone | Typical timeline | |---|---| | LLC filing | Days | | Limited Ramp access | After formation is submitted | | EIN delivery | 4–6 weeks | | Full Ramp access | Automatic after the EIN arrives | ## Access before the EIN arrives Limited Ramp access begins after formation is submitted. Card issuance, Agent Cards, Ramp Business Checking, inbound deposits, yield, and supported domestic payments can be available before the EIN arrives. Stablecoin rails, international payments, and full identity verification wait for the EIN. ## Limits - **US only.** The current path supports US LLCs with US-based founders. - **LLC only.** C-Corp formation is not supported in this flow. - **State availability changes.** Ask the agent for the current supported list. - **SSN handling stays outside the agent context.** The CLI reads the required last four digits from environment variables rather than command arguments. - **Third-party filing.** doola handles the state filing and presents its data handling disclosure before authorization. --- URL: https://agents.ramp.com/docs/guides/banking # Banking --- URL: https://agents.ramp.com/docs/guides/data-analysis # Data Analysis --- URL: https://agents.ramp.com/docs/guides/users # Users --- URL: https://agents.ramp.com/docs/guides/bills # Bills --- URL: https://agents.ramp.com/docs/guides/procurement # Procurement --- URL: https://agents.ramp.com/docs/guides/funds # Funds --- URL: https://agents.ramp.com/docs/reference/agent-tools # Agent Tools This is the canonical generated list of Ramp Agent Tools available through both Ramp MCP and Ramp CLI at build time, including exact tool names, descriptions, and parameters. Runtime access still depends on the authenticated Ramp identity's permissions, admin controls, scopes, connected client, environment, and installed CLI version. If this list differs from the tools available in your MCP client or CLI, reconnect Ramp or update the CLI and use the live tool list for that connection. For the product-level choice, see [Connecting](/docs/guides/connecting). --- URL: https://agents.ramp.com/skills/ramp-agentic-purchase --- name: ramp-agentic-purchase area: Agentic Commerce supported_surfaces: [browser, cli, mcp] description: "Make purchases using Ramp agent cards via browser checkout, then complete all transaction requirements (memo, tracking categories, receipt, trip). Use when asked to buy something with an agent card, make a payment using Ramp, spend from a fund, complete missing transaction items, or test the agent card payment flow. Also use when asked about agent card access, availability, or how to get started with Agentic Cards. Requires ramp CLI and a playwright-cli-driven browser (see bundled browser-checkout.md)." --- # Agentic Purchase End-to-end agent card purchasing: pick a fund, get a payment token via `ramp` CLI, pay via browser, then fill all missing transaction items. ## Access & Enrollment Agent Cards are available via self-serve enrollment. **Enrollment is a mutation** — it enrolls the authenticated user's business in Agent Cards, enabling agent card funds and fund access. An availability, setup, or eligibility question is **not** consent to enroll: first answer the question, tell the user that enrolling activates Agent Cards for their business, and ask for explicit confirmation. Only after the user confirms, enroll using the CLI: ```bash ramp agent_cards enroll --agent --rationale "User confirmed enrolling the business in Agent Cards" ``` The user must be authenticated (`ramp auth login`) and have appropriate permissions on their Ramp business. Once enrollment succeeds, the user can immediately use `agent_cards list` and `agent_cards creds` to access their agent card funds. For more information, visit **https://agents.ramp.com/cards**. Use this guidance for: - "What are Agentic Cards?" or "How do I get agent cards?" - Access, availability, enrollment, or setup questions - Users who hit eligibility errors when running `agent_cards list` or `agent_cards creds` In every case, describe what enrollment does and get an explicit "yes" before running `agent_cards enroll`. If the user is already enrolled, proceed with the workflow below. ## Prerequisites - `ramp` CLI installed and authenticated (`ramp auth login`) - `playwright-cli` browser automation set up per the bundled [browser-checkout.md](browser-checkout.md) reference (formerly the standalone ramp-browser-automation skill, now shipped inside this skill) - Business enrolled in Agent Cards (see [Access & Enrollment](#access--enrollment) to enroll if not) ## CLI conventions - Pass `--agent` for machine-readable JSON output (documented shape is top-level, immediately after `ramp`: `ramp --agent agent_cards list`) - Use positional arguments where supported (e.g., `ramp --agent agent_cards creds `, `ramp --agent transactions missing `) - Use `--json` for complex payloads (e.g., `ramp --agent transactions edit`) - Every subcommand accepts `--json`, `--dry_run` (`-n`), and `--help` - **`--rationale` is required on every subcommand** — a non-empty string (max 1024 chars) explaining why you are making the call. With `--json`, put it in the body as a `"rationale"` key instead. Omitting it returns `HTTP 422 (DEVELOPER_INVALID_SCHEMA)`, even in `--agent` mode. ## Hard rules - **Two distinct amount thresholds — respect both:** - **User preauth tolerance:** policy-level, ~10% over requested. Stop and re-ask if exceeded. - **Visa cryptogram auth cap:** the cryptogram from `ramp --agent agent_cards creds ... --amount X` rejects any charge > X at the network level — even $0.01 over declines. If the merchant's final total exceeds the cryptogram amount (bag fees, surprise tax, currency conversion), the old cryptogram is unusable — burn it, pull fresh creds at the corrected amount, and re-preauth if the new amount exceeds the user's original 10% tolerance. - **Run the browser headed, never `--headless`.** Purchase flows need the user able to see and intervene — bot checks, 3DS, and login walls all require human input. See [browser-checkout.md](browser-checkout.md) for the headed-default rule. - **Stop if anything unexpected happens.** 3DS challenge, login wall, CAPTCHA, bot-block page, merchant form you can't parse → screenshot, hand off to the user via the visible Chrome window per the human-handoff pattern in [browser-checkout.md](browser-checkout.md), and wait. Do not retry blindly. ## Phase 1: Payment ### Step 1 — Pick a fund ```bash ramp agent_cards list --agent --rationale "List the user's agent card funds" ``` The response contains `funds`, each with `id`, `display_name`, `available_balance`, `currency`, `interval`, `max_transaction_amount`, `allowed_merchants`, and `allowed_categories`. Select for purpose fit first, then technical eligibility: - Use `display_name` to identify likely purpose fit, then confirm the choice with the user. Do not infer an intended use that is not present in the response. - Treat broad, admin, or shared-access funds as a hazard: technical access is not approval, and the purpose-fit bar is higher when many funds are visible. - If no appropriate fund exists, stop and ask the user which fund to use or whether to proceed through the standard card request/approval flow. Do not keep trying broad/admin funds automatically. Then verify the selected fund has: - `available_balance` covers the purchase amount - `currency` matches the merchant - `max_transaction_amount` is `null` or covers the purchase amount - `allowed_merchants` / `allowed_categories` permit the purchase (empty = unrestricted) - `interval` is the fund's replenishment cadence, not additional balance available for the current purchase Use the selected fund's `id` as `` when requesting credentials. **Guest-checkout PII:** If no signed-in merchant account (header shows "Sign in"), guest checkout needs full name, email, phone, and shipping/billing address. Do NOT proxy these from `cardholder_name` / `billing_address` on the creds — those are for the payment form only, not the merchant's contact fields. Ask the user explicitly. **Cart-state pre-flight:** Before generating creds for a merchant with a persistent cart (Walmart, Amazon, CVS, etc.), navigate to the cart and confirm it contains only the intended item at the expected price. Pre-existing items cookie-persist and will be charged alongside yours. If stale items exist, remove them (or ask the user to) before generating creds. ### Step 2 — Get payment token Run `agent_cards creds` only after the user confirms the selected fund, merchant/amount, and rationale. ```bash ramp --agent agent_cards creds "" \ --amount "45.00" \ --currency_code "USD" \ --merchant_name "Children's Hunger Fund" \ --merchant_url "https://childrenshungerfund.org" \ --merchant_country_code "US" \ --rationale "User approved \$45 donation to Children's Hunger Fund" ``` Returns `pan`, `cvv`, `expiration_month`, `expiration_year`. **Zsh `$` escape trap:** Zsh double-quoted `"Purchase $5 credits"` expands `$5` to the 5th positional (empty), so the rationale silently loses the amount. Escape as `\$5` or use single quotes when passing dollar amounts in `--rationale` or other flags. **Key behaviors:** - Each call returns a **fresh CVV** — get creds immediately before checkout - Tokens are **single-use** - Funds are **reusable** across multiple calls ### Step 3 — Pay via browser Read the bundled [browser-checkout.md](browser-checkout.md) reference (setup, `pw` usage, handoff patterns), then: 1. Open merchant site: ```bash cd ~/.pw-agent && ./pw open "https://merchant.com/donate" ``` 2. Navigate to checkout / donation page 3. Take a snapshot to find form fields: ```bash ./pw snapshot SNAPSHOT=$(ls -t .playwright-cli/*.yml | head -1) grep -iE "card|number|name|expir|cvv|cvc|amount|donate" "$SNAPSHOT" | head -20 ``` 4. Fill payment form: ```bash ./pw fill "" ./pw fill "" ./pw fill "" ./pw fill "" ``` 5. If the merchant has saved cards, click "Add a new card" first 6. Submit the payment: ```bash ./pw click ``` 7. Take a screenshot to confirm success: ```bash ./pw screenshot ``` **Tip:** If the donation/checkout page has an amount field, fill it before the card details. Some sites validate amount first. **Synthetic-fill detection:** Stripe Elements and similar modern tokenizers silently reject synthetic property-setter fills — the submit button stays enabled, no error surfaces, nothing submits, no network request fires. If `./pw fill` dispatches real keystroke events this is fine; if it only sets `.value`, the submit will stall for PAN/CVV/expiry fields specifically. Workaround: use coordinate-click to focus plus compositor-level keystroke events (`Input.insertText` at CDP) for card fields. Billing-address fields are not guarded the same way. **Card-swap close-and-reopen rule:** After pulling fresh creds mid-flow (e.g., retry at a higher amount), close the merchant's payment form entirely and re-open before filling. The processor's validator can retain stale state from the prior card and refuse to tokenize the new one (observed on Stripe, 2026-04-21). Do not overwrite PAN/CVV in place. #### Merchant form quirks — expiration date - **Stripe Elements:** single combined field, format `MM / YY`, auto-inserts the ` / `. - **Vantiv eProtect** (e.g., CVS): separate Month/Year `