---
updatedAt: 2026-10-13T18:31:49.000Z
agentTools:
  projectIndex: https://apidocs.taxbit.com/llms.txt
---

# Send income & payment transactions

Send each payment a seller receives from a buyer as an income transaction, with the gross amount, your fees, and any tax withheld.

Step 2 of [Digital Platform Reporting](https://apidocs.taxbit.com/docs/dac7-introduction). Taxbit reports what each seller earned on your platform from the income transactions you send: one transaction for each payment a seller receives from a buyer.

By the end of this page you know which of your platform's events to send, and you have sent a seller's income payment to Taxbit.

## Before you begin

* A bearer token. See [Authenticate your tenant](https://apidocs.taxbit.com/docs/accessing-the-api).
* The seller's account. See [Create account owners and accounts](https://apidocs.taxbit.com/docs/setting-up-account-owners-and-accounts).
* The seller's details, sent as in [Collect seller data](https://apidocs.taxbit.com/docs/seller-data-collection).

## Decide which events to send

Send income payments only. A seller withdrawing their balance is not an income payment, and neither is the buyer's side of a purchase.

For example, two buyers each buy an item from a seller's store, and the seller then withdraws the money:

1. Buyer A buys an item. Buyer A has an expense; **the seller has an income payment**.
2. Buyer B buys an item. Buyer B has an expense; **the seller has an income payment**.
3. The seller withdraws their money.

Only the two income payments are needed for reporting under DAC7 and under MRDP, the OECD's Model Rules for Reporting by Platform Operators. You send two transactions, both on the seller's account.

## Send the income payment

Send one transaction per payment, identified by your own `id`. `type` is `income`, and `subtype` is `payment-goods` for the sale of goods or `payment-services` for services. Put the amount the seller was paid in `received`, before any fees, and the fees or commission you charged on the payment in `fees`.

```bash
curl -X POST $BASE_URL/v1/transactions/external-id \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "ord_41870",
    "account_id": "acct_6b8d2f14",
    "type": "income",
    "subtype": "payment-goods",
    "datetime": "2026-05-09T11:42:17.000Z",
    "received": [
      {
        "asset_amount": {
          "asset": { "code": "EUR", "type": "Fiat" },
          "amount": "120.00"
        },
        "rates": [
          { "asset": { "code": "EUR", "type": "Fiat" }, "amount": "1.00" }
        ]
      }
    ],
    "fees": [
      {
        "asset_amount": {
          "asset": { "code": "EUR", "type": "Fiat" },
          "amount": "6.00"
        },
        "rates": [
          { "asset": { "code": "EUR", "type": "Fiat" }, "amount": "1.00" }
        ]
      }
    ]
  }'
```

```json
{
  "status": "success",
  "message": "Transaction post successful."
}
```

A 201 means Taxbit accepted the transaction. The seller was paid €120.00 and you kept €6.00, so `received` is 120.00, not 114.00. Don't net the fee yourself; see [Send payment transactions](https://apidocs.taxbit.com/docs/payment-transactions) for how Taxbit treats a fee alongside the amount.

To correct a payment, send it again with the same `id`; to remove one sent in error, delete it by `id`. [Send payment transactions](https://apidocs.taxbit.com/docs/payment-transactions#correct-or-remove-a-payment) shows both.

## Record tax withheld

If you withheld tax from the payment, add a `withholdings` entry to the `received` entry it was withheld from, with `regime_type` set to `eu-dac7`. Each withholding must be less than the received amount and in the same asset.

```json
"received": [
  {
    "asset_amount": {
      "asset": { "code": "EUR", "type": "Fiat" },
      "amount": "120.00"
    },
    "rates": [
      { "asset": { "code": "EUR", "type": "Fiat" }, "amount": "1.00" }
    ],
    "withholdings": [
      {
        "regime_type": "eu-dac7",
        "asset_amount": {
          "asset": { "code": "EUR", "type": "Fiat" },
          "amount": "18.00"
        },
        "rates": [
          { "asset": { "code": "EUR", "type": "Fiat" }, "amount": "1.00" }
        ]
      }
    ]
  }
]
```

## If the request fails

* **400.** A field failed validation: the body's `message` is `Invalid TDM Transaction V2`, and `data[0].message` says what failed. Fix it and resend. A 400 also comes back when two requests for the same `id` are in flight at once; resend once the other request has finished.
* **401.** The bearer token is missing, invalid, or expired. Request a new one and retry.
* **429.** Too many requests. Slow down and retry.

The [Errors](https://apidocs.taxbit.com/docs/errors) page has every error shape, the rate limits, and which calls are safe to retry.

## Parameters

Only the fields used above. The [full schema](https://apidocs.taxbit.com/reference/post_transactions-external-id) is in the API Reference.

| Field                     | Type   | Required | Description                                                                                                                                                                               |
| ------------------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                      | string | Required | Your system's unique identifier for the transaction. Resending the same `id` updates the transaction.                                                                                     |
| `account_id`              | string | Required | Your system's identifier for the seller's account.                                                                                                                                        |
| `type`                    | string | Required | `income`.                                                                                                                                                                                 |
| `subtype`                 | string | Optional | `payment-goods` or `payment-services`.                                                                                                                                                    |
| `datetime`                | string | Required | ISO 8601 timestamp of when the payment occurred.                                                                                                                                          |
| `received`                | array  | Optional | Send it for every payment. The amount paid to the seller, before fees. Each entry has an `asset_amount` (an `asset` and an `amount` as a string) and a `rates` array with its fiat value. |
| `received[].withholdings` | array  | Optional | Tax withheld from that entry: `regime_type` (`eu-dac7`), `asset_amount`, and `rates`, all required.                                                                                       |
| `fees`                    | array  | Optional | Fees or commission charged on the payment, in the same shape as `received`.                                                                                                               |

## Where to go next

[Retrieve DAC7 and MRDP recipient copies](https://apidocs.taxbit.com/docs/retrieve-dac7-recipient-copies): step 3, each reportable seller's annual copy.

# Sibling pages

* [Digital Platform Reporting overview](https://apidocs.taxbit.com/docs/dac7-introduction.md)
* [Collect seller data](https://apidocs.taxbit.com/docs/seller-data-collection.md)
* [Retrieve DAC7 and MRDP recipient copies](https://apidocs.taxbit.com/docs/retrieve-dac7-recipient-copies.md)