# Transaction methods: attach, categorize, reconcile

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

> The Transaction Verbs attach, categorize, reconcile as typed SDK methods, with inputs, result, refusals and an example.

Reference for [Transaction](/business/nouns/transaction), one group of [Transaction methods](/code/sdk/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=sdk).

```ts
interface TransactionVerbs {
  attach(input: TransactionAttachInput, options?: SB.CallOptions): SB.Call<Transaction>
}
```

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**

```ts
import { $ } from 'startup-builder'

const transaction = 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=sdk).

```ts
interface TransactionVerbs {
  categorize(input: TransactionCategorizeInput, options?: SB.CallOptions): SB.Call<TransactionCategorizeOutput>
}
```

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**

```ts
import { $ } from 'startup-builder'

const { transaction, account, confidence } = 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=sdk).

```ts
interface TransactionVerbs {
  reconcile(input: TransactionReconcileInput, options?: SB.CallOptions): SB.Call<Transaction>
}
```

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**

```ts
import { $ } from 'startup-builder'

const transaction = await $.Transaction.reconcile({ transaction: 'txn_XoxtZe3CQI' })
```