Send seller income payments
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 MRDP & DAC7 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.
Before you begin
- A bearer token. See Authenticate.
- The seller's account. See Create account owners and accounts.
- The seller's details, sent as in Collect seller data.
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:
- Buyer A buys an item. Buyer A has an expense; the seller has an income payment.
- Buyer B buys an item. Buyer B has an expense; the seller has an income payment.
- 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.
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
messageisInvalid TDM Transaction V2, anddata[0].messagesays what failed. Fix it and resend. A 400 also comes back when two requests for the sameidare 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 and rate limits page has every error shape, the rate limits, and which calls are safe to retry.
Parameters
Only the fields used above. The full schema 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: step 3, each reportable seller's annual copy.
Updated 4 days ago
