Developers
Revenue-connector payouts (Paddle, gross MoR).
GET /connectors/paddle/payouts List Paddle payoutsPOST /connectors/paddle/payouts Ingest a Paddle payoutPOST /connectors/paddle/payouts/{id}/post Post a payout to the books/connectors/paddle/payoutsList Paddle payouts
Revenue-connector payouts with their component breakdown (gross Merchant-of-Record). Use `aggregate=month` for monthly totals.
Required permission:
connectors:payouts.read (Connectors › Payment provider payouts › Read)
Pagination: Not paginated: returns the full set.
| Name | In | Type | Description |
|---|---|---|---|
from | query | string (date) | |
to | query | string (date) | |
aggregate | query | string | Return monthly totals instead of individual payouts. Values: month |
200 List of payouts · application/json
| Name | Type | Description |
|---|---|---|
payouts | object[] | |
payouts[].id | string | |
payouts[].companyId | string | |
payouts[].payoutDate | string (date) | |
payouts[].currency | string | |
payouts[].gross | string | Decimal string |
payouts[].fees | string | Decimal string |
payouts[].net | string | Decimal string |
payouts[].components | object[] | |
payouts[].components[].type | string | |
payouts[].components[].amount | string | Decimal string |
401 Missing or invalid Bearer token. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
403 Token lacks the required permission, or the resource is outside the token's tenant. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
429 Rate limit exceeded. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
curl -X GET "https://app.bm.consulting/api/v1/connectors/paddle/payouts" \
-H "Authorization: Bearer $BMC_TOKEN" const res = await fetch("https://app.bm.consulting/api/v1/connectors/paddle/payouts", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BMC_TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); import os
import requests
res = requests.get(
"https://app.bm.consulting/api/v1/connectors/paddle/payouts",
headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
timeout=30,
)
res.raise_for_status()
data = res.json() /connectors/paddle/payoutsIngest a Paddle payout
Idempotent by `paddlePayoutId`: re-sending the same payout returns the existing one. `companyId` is forced from the token.
Required permission:
connectors:payouts.create (Connectors › Payment provider payouts › Create)
Pagination: Not paginated: returns the full set.
application/json| Name | Type | Description |
|---|---|---|
paddlePayoutIdrequired | string | |
payoutDaterequired | string (date) | |
currencyrequired | string | |
componentsrequired | object[] | |
components[].type | string | |
components[].amount | string | Decimal string |
200 Idempotent replay of an already-ingested payout
201 Payout ingested · application/json
| Name | Type | Description |
|---|---|---|
id | string | |
companyId | string | |
payoutDate | string (date) | |
currency | string | |
gross | string | Decimal string |
fees | string | Decimal string |
net | string | Decimal string |
components | object[] | |
components[].type | string | |
components[].amount | string | Decimal string |
401 Missing or invalid Bearer token. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
403 Token lacks the required permission, or the resource is outside the token's tenant. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
429 Rate limit exceeded. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
curl -X POST "https://app.bm.consulting/api/v1/connectors/paddle/payouts" \
-H "Authorization: Bearer $BMC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"paddlePayoutId":"string","payoutDate":"2026-01-31","currency":"EUR","components":[{"type":"sale","amount":"string"}]}' const res = await fetch("https://app.bm.consulting/api/v1/connectors/paddle/payouts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BMC_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"paddlePayoutId": "string",
"payoutDate": "2026-01-31",
"currency": "EUR",
"components": [
{
"type": "sale",
"amount": "string"
}
]
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); import os
import requests
res = requests.post(
"https://app.bm.consulting/api/v1/connectors/paddle/payouts",
headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
json={
"paddlePayoutId": "string",
"payoutDate": "2026-01-31",
"currency": "EUR",
"components": [{
"type": "sale",
"amount": "string",
}],
},
timeout=30,
)
res.raise_for_status()
data = res.json() /connectors/paddle/payouts/{id}/postPost a payout to the books
Books the ingested payout as a journal entry (gross Merchant-of-Record treatment). Idempotent.
Required permission:
connectors:payouts.post (Connectors › Payment provider payouts › Post to ledger)
Pagination: Not paginated: returns the full set.
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string |
200 Payout posted (journal entry created)
401 Missing or invalid Bearer token. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
403 Token lacks the required permission, or the resource is outside the token's tenant. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
404 Resource not found (or belongs to a different tenant). · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
429 Rate limit exceeded. · application/json
| Name | Type | Description |
|---|---|---|
error | string | Human-readable error message |
required_permission | string | Present on 403 - the missing permission (area:resource.action) |
curl -X POST "https://app.bm.consulting/api/v1/connectors/paddle/payouts/<id>/post" \
-H "Authorization: Bearer $BMC_TOKEN" const res = await fetch("https://app.bm.consulting/api/v1/connectors/paddle/payouts/<id>/post", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BMC_TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); import os
import requests
res = requests.post(
"https://app.bm.consulting/api/v1/connectors/paddle/payouts/<id>/post",
headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
timeout=30,
)
res.raise_for_status()
data = res.json()