Error Handling
Use this page to understand:
- How API errors are structured
- How to use
code,message, anddoc_url
Error Response Body
| Field | Type | Description |
|---|---|---|
errors | array | List of one or more error objects. |
errors[].code | string | Stable machine-readable code for client handling. |
errors[].message | string | Human-readable detail of what failed. |
errors[].doc_url | string | Absolute URL to the matching error-code page (domain depends on deployed docs environment). |
Recommendation
Use code TODO ...
Error Code Directory
| Error code | HTTP status | Description |
|---|---|---|
parameter_invalid | 400 | One or more request parameters do not satisfy the expected schema. |
email_message_invalid_subject | 400 | The queued email subject exceeds the entity limit. |
queue_email_message_invalid_idempotency_key | 400 | The queued email idempotency key is blank or invalid. |
queue_email_message_internal_template_rendering_failed | 400 | The internal email template could not be rendered. |
duplicate_fund_in_target_allocation | 400 | The same ISIN appears more than once in a target allocation. |
duplicate_fund_in_switch | 400 | The same ISIN appears more than once in a switch. |
invalid_target_allocation | 400 | One target-allocation percentage fails validation. |
percentage_buy_legs_sum_is_not_10000_basis_points | 400 | The buy legs do not sum to 10000 basis points. |
percentage_target_allocation_is_not_10000_basis_points | 400 | The target allocation does not sum to 10000 basis points. |
self_investment_switch_compartment_is_not_self_invested | 400 | The compartment is not self-invested. |
self_investment_switch_position_is_unknown | 400 | A sell leg references an unknown current position. |
self_investment_switch_share_valuation_is_unknown | 400 | A switch leg references a fund without a known share valuation. |
attempt_to_sell_full_position_in_amount | 400 | A full-position sell leg was expressed as an amount. |
attempt_to_buy_in_amount_when_selling_full_position | 400 | A buy leg was expressed as an amount while selling a full position. |
legs_are_not_balanced | 400 | The sell and buy legs do not balance. |
insufficient_funds_in_percentage | 400 | The percentage sell exceeds the available position. |
unauthorized | 401 | Authentication is missing, invalid, or rejected. |
forbidden | 403 | The authenticated caller lacks permission for the operation. |
resource_not_found | 404 | The requested resource does not exist. |
compartment_not_found | 404 | The requested compartment does not exist. |
discretionary_manager_not_found | 404 | The requested discretionary manager does not exist. |
fund_not_found | 404 | The requested fund or ISIN does not exist. |
mandate_not_found | 404 | The requested mandate does not exist. |
conflict | 409 | The request could not be completed because of a state conflict. |
discretionary_manager_already_exists | 409 | A discretionary manager with the same ID already exists. |
mandate_already_exists | 409 | A mandate with the same ID already exists. |
self_investment_target_allocation_compartment_is_not_self_invested | 409 | The compartment is not self-invested. |
delegate_compartment_to_mandate_compartment_is_not_self_invested | 409 | The compartment is not self-invested. |
switch_already_exists | 409 | A switch with the same ID already exists. |
target_allocation_already_exists | 409 | A target allocation with the same ID already exists. |
remaining_position_might_be_lower_than_1_share_value | 422 | The remaining position would fall below the minimum share value. |
position_after_buying_would_be_lower_than_1_share_value | 422 | The resulting position would fall below the minimum share value. |
insufficient_funds | 422 | The sell amount is larger than the current position. |
position_might_be_insufficient_due_to_market_drop_down | 422 | The switch sells too much of the position to stay safe against market movement. |
delegate_compartment_to_mandate_mandate_has_no_target_allocation | 422 | The mandate has no target allocation yet. |
unprocessable_content | 422 | The request body is syntactically valid but violates endpoint-specific business rules. |
database_query_timeout | 500 | A database query timed out while handling the request. |
internal_server_error | 500 | An unexpected server-side error occurred. |
unexpected_error | 500 | An unexpected server-side error occurred. |
missing_admin_notification_recipients | 400 | The emailing service has no admin notification recipients configured. |
invalid_admin_notification_from_email | 400 | The admin notification sender email is missing or blank. |
invalid_idempotency_key | 400 | The admin notification idempotency key is blank. |
email_message_not_found | 404 | The requested queued email message does not exist. |
queue_admin_notification_unexpected_error | 500 | The admin notification pipeline failed unexpectedly. |
payer_invalid_email | 422 | The email address provided for the payer could not be validated. |
payer_invalid_phone_number | 422 | The phone number provided for the payer could not be validated. |
payer_subscriber_not_found | 404 | The subscriber referenced when creating a payer does not exist. |
payer_not_found | 404 | The requested payer does not exist. |
direct_debit_not_found | 404 | The requested direct debit does not exist or is not in FAILED status. |
policy_virtual_iban_not_found | 404 | The requested policy does not exist, so its virtual IBAN cannot be returned. |
suspense_account_transfer_not_found | 404 | The requested suspense account transfer does not exist. |
payer_personal_iban_already_registered | 409 | The IBAN is already registered for this payer during payer creation. |
payer_human_id_generation_failed | 500 | The system could not generate a human-readable identifier for the new payer. |
payer_created_event_store_failed | 500 | The system could not persist the PayerCreated event. |
broker_not_found | 404 | The broker referenced by the authenticated broker identity does not exist. |
broker_not_found_by_payer_id | 404 | The broker associated with the payer's subscriber could not be found. |
personal_iban_not_found | 404 | The requested personal IBAN does not exist for the payer. |
register_payer_personal_iban_invalid_iban | 422 | The IBAN provided for registration does not pass validation. |
register_payer_personal_iban_unauthorized_country | 422 | The IBAN's country is not authorized for registration. |
register_payer_personal_iban_already_registered | 409 | The IBAN is already registered for this payer. |
callback_url_already_registered_for_broker | 409 | The callback URL is already registered for this broker. |
register_payer_personal_iban_event_store_failed | 500 | Could not persist the event after registering the personal IBAN. |
delete_payer_personal_iban_has_premium_request | 409 | The IBAN is associated with one or more premium requests. |
delete_payer_personal_iban_default_iban | 409 | The IBAN is set as the default IBAN and cannot be deleted. |
delete_payer_personal_iban_event_store_failed | 500 | Could not persist the event after deleting the personal IBAN. |
single_premium_request_details_not_found | 404 | The requested single premium request details were not found. |
single_premium_request_not_found | 404 | The requested single premium request does not exist. Used by repository/internal code, not current premium-scheduling HTTP responses. |
single_premium_request_not_pending | 404 / 409 | The single premium request is no longer in PENDING status. |
single_premium_request_compartment_not_found | 404 | The compartment referenced when creating a single premium request does not exist. |
single_premium_request_payer_belongs_to_another_subscriber | 403 | The payer belongs to a different subscriber. |
recurring_premium_request_not_found | 404 | The requested recurring premium request does not exist. |
recurring_premium_request_occurrence_not_found | 404 | The recurring premium request occurrence was not found. |
recurring_premium_request_payer_iban_not_found | 404 | The payer IBAN was not found when creating a recurring premium request. |
recurring_premium_request_payer_belongs_to_another_subscriber | 403 | The payer belongs to a different subscriber. |
recurring_premium_request_invalid_periodicity_unit | 400 | The periodicity unit is invalid. |
recurring_premium_request_invalid_periodicity_value | 400 | The periodicity value is invalid. |
recurring_premium_request_invalid_day_of_month | 400 | The day of month is invalid. |
HTTP Status Code Reference
| HTTP status | Meaning in current API behavior |
|---|---|
200 OK | Successful cancellation response |
201 Created | Resource created successfully |
400 Bad Request | Request validation or client input error |
401 Unauthorized | Missing or invalid authentication |
403 Forbidden | Authenticated caller lacks required permission or claim |
404 Not Found | Referenced entity or request does not exist |
409 Conflict | Operation rejected due to state conflict |
422 Unprocessable Content | Request is valid JSON but violates business rules |
500 Internal Server Error | Unexpected server error |