> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oneshotagent.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Procurement

> Read card transactions, bills and suppliers from your connected spend system

## Overview

Read-only tools on a connected spend system ([Connections](/api-reference/connections/overview)): 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.

All take `connection_id`: list your connections (`GET /v1/connections`) and pick by `system` and `account_label`.

## Authentication

Requires x402 payment in the `payment-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. |

```json theme={null}
{ "connection_id": "5f4a3b2c-1d0e-4f9a-8b7c-6d5e4f3a2b1c", "from": "2026-10-01", "limit": 25 }
```

## Response (200)

Every page has `next_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.

<ResponseField name="data.transactions" type="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`).
</ResponseField>

<ResponseField name="data.bills" type="array">
  Each bill: `id`, `vendor`, `amount`, `currency`, `due_on`, `status` (`awaiting_approval`, `approved`, `rejected`, `paid` or `void`) and `source`.
</ResponseField>

<ResponseField name="data.suppliers" type="array">
  Each supplier: `id`, `name`, `category`, `total_spend` (all-time `amount` and `currency`) and `source`.
</ResponseField>

```json theme={null}
{
  "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. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.