Create FX tariff fee range
Creates a fee range. Answers 200 with the created row, not 201. Amounts are INTEGER MINOR units; percent_fee is a decimal rate between 0 and 1 and IS validated, so 1.5 is rejected with 400.
Authorization
bearerAuth In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Body of POST and PUT /v1/fx/tariffs/fees[/{id}] (models.FxTariffFeeInput). The previous spec pointed these at the RESPONSE schema. active is not part of this struct — it lives on BaseModel and the handler applies it separately when present.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/fx/tariffs/fees" \ -H "Content-Type: application/json" \ -d '{}'{
"min_range": 0,
"max_range": 0,
"fixed_fee": 0,
"percent_fee": 0.01,
"min_fee": 0,
"max_fee": 0,
"method": "fixed",
"base_currency": "67615cab-16f6-4751-af40-c6c0dbcaffe0",
"target_currency": "3b3e8109-66d3-4a6d-b9f1-d0865976f9f8",
"fx_tariff_id": "f12d958c-c80c-4752-862c-9e0c09506488",
"date_start": "2019-08-24T14:15:22Z",
"date_end": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_at": "2019-08-24T14:15:22Z",
"created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
"modified_at": "2019-08-24T14:15:22Z",
"modified_by": "e8d4374d-93a1-4e98-a6c6-fdcf00c5059f",
"active": true,
"metadata": {}
}{
"status": 409,
"message": "Spread rule overlaps an existing rule",
"code": "fx_m.spread_overlap",
"class": "business",
"retryable": false,
"details": [
{
"field": "percent_fee",
"rule": "lte",
"param": "1",
"message": "string"
}
]
}{
"status": 409,
"message": "Spread rule overlaps an existing rule",
"code": "fx_m.spread_overlap",
"class": "business",
"retryable": false,
"details": [
{
"field": "percent_fee",
"rule": "lte",
"param": "1",
"message": "string"
}
]
}{
"status": 403,
"message": "Access denied",
"code": "common.forbidden",
"class": "business"
}{
"status": 429,
"message": "Rate limit for 203.0.113.7 to GET:/v1/fx/rates exceeded.",
"code": "rate_limits_m.exceeded",
"class": "temporary",
"retryable": true
}{
"status": 409,
"message": "Spread rule overlaps an existing rule",
"code": "fx_m.spread_overlap",
"class": "business",
"retryable": false,
"details": [
{
"field": "percent_fee",
"rule": "lte",
"param": "1",
"message": "string"
}
]
}{
"overall_status": "unhealthy",
"message": "Service is shutting down",
"timestamp": "2026-08-27T15:04:05Z"
}Creates an FX tariff. Answers 200 with the created tariff, not 201. is_default is not settable here.
Operator-set default currency pair for FX conversion, read from app_config module `fx` (`convert.default_base` / `convert.default_target`) with YAML config fallback. Intended for customer frontends seeding a default FX pair. Only these two whitelisted paths are exposed; an unset default is returned as null, not as an error.