Create an interest-tier schedule
Creates a dated set of balance-banded APRs on a credit product. Send contiguous tiers with min_balance, max_balance, and apr as a decimal string of basis points. A range that overlaps another schedule on the same product returns 409. Send Idempotency-Key so retries return the original schedule instead of creating a second one.
Authentication & Headers
| Header | Type | Requirement | Description |
|---|---|---|---|
| Authorization | string | REQUIRED | API key passed as an HTTP Bearer token: Bearer rk_live_... |
| X-Program-ID | UUID | PROGRAM-SCOPED | Program boundary UUID that scopes the issuing card, wallet, or transfer. |
| Content-Type | string | REQUIRED | Must be application/json. |
| Idempotency-Key | string | OPTIONAL | Unique UUID to prevent duplicate execution of financial creations or mutations. |
Request Body Schema
application/jsonCredit product this schedule belongs to. Same value as the Product `id`.
Display name of this schedule.
First calendar day this schedule is in force, in the program timezone.
Last calendar day this schedule is in force, inclusive. Null or omitted for an open-ended range.
Ordered balance bands. The first `min_balance.amount` is `0`. Each subsequent `min_balance` equals the previous `max_balance`. The last tier's `max_balance` is null.
Response Codes & Schemas
{
"id": "8c1f5a29-3e6b-4d47-b9a2-7e4d0c8f1358",
"object": "interest_tier_schedule",
"credit_product_id": "3f0c7a12-5d8e-4a91-b6c2-9e1f0a4d7c33",
"name": "Standard revolving",
"effective_from": "2026-01-01",
"effective_to": null,
"tiers": [
{
"min_balance": {
"amount": 0,
"currency": "USD"
},
"max_balance": {
"amount": 100000,
"currency": "USD"
},
"apr": "1499.0000"
},
{
"min_balance": {
"amount": 100000,
"currency": "USD"
},
"max_balance": {
"amount": 500000,
"currency": "USD"
},
"apr": "1899.0000"
},
{
"min_balance": {
"amount": 500000,
"currency": "USD"
},
"max_balance": null,
"apr": "2499.0000"
}
],
"created_at": "2026-01-02T16:20:00Z",
"updated_at": "2026-01-02T16:20:00Z"
}{
"error": {
"type": "invalid_request_error",
"code": "invalid_request",
"message": "invalid order by: foo. Valid options are: [created_at updated_at]",
"param": "order_by",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/invalid_request"
}
}{
"error": {
"type": "authentication_error",
"code": "authentication_error",
"message": "A valid API key is required.",
"param": null,
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/authentication_error"
}
}{
"error": {
"type": "permission_error",
"code": "permission_denied",
"message": "The API key cannot access this program.",
"param": "X-Program-ID",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/permission_denied"
}
}{
"error": {
"type": "not_found_error",
"code": "not_found",
"message": "No card found for the given id.",
"param": "card_id",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/not_found"
}
}{
"error": {
"type": "conflict_error",
"code": "conflict",
"message": "The card cannot be reissued from its current state.",
"param": null,
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/conflict"
}
}{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after the number of seconds in Retry-After.",
"param": null,
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/rate_limited"
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "An unexpected error occurred. Retry with the same Idempotency-Key.",
"param": null,
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"doc_url": "https://docs.rookpayments.com/errors/internal_error"
}
}