> For the complete documentation index, see [llms.txt](https://tri.gitbook.io/tri-doc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tri.gitbook.io/tri-doc/liquidity-pool/get-carbon-transactions.md).

# Get Carbon Transactions

### Liquidity Pool

<mark style="color:blue;">`GET`</mark> <https://sandbox.triangle.digital/api/v2/liquidity\\_pool/clients/{client\\_id}/carbon\\_transactions>

Carbon Pool purchases of the client, one row per expense-type line, newest first. Amounts are objects with an ISO 4217 currency and a decimal-string amount; dates are ISO 8601 in UTC.

**What is in the list.** A line is listed as soon as the purchase was paid for; `status` says whether the purchased quantity was retired (`approved`) or not (`failed`), and `comment` says the same in words — on a failed line, the reason the network gave for refusing the burn and what happened to the money. A purchase whose payment was refused is not listed at all. `totals` count the approved lines only.

**One transaction.** Pass `transaction_id` to get just that transaction; `totals` then cover it alone. The id comes back from the purchase calls, so a purchase can be read in detail right after it is made.

**Paging.** Pass the `next_cursor` of the previous answer as `starting_after`; `has_more` says whether another page exists. A cursor is opaque and short-lived — do not store it. `totals` cover the whole filtered set, not the current page.

**Path parameters**

<table data-full-width="true" data-search="false"><thead><tr><th width="230">Name</th><th width="110">Type</th><th>Description</th><th width="210">Where to take it from</th></tr></thead><tbody><tr><td><code>client_id</code></td><td>integer</td><td><strong>Required.</strong> The client whose transactions are read.</td><td><a href="/tri-doc/liquidity-pool/get-clients.md">Get Clients</a> — <code>client_id</code></td></tr></tbody></table>

**Headers**

<table data-full-width="true"><thead><tr><th>Name</th><th>Value</th></tr></thead><tbody><tr><td>Content-Type</td><td><code>application/json</code></td></tr></tbody></table>

**Query parameters**

<table data-full-width="true" data-search="false"><thead><tr><th width="220">Name</th><th width="110">Type</th><th>Description</th><th width="260">Example</th></tr></thead><tbody><tr><td><code>hash</code></td><td>string</td><td><strong>Required.</strong> API key.</td><td>fk5f0iuy-rr06-j4x3-i75b-fy2s67s4ilo1</td></tr><tr><td><code>transaction_id</code></td><td>uuid</td><td>Return the single transaction with this id. From <a href="/tri-doc/liquidity-pool/buy-carbon-pool.md">Buy Carbon Pool</a> or <a href="/tri-doc/liquidity-pool/purchase-assets.md">Purchase Assets</a> — <code>transaction_id</code>, or from a previous answer of this call. An id that matches nothing answers an empty list.</td><td>a27a13e9-67e9-4b45-be01-3b0ecd3722cf</td></tr><tr><td><code>search</code></td><td>string</td><td>Free-text case-insensitive search on the asset name.</td><td>Ranch</td></tr><tr><td><code>asset_name</code></td><td>string</td><td>Filter by exact asset name.</td><td>Walker Ranch UAT 2</td></tr><tr><td><code>carbon_type</code></td><td>string</td><td>Filter by expense type. Allowed values: AI Compute, Air Travel, Vehicle, Lodging, Food.</td><td>Air Travel</td></tr><tr><td><code>transaction_type</code></td><td>string</td><td>Return the transactions whose Transaction Types include this value. Allowed values: <code>business_travel</code>, <code>employee_commuting</code>, <code>purchased_goods_and_services</code>.</td><td>business_travel</td></tr><tr><td><code>invoice_number</code></td><td>string</td><td>Filter by exact invoice number.</td><td>3134</td></tr><tr><td><code>client_employee_id</code></td><td>string</td><td>Filter by exact client-facing Employee ID (the <code>employee_number</code> of <a href="/tri-doc/liquidity-pool/get-employees.md">Get Employees</a>).</td><td>2315</td></tr><tr><td><code>company_id</code></td><td>uuid</td><td>Business accounts only. Transactions of this Carbon Pool company. Not together with <code>individual_consumption_id</code>. From <a href="/tri-doc/liquidity-pool/get-companies.md">Get Companies</a> — <code>company_id</code>.</td><td>dcd1e0a0-ed57-4180-846f-efbe5ea42828</td></tr><tr><td><code>individual_consumption_id</code></td><td>uuid</td><td>Business accounts only. Transactions of this Individual Consumption. Not together with <code>company_id</code>. From <a href="/tri-doc/liquidity-pool/get-individual-consumptions.md">Get Individual Consumptions</a> — <code>individual_consumption_id</code>.</td><td>68117898-4278-499f-b96b-78173f3d2040</td></tr><tr><td><code>limit</code></td><td>integer</td><td>Rows per page, from 1 to 200. Default: 50.</td><td>50</td></tr><tr><td><code>starting_after</code></td><td>string</td><td>Cursor of the next page — the <code>next_cursor</code> of the previous answer.</td><td>BAhpArwH--cf3dbfae63e8c90fa70a4c1558c9e9</td></tr></tbody></table>

**Response fields**

The fields of a transaction are the same as in [Buy Carbon Pool](/tri-doc/liquidity-pool/buy-carbon-pool.md) and [Purchase Assets](/tri-doc/liquidity-pool/purchase-assets.md).

<table data-full-width="true" data-search="false"><thead><tr><th width="360">Field</th><th width="110">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>message</code></td><td>string</td><td>Human-readable result of the call.</td></tr><tr><td><code>success</code></td><td>boolean</td><td>Whether the call succeeded; a failed call answers HTTP 400.</td></tr><tr><td><code>data.is_business</code></td><td>boolean</td><td>Whether the client is a Business account.</td></tr><tr><td><code>data.transactions[].asset_name</code></td><td>string</td><td>Asset the credits were purchased from, under its current name; <code>null</code> when that asset no longer exists.</td></tr><tr><td><code>data.transactions[].asset_id</code></td><td>string</td><td>Identifier of that asset, as the transaction recorded it — 32 uppercase hexadecimal characters. It is the stable half of the pair: <code>asset_name</code> is resolved to the asset's CURRENT name and changes when the asset is renamed, while this value does not — key on it, not on the name. The purchase calls answer the same identifier for the line, and <a href="/tri-doc/liquidity-pool/get-pool-list.md">Get Pool List</a> answers it for the pool record the line came from.</td></tr><tr><td><code>data.transactions[].viewer</code></td><td>string</td><td>Address of the asset's Parameters Viewer — the page holding the parameters of that asset. <code>null</code> when there is no such page: only a Carbon Credit asset has one, and a line whose asset no longer exists has none either.</td></tr><tr><td><code>data.transactions[].instrument_type</code></td><td>string</td><td>Instrument Type of that asset as it was at the time of the purchase — a later change to the asset does not rewrite it, so this value can differ from the one <a href="/tri-doc/liquidity-pool/get-pool-list.md">Get Pool List</a> answers for the same asset today. An asset may carry several; they come back in one string, comma-separated — for example <code>Engineered, Nature-based</code>. <code>null</code> when the asset carries no Instrument Type.</td></tr><tr><td><code>data.transactions[].transaction_id</code></td><td>uuid</td><td>Identifier of the transaction. Pass it back as the <code>transaction_id</code> parameter to read this transaction alone.</td></tr><tr><td><code>data.transactions[].retirement_id</code></td><td>string</td><td>Hash of the Ethereum transaction that retired the purchased quantity. <code>null</code> when the quantity was not retired on Ethereum.</td></tr><tr><td><code>data.transactions[].payment_intent_id</code></td><td>string</td><td>Identifier of the payment at the provider; <code>null</code> when the purchase was paid from the balance.</td></tr><tr><td><code>data.transactions[].company_id</code></td><td>uuid</td><td>Carbon Pool company the purchase was made for (Business), as in <a href="/tri-doc/liquidity-pool/get-companies.md">Get Companies</a> — <code>company_id</code>; <code>null</code> on other lines.</td></tr><tr><td><code>data.transactions[].client_company_id</code></td><td>string</td><td>Company ID entered by the client; <code>null</code> when the purchase is not for a company.</td></tr><tr><td><code>data.transactions[].company_name</code></td><td>string</td><td>Name of that Carbon Pool company, as in <a href="/tri-doc/liquidity-pool/get-companies.md">Get Companies</a> — <code>company_name</code>. <code>null</code> when the purchase is not for a company, and when the company was created without a name.</td></tr><tr><td><code>data.transactions[].employee_id</code></td><td>integer</td><td>Employee the purchase was billed to, as in <a href="/tri-doc/liquidity-pool/get-employees.md">Get Employees</a> — <code>employee_id</code>; <code>null</code> on an Individual Consumption line.</td></tr><tr><td><code>data.transactions[].client_employee_id</code></td><td>string</td><td>Client-facing Employee ID (the <code>employee_number</code> of <a href="/tri-doc/liquidity-pool/get-employees.md">Get Employees</a>); <code>null</code> on an Individual Consumption line.</td></tr><tr><td><code>data.transactions[].employee_name</code></td><td>string</td><td>Name of the employee the purchase was billed to. Unlike <code>employee_id</code> it is filled on an Individual Consumption line as well, where it repeats the name inside <code>individual_consumption</code>. It is the name as it was at the time of the purchase — renaming the employee afterwards does not change it.</td></tr><tr><td><code>data.transactions[].individual_consumption</code></td><td>object</td><td>Individual Consumption the purchase was made for — <code>individual_consumption_id</code> (as in <a href="/tri-doc/liquidity-pool/get-individual-consumptions.md">Get Individual Consumptions</a>), <code>name</code>, <code>email</code>; <code>null</code> on other lines.</td></tr><tr><td><code>data.transactions[].credit_card</code></td><td>boolean</td><td>Whether the payer of the line has a credit card on file. It describes the payer, not this payment, so it is reported whatever the line was paid with; the card that was actually charged is <code>credit_card_last4</code>.</td></tr><tr><td><code>data.transactions[].credit_card_last4</code></td><td>string</td><td>Last 4 digits of the card that was charged; <code>null</code> when the line was paid from the balance.</td></tr><tr><td><code>data.transactions[].payment_source</code></td><td>string</td><td>How the line was paid: <code>balance</code> — from the Spending Capacity balance (see <a href="/tri-doc/liquidity-pool/balance.md">Balance</a>), <code>card</code> — by credit card.</td></tr><tr><td><code>data.transactions[].carbon_type</code></td><td>string</td><td>Expense Type. One of: AI Compute, Air Travel, Vehicle, Lodging or Food.</td></tr><tr><td><code>data.transactions[].co2</code></td><td>number</td><td>Purchased quantity, tons of CO2e.</td></tr><tr><td><code>data.transactions[].pool_px</code></td><td>object</td><td>Price per ton — currency and decimal string.</td></tr><tr><td><code>data.transactions[].notional</code></td><td>object</td><td>Line total — currency and decimal string.</td></tr><tr><td><code>data.transactions[].created_at</code></td><td>string</td><td>When the purchase happened, ISO 8601 in UTC. The same moment the purchase call answered for this line.</td></tr><tr><td><code>data.transactions[].invoice_number</code></td><td>string</td><td>Invoice the purchase was made through; empty on a Pool Price purchase.</td></tr><tr><td><code>data.transactions[].transaction_type</code></td><td>string</td><td>Transaction Type of the expense lines the purchase covered, when there is exactly one — the category the purchased CO2 is attributed to. One of <code>business_travel</code>, <code>employee_commuting</code>, <code>purchased_goods_and_services</code>, as in <a href="/tri-doc/liquidity-pool/get-invoices.md">Get Invoices</a> — <code>expense_lines[].transaction_type</code>. <code>null</code> when the covered lines carry different types (see <code>transaction_types</code>), when the line has no invoice behind it (a Pool Price purchase), or when the lines carry no Transaction Type.</td></tr><tr><td><code>data.transactions[].transaction_types</code></td><td>array</td><td>Every Transaction Type of the expense lines the purchase covered, each once. <code>[]</code> on a Pool Price purchase and when the lines carry none.</td></tr><tr><td><code>data.transactions[].status</code></td><td>string</td><td>Outcome of the line — see <strong>Status values</strong> below.</td></tr><tr><td><code>data.transactions[].comment</code></td><td>string</td><td>The same outcome in words, as the purchase call reported it. An approved line: <code>Paid and burned.</code> A failed line names the reason the network gave for refusing the burn and what happened to the money: <code>Paid, but the token burn was not completed: "&#x3C;reason>". The money was returned to the balance.</code> — paid by card, the last sentence is <code>The money was not returned - please contact Triangle Admin.</code> The reason is quoted as the network worded it and is left out when the network gave none. <code>null</code> when the line carries no comment.</td></tr><tr><td><code>data.totals.total_co2</code></td><td>number</td><td>Tonnage over the whole filtered set (all pages), approved lines only.</td></tr><tr><td><code>data.totals.total_pool_px</code> / <code>total_notional</code></td><td>object</td><td>Money totals over the whole filtered set, approved lines only.</td></tr><tr><td><code>data.next_cursor</code></td><td>string</td><td>Pass as <code>starting_after</code> to read the next page; <code>null</code> on the last one.</td></tr><tr><td><code>data.has_more</code></td><td>boolean</td><td>Whether another page exists.</td></tr><tr><td><code>operations_count</code></td><td>integer</td><td>Always <code>1</code>.</td></tr></tbody></table>

**Status values**

<table data-full-width="true" data-search="false"><thead><tr><th width="250">status</th><th>Meaning</th></tr></thead><tbody><tr><td><code>approved</code></td><td>The line was paid and the purchased quantity was retired.</td></tr><tr><td><code>failed</code></td><td>The line was paid, but the quantity was not retired and nothing was taken from the pool record. Paid from the balance, the money is returned automatically; paid by card, contact Triangle support. <code>comment</code> carries the reason the network gave. Such a line is not counted in <code>totals</code>.</td></tr></tbody></table>

**Response**

{% tabs %}
{% tab title="200" %}
{% code fullWidth="false" %}

```json
{
    "message": "Data received successfully.",
    "success": true,
    "data": {
        "is_business": true,
        "transactions": [
            {
                "asset_name": "Walker Ranch UAT 2",
                "asset_id": "D689021E04987FB9476852972D0AE958",
                "viewer": "https://sandbox.triangle.digital/v/16924",
                "instrument_type": "Nature-based",
                "transaction_id": "a27a13e9-67e9-4b45-be01-3b0ecd3722cf",
                "retirement_id": "0xfa26fd5dd02b9c1f0a5f5c7f0e2c1a3d4b5e6f708192a3b4c5d6e7f8091a2b3c",
                "payment_intent_id": "pi_3U13HLIqyi8MGgBI2lkvamAs",
                "company_id": "dcd1e0a0-ed57-4180-846f-efbe5ea42828",
                "client_company_id": "456",
                "company_name": "Acme Logistics",
                "employee_id": 345,
                "client_employee_id": "345",
                "employee_name": "John Smith",
                "individual_consumption": null,
                "credit_card": true,
                "credit_card_last4": "4242",
                "payment_source": "card",
                "carbon_type": "Vehicle",
                "co2": 1.0,
                "pool_px": { "currency": "USD", "amount": "20.40" },
                "notional": { "currency": "USD", "amount": "20.40" },
                "created_at": "2026-08-05T11:46:50Z",
                "invoice_number": "",
                "transaction_type": null,
                "transaction_types": [],
                "status": "approved",
                "comment": "Paid and burned."
            },
            {
                "asset_name": "Climate Capital Asset",
                "asset_id": "4B81D6CA57F2490E8AD3C1F70B95E2D6",
                "viewer": "https://sandbox.triangle.digital/v/16938",
                "instrument_type": "Engineered, Nature-based",
                "transaction_id": "e973e132-628d-46b7-904c-eee025875d1d",
                "retirement_id": null,
                "payment_intent_id": null,
                "company_id": null,
                "client_company_id": null,
                "company_name": null,
                "employee_id": 345,
                "client_employee_id": "345",
                "employee_name": "John Smith",
                "individual_consumption": null,
                "credit_card": true,
                "credit_card_last4": null,
                "payment_source": "balance",
                "carbon_type": "Food",
                "co2": 0.5,
                "pool_px": { "currency": "USD", "amount": "18.50" },
                "notional": { "currency": "USD", "amount": "9.25" },
                "created_at": "2026-08-21T18:05:03Z",
                "invoice_number": "",
                "transaction_type": null,
                "transaction_types": [],
                "status": "failed",
                "comment": "Paid, but the token burn was not completed: \"execution reverted: Insufficient balance\". The money was returned to the balance."
            }
        ],
        "totals": {
            "total_co2": 1.0,
            "total_pool_px": { "currency": "USD", "amount": "20.40" },
            "total_notional": { "currency": "USD", "amount": "20.40" }
        },
        "next_cursor": null,
        "has_more": false
    },
    "operations_count": 1
}
```

{% endcode %}
{% endtab %}

{% tab title="400" %}
The hash is unknown, or a filter / the cursor is not valid; the message says what exactly.

```json
{
    "message": "Error! No such hash.",
    "success": false
}
```

{% endtab %}
{% endtabs %}
