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

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 DAC7 and MRDP reporting, so 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.

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" }
        ]
      }
    ]
  }'
{
  "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 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 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.

"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. Mint a new one and retry.
  • 429. Too many requests. Slow down and retry.

Parameters

Only the fields used above. The full schema is in the API Reference.

FieldTypeRequiredDescription
idstringRequiredYour system's unique identifier for the transaction. Resending the same id updates the transaction.
account_idstringRequiredYour system's identifier for the seller's account.
typestringRequiredincome.
subtypestringOptionalpayment-goods or payment-services.
datetimestringRequiredISO 8601 timestamp of when the payment occurred.
receivedarrayOptionalThe 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[].withholdingsarrayOptionalTax withheld from that entry: regime_type (eu-dac7), asset_amount, and rates, all required.
feesarrayOptionalFees or commission charged on the payment, in the same shape as received.

Where to go next

Retrieve DAC7 and MRDP recipient copies: step 3, each reportable seller's annual copy.