What the agent does
There is no repository. The agent reads Ramp through the connection you name, and it writes a file. The catalog entry for Ramp says it queries transactions, card spend, reimbursements, bills and accounting data. The server is the official remote at https://ramp-mcp-remote.ramp.com/mcp, and the catalog marks it oauth. You connect it once with POST /me/connections, type mcp, name ramp, that url, and auth mode oauth. The response is 202 with authorize_url. The key's creator opens that URL while signed in to the console at cloud.getrush.ai as the same person. GET /me/connections then shows the row with status connected. A key run is given only the connections the request names, so the call includes connections set to that name or id.
The task is a read of the last six months of software charges. The agent asks the Ramp connection for transactions and bills that look like recurring software, and it keeps the card and the card holder attached to each charge, because the catalog's data is card spend and bills, not a pre-built SaaS report. Reimbursements are included when a software purchase was expensed rather than charged to a card. Accounting fields are used when they say which department paid. The agent does not create a card, pay a bill or change a transaction. The prompt says read only, and a write that the connection happens to allow is out of scope for this page.
Grouping is by vendor, then by card holder and department. A vendor is flagged in three cases, and only those three. The same vendor appears on more than one card. The monthly amount is up more than 10 percent against the earlier months in the window. Charges stop and then start again inside the six months. A vendor with a single card and a flat amount is listed with its monthly cost and not flagged. The agent shows the charges it grouped so a person can see why two merchants were treated as one vendor, and it says when a merchant name was too ambiguous to merge.
The file is saas-audit.md. It is a table of vendors with monthly cost, card holders and departments, then a section for each flag with the underlying charges. Numbers in the file come from the connection's answers. The agent does not fill a gap with a guessed price. If the connection returns no transactions for the window, the file says the window was empty rather than inventing a quiet book.
Start it with one API call
POST https://api.prix.dev/o/{org}/sessions with this body:
{
"agent": "claude",
"input": "Use the Ramp connection to find recurring software and SaaS charges in the last 6 months. Write saas-audit.md listing each vendor with monthly cost, card holders and departments paying for it, and flag vendors paid on more than one card, price increases over 10 percent and charges that stopped then restarted. Read transactions, card spend, reimbursements, bills and accounting data. Do not create or update anything in Ramp. If a merchant name is ambiguous, list the charges and say so. If the window has no charges, say that."
}- Get an API key. In the console, open Settings, then API keys, and create a key for your org. Send it in the Authorization header as a Bearer token.
- Send the request. POST the body in request.json to https://api.prix.dev/o/{org}/sessions, with your repository as the resources URL. The run starts in its own cloud sandbox.
- Read what came back. Follow the run on its live stream or wait for the run.completed webhook, then read the result and its trajectory.
What comes back
What comes back is saas-audit.md as a session artifact. The session lists the file's name and mime type and a url that downloads it with no key until url_expires_at. GET /o/{org}/sessions/{id}/artifacts/saas-audit.md with the key works after that hour. The transcript shows each call to the Ramp connection and the records that became a row, so a flagged vendor can be checked against the source charge.
The document lists every vendor the agent treated as recurring software, not only the flagged ones. Each flag cites the cards or the months. A duplicate is two card holders or two cards, named. A price jump is the earlier monthly figure and the later one. A restarted charge names the gap. Nothing in Ramp is modified. There is no pull request, because there is no repository in resources.
A reviewer samples three flagged vendors and opens them in Ramp. The test of the file is whether those three match the charges the transcript recorded. A vendor merged from two merchants the reviewer considers different is a follow-up on the same session: POST /o/{org}/sessions/{id}/messages after the turn leaves running. The follow-up wakes the parked sandbox.
Run it on every first of the month
On the first of the month your server POSTs this body to https://api.prix.dev/o/{org}/sessions. There is no resources field, because the work is the Ramp connection rather than a repository. Put the connection's name or id in connections, the same value GET /me/connections lists. An Idempotency-Key of the month keeps a retry from writing two audits. A name the account does not have, or a sign-in still pending, is 422 CONNECTION_NOT_READY.
The key's webhook receives run.completed with session_url. Download saas-audit.md from the artifacts list and send it to the people who own the cards. max_concurrent, 4 by default, applies here too: one audit is one session, and a 429 means the month's run has not started yet.
The use case this job follows, with its automation and trigger: Produce a report or file, no repo.
Why run it on Rush?
A SaaS audit means paging transactions, bills and reimbursements and deciding which merchants are the same subscription. Doing it in a spreadsheet loses the link from a flagged row back to the charge. The agent reads Ramp in a sandbox, writes saas-audit.md, and the transcript keeps the connection calls. Your laptop is not holding an export.
The file is the result, and it is only as strong as the charges it cites. You can rerun it next month with a new Idempotency-Key, or ask a follow-up to split a vendor, without exporting again. Several orgs' keys each see only that key's creator's Ramp connection.
Frequently asked questions
The sample request has no connections field. Where does it go?
Add it. A key run receives only the connections it names. connections is an array of ids or names from GET /me/connections, so "ramp" once that is the name you set. The body on this page is the task. Without that field the agent cannot see Ramp, and the run should say the connection was missing rather than guess at charges.
What does the connection actually expose?
The catalog describes transactions, card spend, reimbursements, bills and accounting data, over the remote at https://ramp-mcp-remote.ramp.com/mcp. The audit uses those. It does not assume a separate subscriptions product. A charge that is not in those objects cannot appear in the file.
Will it cancel a subscription or lock a card?
No. The prompt says to read and to write saas-audit.md. The connection is OAuth to Ramp, and a token can be broader than this task. The transcript is how you check that the calls were reads. A follow-up that asks to change a card is a different request, and you do not send it if this job is an audit.
How are two similar merchant names handled?
The agent groups charges into a vendor and says when the name was ambiguous. Ambiguous charges stay listed under the names Ramp returned, with a note, instead of being merged into a flag. That note is what a reviewer looks at first, because a false duplicate is the expensive mistake.
The OAuth window expired. What now?
POST /me/connections again and open the new authorize_url while signed in to the console as the key's creator. A sign-in not finished within 10 minutes comes back status failed with code connection_expired. Until GET /me/connections shows status connected, a run that names it is 422 CONNECTION_NOT_READY.