# Transaction programs: attach, categorize, reconcile

URL: /code/mcp/transaction/verbs · Id: `page:code/mcp/transaction/verbs`

> The Transaction Verbs attach, categorize, reconcile as MCP do programs, with inputs, result, refusals and an example.

Reference for [Transaction](/business/nouns/transaction), one group of [Transaction programs](/code/mcp/transaction).

### Transaction.attach
Attach matches a receipt File to a card Transaction, or flags the Transaction when no receipt arrives in time. [Verb page](/business/nouns/transaction/attach?interface=mcp).

```text
do: return await $.Transaction.attach(input)
```

Emits [`Transaction.attached`](/business/events/Transaction.attached).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `transaction` | [Transaction](/business/nouns/transaction) | Yes | The card Transaction. |
| `file` | [File](/business/nouns/file) | No | The receipt; empty to match from the Startup’s Mailboxes. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `transaction` | [Transaction](/business/nouns/transaction) | Yes | The Transaction with its receipt. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Transaction.attach({ transaction: 'txn_XoxtZe3CQI' })"
  }
}
```

### Transaction.categorize
Categorize codes a Transaction to an account in the chart by the Startup’s Policy and flags a low-confidence code for review. [Verb page](/business/nouns/transaction/categorize?interface=mcp).

```text
do: return await $.Transaction.categorize(input)
```

Emits [`Transaction.categorized`](/business/events/Transaction.categorized).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `transaction` | [Transaction](/business/nouns/transaction) | Yes | The Transaction to code. |
| `account` | `string` | No | The account code to use in place of the Policy’s choice. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `transaction` | [Transaction](/business/nouns/transaction) | Yes | The coded Transaction. |
| `account` | `string` | Yes | The account code it was coded to. |
| `confidence` | `number` | Yes | How sure the code is, from 0 to 1. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |

**Example**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Transaction.categorize({ transaction: 'txn_XoxtZe3CQI' })"
  }
}
```

### Transaction.reconcile
Reconcile matches a Transaction on a payment rail to the ledger Entries it settles. [Verb page](/business/nouns/transaction/reconcile?interface=mcp).

```text
do: return await $.Transaction.reconcile(input)
```

Emits [`Transaction.reconciled`](/business/events/Transaction.reconciled).

**Inputs**

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `transaction` | [Transaction](/business/nouns/transaction) | Yes | The Transaction to match. |

**Returns**

| Output | Type | Required | Description |
| --- | --- | --- | --- |
| `transaction` | [Transaction](/business/nouns/transaction) | Yes | The reconciled Transaction. |

**Refuses when**

| Check | Error | Fix | Then call |
| --- | --- | --- | --- |
| The key is valid, but its scopes do not allow this operation. | [`forbidden`](/code/api/errors/forbidden) | Use a key whose scopes cover the operation, or ask an owner of the namespace to grant them. | None. |
| The record is not in a state that allows this Verb, so the call is refused. | [`refused`](/code/api/errors/refused) | Read the record, run the Verb that moves it to an allowed state, then retry. | None. |

**Example**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.Transaction.reconcile({ transaction: 'txn_XoxtZe3CQI' })"
  }
}
```