Skip to content

Set the platform's fee schedule on a merchant account

POST
/v1/merchant-accounts/{merchant_account_id}/fee
curl --request POST \
--url https://api.aerandil.com/v1/merchant-accounts/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/fee \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "fee_conversion_bps": 1, "fee_schedule": [ { "bps": 1, "card_present": true, "fee_class": "domestic_standard", "fixed": { "amount": "example", "currency": "example" }, "processor_bps": 1, "processor_fixed": { "amount": "example", "currency": "example" } } ], "markup_bps": 1 }'

The platform’s fee by card class — Stripe’s published rate for the class plus a markup — through set_merchant_account_fee. Either markup_bps (laid over the account’s own Stripe columns, its fixed fees passed through) or the whole fee_schedule, row by row. Applies to money captured from now on, holds already placed included. Operator only (tenant_admin:write).

merchant_account_id
required
string format: uuid

The property’s merchant account.

Media typeapplication/json
object
fee_conversion_bps

Stripe’s currency-conversion fee; defaults to the account’s.

integer
<= 10000
fee_schedule
Array<object>
object
bps
required
integer
<= 10000
card_present
required

This row prices a terminal’s charge rather than an online one.

boolean
fee_class
required

The card’s class: regional is the EEA for a UK account and the UK for a eurozone one.

string
Allowed values: domestic_standard domestic_premium regional international
fixed
required

The fixed fee the hotel pays — Stripe’s own, passed through.

object
amount
required

Exact decimal as a string. Money is never a float — binary floating point cannot hold 0.10.

string format: decimal
currency
required
string format: iso-4217
processor_bps
required
integer
<= 10000
processor_fixed
required
object
amount
required

Exact decimal as a string. Money is never a float — binary floating point cannot hold 0.10.

string format: decimal
currency
required
string format: iso-4217
markup_bps

Basis points over Stripe’s rate for every class (40 = Stripe + 0.40%). Not with fee_schedule.

integer

The schedule, set.

Media typeapplication/json
object
fee_conversion_bps
required
integer
fee_schedule
required
Array<object>
object
bps
required
integer
<= 10000
card_present
required

This row prices a terminal’s charge rather than an online one.

boolean
fee_class
required

The card’s class: regional is the EEA for a UK account and the UK for a eurozone one.

string
Allowed values: domestic_standard domestic_premium regional international
fixed
required

The fixed fee the hotel pays — Stripe’s own, passed through.

object
amount
required

Exact decimal as a string. Money is never a float — binary floating point cannot hold 0.10.

string format: decimal
currency
required
string format: iso-4217
processor_bps
required
integer
<= 10000
processor_fixed
required
object
amount
required

Exact decimal as a string. Money is never a float — binary floating point cannot hold 0.10.

string format: decimal
currency
required
string format: iso-4217
markup_bps

The one markup every row carries over Stripe’s rate with its fixed fee passed through (“Stripe + 0.40%” is 40); null for a schedule set row by row.

integer | null
merchant_account_id
required
string format: uuid
Example
{
"fee_schedule": [
{
"fee_class": "domestic_standard"
}
]
}
Cache-Control
string

Always no-store. Object and link state is live data and is never cacheable.

The bearer authenticated but does not hold the scope this operation requires.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

No such object in the caller’s tenant — which is also the answer when it exists in another tenant, by design.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

Neither or both of markup_bps and fee_schedule; a class priced twice or not at all; a rate outside 0–10000 basis points; a negative fixed fee or two currencies; or the account is closed.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}