Procurement
curl --request POST \
--url https://win.oneshotagent.com/v1/tools/procurement/transactionsimport requests
url = "https://win.oneshotagent.com/v1/tools/procurement/transactions"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://win.oneshotagent.com/v1/tools/procurement/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://win.oneshotagent.com/v1/tools/procurement/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://win.oneshotagent.com/v1/tools/procurement/transactions"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://win.oneshotagent.com/v1/tools/procurement/transactions")
.asString();require 'uri'
require 'net/http'
url = URI("https://win.oneshotagent.com/v1/tools/procurement/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"data.transactions": [
{}
],
"data.bills": [
{}
],
"data.suppliers": [
{}
]
}Connections
Procurement
Read card transactions, bills and suppliers from your connected spend system
POST
/
v1
/
tools
/
procurement
/
transactions
Procurement
curl --request POST \
--url https://win.oneshotagent.com/v1/tools/procurement/transactionsimport requests
url = "https://win.oneshotagent.com/v1/tools/procurement/transactions"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://win.oneshotagent.com/v1/tools/procurement/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://win.oneshotagent.com/v1/tools/procurement/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://win.oneshotagent.com/v1/tools/procurement/transactions"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://win.oneshotagent.com/v1/tools/procurement/transactions")
.asString();require 'uri'
require 'net/http'
url = URI("https://win.oneshotagent.com/v1/tools/procurement/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"data.transactions": [
{}
],
"data.bills": [
{}
],
"data.suppliers": [
{}
]
}Overview
Read-only tools on a connected spend system (Connections): Ramp. Nothing is approved, paid, archived or created; nothing fetched is kept.POST /v1/tools/procurement/transactions(procurement_transactions): card and spend transactions.POST /v1/tools/procurement/bills(procurement_bills): bills awaiting or past approval.POST /v1/tools/procurement/suppliers(procurement_suppliers): suppliers and their spend.
connection_id: list your connections (GET /v1/connections) and pick by system and account_label.
Authentication
Requires x402 payment in thepayment-signature header. Refusals for the body, the connection or an unavailable system come before payment and are not charged.
Request
| Field | Meaning |
|---|---|
connection_id | Required. The connection to read. |
from, to | Whole days (YYYY-MM-DD, UTC): transactions by when the card was used, bills by issue date, suppliers by when they were added. |
limit | Records per page, 1 to 100, default 25. |
cursor | The next_cursor of the previous page. |
{ "connection_id": "5f4a3b2c-1d0e-4f9a-8b7c-6d5e4f3a2b1c", "from": "2026-10-01", "limit": 25 }
Response (200)
Every page hasnext_cursor: send it as cursor; null on the last page. Amounts are in the currency’s major unit (dollars, not cents). Missing fields are null.
array
Each transaction:
id, posted_at (when it settled, or when the card was used while pending), merchant, amount (a refund is negative), currency, card_holder, department, category, receipt_attached and source (system, id).array
Each bill:
id, vendor, amount, currency, due_on, status (awaiting_approval, approved, rejected, paid or void) and source.array
Each supplier:
id, name, category, total_spend (all-time amount and currency) and source.{
"success": true,
"data": {
"bills": [
{ "id": "c2a9e7f1-0000-4000-8000-000000000002", "vendor": "Office Supply Co", "amount": 840, "currency": "USD", "due_on": "2026-10-30", "status": "awaiting_approval", "source": { "system": "ramp", "id": "c2a9e7f1-0000-4000-8000-000000000002" } }
],
"next_cursor": null
}
}
Errors
| Status | Error | Meaning |
|---|---|---|
| 400 | invalid_request | The body is not valid. |
| 400 | connection_wrong_system | The connection is not on a spend system. |
| 404 | connection_not_found | No such connection for this agent. |
| 409 | connection_expired, connection_revoked, connection_not_active | Reconnect from the console, or start a new connection. |
| 503 | not_configured | The system is not available right now. |
| 503 | rate_limited, system_unavailable | The system is busy or did not answer; a paid call is returned as account credit. |