From 2a03e409e59c78c7a98badb664bf5e26d700395b Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Mon, 5 Jan 2026 23:19:15 -0800 Subject: [PATCH] Add a destination_types endpoint which can list cached rates, required fields, etc. --- mintlify/openapi.yaml | 293 ++++++++++++++++++ openapi.yaml | 293 ++++++++++++++++++ .../receiver/DestinationFieldDefinition.yaml | 63 ++++ .../schemas/receiver/DestinationTypeInfo.yaml | 57 ++++ openapi/openapi.yaml | 2 + .../receiver_destination_types.yaml | 196 ++++++++++++ 6 files changed, 904 insertions(+) create mode 100644 openapi/components/schemas/receiver/DestinationFieldDefinition.yaml create mode 100644 openapi/components/schemas/receiver/DestinationTypeInfo.yaml create mode 100644 openapi/paths/receiver/destination_types/receiver_destination_types.yaml diff --git a/mintlify/openapi.yaml b/mintlify/openapi.yaml index 6570afe..ee7fdce 100644 --- a/mintlify/openapi.yaml +++ b/mintlify/openapi.yaml @@ -1792,6 +1792,189 @@ paths: application/json: schema: $ref: '#/components/schemas/Error500' + /receiver/destination-types: + get: + summary: Get available destination types + description: | + Retrieve available destination types for sending payments, including the required fields for each destination type and estimated exchange rates from a specified sending currency. + This endpoint provides enough information to render a form in the UI to collect the necessary data from the sender for each destination type. Each destination type includes field definitions with schemas including type and validation formats. + Returns a list of destination type configurations. Each destination type and currency pair is unique in the list, but the same destination type may appear multiple times with different receiving currencies. + operationId: getDestinationTypes + tags: + - Cross-Currency Transfers + security: + - BasicAuth: [] + parameters: + - name: sendingCurrency + in: query + description: | + The currency code (ISO 4217) that will be sent from. Required to calculate estimated exchange rates for each destination type. + required: true + schema: + type: string + example: USD + - name: destinationType + in: query + description: | + Optional filter to return only a specific destination type. If not provided, all available destination types will be returned. + required: false + schema: + $ref: '#/components/schemas/BankAccountOrWalletType' + example: US_ACCOUNT + - name: receivingCurrency + in: query + description: | + Optional filter to return only destination types that support the specified receiving currency code (ISO 4217). If not provided, all supported currencies will be returned. + required: false + schema: + type: string + example: EUR + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: array + description: | + List of destination type configurations. Each destination type and currency pair is unique, but the same destination type may appear multiple times with different receiving currencies. + items: + $ref: '#/components/schemas/DestinationTypeInfo' + example: + - destinationType: US_ACCOUNT + requiredPayeeDataFields: + - name: accountNumber + type: string + description: US bank account number + required: true + example: '123456789' + - name: routingNumber + type: string + description: ACH routing number (9 digits) + required: true + pattern: ^[0-9]{9}$ + minLength: 9 + maxLength: 9 + example: '987654321' + - name: accountCategory + type: string + description: Type of account (checking or savings) + required: true + enum: + - CHECKING + - SAVINGS + example: CHECKING + - name: bankName + type: string + description: Name of the bank + required: false + example: Chase Bank + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + - name: COUNTRY_OF_RESIDENCE + mandatory: true + estimatedExchangeRate: 1 + receivingCurrency: + code: USD + name: United States Dollar + symbol: $ + decimals: 2 + minAmount: 100 + maxAmount: 1000000 + - destinationType: IBAN + requiredPayeeDataFields: + - name: iban + type: string + description: International Bank Account Number + required: true + minLength: 15 + maxLength: 34 + example: DE89370400440532013000 + - name: swiftBic + type: string + description: SWIFT/BIC code (8 or 11 characters) + required: true + minLength: 8 + maxLength: 11 + example: DEUTDEFF + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + - name: BIRTH_DATE + mandatory: true + - name: NATIONALITY + mandatory: false + estimatedExchangeRate: 0.92 + receivingCurrency: + code: EUR + name: Euro + symbol: € + decimals: 2 + minAmount: 1 + maxAmount: 1000000 + - destinationType: SPARK_WALLET + requiredPayeeDataFields: + - name: address + type: string + description: Spark wallet address + required: true + example: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu + - name: assetType + type: string + description: Type of asset + required: true + enum: + - BTC + - USDB + example: BTC + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + estimatedExchangeRate: 0.000023 + receivingCurrency: + code: BTC + name: Bitcoin + symbol: ₿ + decimals: 8 + minAmount: 1000 + maxAmount: 100000000 + - destinationType: SPARK_WALLET + requiredPayeeDataFields: + - name: address + type: string + description: Spark wallet address + required: true + example: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + estimatedExchangeRate: 1 + receivingCurrency: + code: USDC + name: USD Coin + symbol: $ + decimals: 6 + minAmount: 100 + maxAmount: 1000000 + '400': + description: Bad request - Missing or invalid parameters + content: + application/json: + schema: + $ref: '#/components/schemas/Error400' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error401' + '500': + description: Internal service error + content: + application/json: + schema: + $ref: '#/components/schemas/Error500' /quotes/{quoteId}: get: summary: Get quote by ID @@ -6308,6 +6491,116 @@ components: details: type: object description: Additional error details + DestinationFieldDefinition: + type: object + required: + - name + - type + - required + properties: + name: + type: string + description: The name of the field (e.g., "accountNumber", "routingNumber", "iban") + example: accountNumber + type: + type: string + enum: + - string + - integer + - number + - boolean + description: The data type of the field + example: string + description: + type: string + description: Human-readable description of what this field represents + example: US bank account number + required: + type: boolean + description: Whether this field is required to send to this destination type + example: true + pattern: + type: string + description: | + Regular expression pattern for string validation. Only applicable for string type fields. + example: ^[0-9]{9}$ + minLength: + type: integer + description: Minimum length for string fields + minimum: 0 + example: 9 + maxLength: + type: integer + description: Maximum length for string fields + minimum: 0 + example: 9 + minimum: + type: number + description: Minimum value for numeric fields + maximum: + type: number + description: Maximum value for numeric fields + enum: + type: array + description: | + Array of allowed values for this field. If provided, the field value must be one of these values. + items: + type: string + example: + - CHECKING + - SAVINGS + example: + type: string + description: Example value for this field + example: '123456789' + DestinationTypeInfo: + type: object + required: + - destinationType + - requiredPayeeDataFields + - estimatedExchangeRate + - receivingCurrency + - minAmount + - maxAmount + properties: + destinationType: + $ref: '#/components/schemas/BankAccountOrWalletType' + description: The destination type identifier + requiredPayeeDataFields: + type: array + description: | + Array of field definitions required to send to this destination type. Each field includes schema information (type, validation patterns, etc.) sufficient to render a form in the UI. + items: + $ref: '#/components/schemas/DestinationFieldDefinition' + requiredPayerDataFields: + type: array + description: Fields required about the payer in order to send to this destination type. These can either be pulled from the sending customer data model, or provided during the quote request. + items: + $ref: '#/components/schemas/CounterpartyFieldDefinition' + estimatedExchangeRate: + type: number + format: double + description: | + Estimated exchange rate from the sending currency to the receiving currency for this destination type. This is not a locked rate and is subject to change when calling the quotes endpoint. + exclusiveMinimum: 0 + example: 1.08 + receivingCurrency: + $ref: '#/components/schemas/Currency' + description: The currency that will be received at this destination type + minAmount: + type: integer + format: int64 + description: | + Minimum amount that can be sent to this destination type in the smallest unit of the sending currency (e.g. cents). + exclusiveMinimum: 0 + example: 100 + maxAmount: + type: integer + format: int64 + description: | + Maximum amount that can be sent to this destination type in the smallest unit of the sending currency (e.g. cents). + exclusiveMinimum: 0 + example: 1000000 QuoteSource: oneOf: - title: Account diff --git a/openapi.yaml b/openapi.yaml index 6570afe..ee7fdce 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -1792,6 +1792,189 @@ paths: application/json: schema: $ref: '#/components/schemas/Error500' + /receiver/destination-types: + get: + summary: Get available destination types + description: | + Retrieve available destination types for sending payments, including the required fields for each destination type and estimated exchange rates from a specified sending currency. + This endpoint provides enough information to render a form in the UI to collect the necessary data from the sender for each destination type. Each destination type includes field definitions with schemas including type and validation formats. + Returns a list of destination type configurations. Each destination type and currency pair is unique in the list, but the same destination type may appear multiple times with different receiving currencies. + operationId: getDestinationTypes + tags: + - Cross-Currency Transfers + security: + - BasicAuth: [] + parameters: + - name: sendingCurrency + in: query + description: | + The currency code (ISO 4217) that will be sent from. Required to calculate estimated exchange rates for each destination type. + required: true + schema: + type: string + example: USD + - name: destinationType + in: query + description: | + Optional filter to return only a specific destination type. If not provided, all available destination types will be returned. + required: false + schema: + $ref: '#/components/schemas/BankAccountOrWalletType' + example: US_ACCOUNT + - name: receivingCurrency + in: query + description: | + Optional filter to return only destination types that support the specified receiving currency code (ISO 4217). If not provided, all supported currencies will be returned. + required: false + schema: + type: string + example: EUR + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: array + description: | + List of destination type configurations. Each destination type and currency pair is unique, but the same destination type may appear multiple times with different receiving currencies. + items: + $ref: '#/components/schemas/DestinationTypeInfo' + example: + - destinationType: US_ACCOUNT + requiredPayeeDataFields: + - name: accountNumber + type: string + description: US bank account number + required: true + example: '123456789' + - name: routingNumber + type: string + description: ACH routing number (9 digits) + required: true + pattern: ^[0-9]{9}$ + minLength: 9 + maxLength: 9 + example: '987654321' + - name: accountCategory + type: string + description: Type of account (checking or savings) + required: true + enum: + - CHECKING + - SAVINGS + example: CHECKING + - name: bankName + type: string + description: Name of the bank + required: false + example: Chase Bank + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + - name: COUNTRY_OF_RESIDENCE + mandatory: true + estimatedExchangeRate: 1 + receivingCurrency: + code: USD + name: United States Dollar + symbol: $ + decimals: 2 + minAmount: 100 + maxAmount: 1000000 + - destinationType: IBAN + requiredPayeeDataFields: + - name: iban + type: string + description: International Bank Account Number + required: true + minLength: 15 + maxLength: 34 + example: DE89370400440532013000 + - name: swiftBic + type: string + description: SWIFT/BIC code (8 or 11 characters) + required: true + minLength: 8 + maxLength: 11 + example: DEUTDEFF + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + - name: BIRTH_DATE + mandatory: true + - name: NATIONALITY + mandatory: false + estimatedExchangeRate: 0.92 + receivingCurrency: + code: EUR + name: Euro + symbol: € + decimals: 2 + minAmount: 1 + maxAmount: 1000000 + - destinationType: SPARK_WALLET + requiredPayeeDataFields: + - name: address + type: string + description: Spark wallet address + required: true + example: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu + - name: assetType + type: string + description: Type of asset + required: true + enum: + - BTC + - USDB + example: BTC + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + estimatedExchangeRate: 0.000023 + receivingCurrency: + code: BTC + name: Bitcoin + symbol: ₿ + decimals: 8 + minAmount: 1000 + maxAmount: 100000000 + - destinationType: SPARK_WALLET + requiredPayeeDataFields: + - name: address + type: string + description: Spark wallet address + required: true + example: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + estimatedExchangeRate: 1 + receivingCurrency: + code: USDC + name: USD Coin + symbol: $ + decimals: 6 + minAmount: 100 + maxAmount: 1000000 + '400': + description: Bad request - Missing or invalid parameters + content: + application/json: + schema: + $ref: '#/components/schemas/Error400' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error401' + '500': + description: Internal service error + content: + application/json: + schema: + $ref: '#/components/schemas/Error500' /quotes/{quoteId}: get: summary: Get quote by ID @@ -6308,6 +6491,116 @@ components: details: type: object description: Additional error details + DestinationFieldDefinition: + type: object + required: + - name + - type + - required + properties: + name: + type: string + description: The name of the field (e.g., "accountNumber", "routingNumber", "iban") + example: accountNumber + type: + type: string + enum: + - string + - integer + - number + - boolean + description: The data type of the field + example: string + description: + type: string + description: Human-readable description of what this field represents + example: US bank account number + required: + type: boolean + description: Whether this field is required to send to this destination type + example: true + pattern: + type: string + description: | + Regular expression pattern for string validation. Only applicable for string type fields. + example: ^[0-9]{9}$ + minLength: + type: integer + description: Minimum length for string fields + minimum: 0 + example: 9 + maxLength: + type: integer + description: Maximum length for string fields + minimum: 0 + example: 9 + minimum: + type: number + description: Minimum value for numeric fields + maximum: + type: number + description: Maximum value for numeric fields + enum: + type: array + description: | + Array of allowed values for this field. If provided, the field value must be one of these values. + items: + type: string + example: + - CHECKING + - SAVINGS + example: + type: string + description: Example value for this field + example: '123456789' + DestinationTypeInfo: + type: object + required: + - destinationType + - requiredPayeeDataFields + - estimatedExchangeRate + - receivingCurrency + - minAmount + - maxAmount + properties: + destinationType: + $ref: '#/components/schemas/BankAccountOrWalletType' + description: The destination type identifier + requiredPayeeDataFields: + type: array + description: | + Array of field definitions required to send to this destination type. Each field includes schema information (type, validation patterns, etc.) sufficient to render a form in the UI. + items: + $ref: '#/components/schemas/DestinationFieldDefinition' + requiredPayerDataFields: + type: array + description: Fields required about the payer in order to send to this destination type. These can either be pulled from the sending customer data model, or provided during the quote request. + items: + $ref: '#/components/schemas/CounterpartyFieldDefinition' + estimatedExchangeRate: + type: number + format: double + description: | + Estimated exchange rate from the sending currency to the receiving currency for this destination type. This is not a locked rate and is subject to change when calling the quotes endpoint. + exclusiveMinimum: 0 + example: 1.08 + receivingCurrency: + $ref: '#/components/schemas/Currency' + description: The currency that will be received at this destination type + minAmount: + type: integer + format: int64 + description: | + Minimum amount that can be sent to this destination type in the smallest unit of the sending currency (e.g. cents). + exclusiveMinimum: 0 + example: 100 + maxAmount: + type: integer + format: int64 + description: | + Maximum amount that can be sent to this destination type in the smallest unit of the sending currency (e.g. cents). + exclusiveMinimum: 0 + example: 1000000 QuoteSource: oneOf: - title: Account diff --git a/openapi/components/schemas/receiver/DestinationFieldDefinition.yaml b/openapi/components/schemas/receiver/DestinationFieldDefinition.yaml new file mode 100644 index 0000000..71c91f4 --- /dev/null +++ b/openapi/components/schemas/receiver/DestinationFieldDefinition.yaml @@ -0,0 +1,63 @@ +type: object +required: + - name + - type + - required +properties: + name: + type: string + description: The name of the field (e.g., "accountNumber", "routingNumber", "iban") + example: accountNumber + type: + type: string + enum: + - string + - integer + - number + - boolean + description: The data type of the field + example: string + description: + type: string + description: Human-readable description of what this field represents + example: US bank account number + required: + type: boolean + description: Whether this field is required to send to this destination type + example: true + pattern: + type: string + description: > + Regular expression pattern for string validation. Only applicable for string type fields. + example: ^[0-9]{9}$ + minLength: + type: integer + description: Minimum length for string fields + minimum: 0 + example: 9 + maxLength: + type: integer + description: Maximum length for string fields + minimum: 0 + example: 9 + minimum: + type: number + description: Minimum value for numeric fields + maximum: + type: number + description: Maximum value for numeric fields + enum: + type: array + description: > + Array of allowed values for this field. If provided, the field value must be + one of these values. + items: + type: string + example: + - CHECKING + - SAVINGS + example: + type: string + description: Example value for this field + example: '123456789' + diff --git a/openapi/components/schemas/receiver/DestinationTypeInfo.yaml b/openapi/components/schemas/receiver/DestinationTypeInfo.yaml new file mode 100644 index 0000000..9b1e72f --- /dev/null +++ b/openapi/components/schemas/receiver/DestinationTypeInfo.yaml @@ -0,0 +1,57 @@ +type: object +required: + - destinationType + - requiredPayeeDataFields + - estimatedExchangeRate + - receivingCurrency + - minAmount + - maxAmount +properties: + destinationType: + $ref: ../common/BankAccountOrWalletType.yaml + description: The destination type identifier + requiredPayeeDataFields: + type: array + description: > + Array of field definitions required to send to this destination type. + Each field includes schema information (type, validation patterns, etc.) + sufficient to render a form in the UI. + items: + $ref: ../receiver/DestinationFieldDefinition.yaml + requiredPayerDataFields: + type: array + description: >- + Fields required about the payer in order to send to this destination type. + These can either be pulled from the sending customer data model, or provided + during the quote request. + items: + $ref: ../common/CounterpartyFieldDefinition.yaml + estimatedExchangeRate: + type: number + format: double + description: > + Estimated exchange rate from the sending currency to the receiving currency + for this destination type. This is not a locked rate and is subject to change + when calling the quotes endpoint. + exclusiveMinimum: 0 + example: 1.08 + receivingCurrency: + $ref: ../common/Currency.yaml + description: The currency that will be received at this destination type + minAmount: + type: integer + format: int64 + description: > + Minimum amount that can be sent to this destination type in the smallest + unit of the sending currency (e.g. cents). + exclusiveMinimum: 0 + example: 100 + maxAmount: + type: integer + format: int64 + description: > + Maximum amount that can be sent to this destination type in the smallest + unit of the sending currency (e.g. cents). + exclusiveMinimum: 0 + example: 1000000 + diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index c2fb262..dccbe2d 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -100,6 +100,8 @@ paths: $ref: paths/receiver/external-account/receiver_external-account_{accountId}.yaml /receiver/destination-identifier: $ref: paths/receiver/destination-identifier/receiver_destination-identifier.yaml + /receiver/destination-types: + $ref: paths/receiver/destination_types/receiver_destination_types.yaml /quotes/{quoteId}: $ref: paths/quotes/quotes_{quoteId}.yaml /quotes: diff --git a/openapi/paths/receiver/destination_types/receiver_destination_types.yaml b/openapi/paths/receiver/destination_types/receiver_destination_types.yaml new file mode 100644 index 0000000..4052672 --- /dev/null +++ b/openapi/paths/receiver/destination_types/receiver_destination_types.yaml @@ -0,0 +1,196 @@ +get: + summary: Get available destination types + description: > + Retrieve available destination types for sending payments, including the required fields + for each destination type and estimated exchange rates from a specified sending currency. + + This endpoint provides enough information to render a form in the UI to collect the necessary + data from the sender for each destination type. Each destination type includes field definitions + with schemas including type and validation formats. + + Returns a list of destination type configurations. Each destination type and currency pair + is unique in the list, but the same destination type may appear multiple times with different + receiving currencies. + operationId: getDestinationTypes + tags: + - Cross-Currency Transfers + security: + - BasicAuth: [] + parameters: + - name: sendingCurrency + in: query + description: > + The currency code (ISO 4217) that will be sent from. Required to calculate + estimated exchange rates for each destination type. + required: true + schema: + type: string + example: USD + - name: destinationType + in: query + description: > + Optional filter to return only a specific destination type. If not provided, + all available destination types will be returned. + required: false + schema: + $ref: ../../../components/schemas/common/BankAccountOrWalletType.yaml + example: US_ACCOUNT + - name: receivingCurrency + in: query + description: > + Optional filter to return only destination types that support the specified + receiving currency code (ISO 4217). If not provided, all supported currencies + will be returned. + required: false + schema: + type: string + example: EUR + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: array + description: > + List of destination type configurations. Each destination type and currency + pair is unique, but the same destination type may appear multiple times with + different receiving currencies. + items: + $ref: ../../../components/schemas/receiver/DestinationTypeInfo.yaml + example: + - destinationType: US_ACCOUNT + requiredPayeeDataFields: + - name: accountNumber + type: string + description: US bank account number + required: true + example: '123456789' + - name: routingNumber + type: string + description: ACH routing number (9 digits) + required: true + pattern: ^[0-9]{9}$ + minLength: 9 + maxLength: 9 + example: '987654321' + - name: accountCategory + type: string + description: Type of account (checking or savings) + required: true + enum: + - CHECKING + - SAVINGS + example: CHECKING + - name: bankName + type: string + description: Name of the bank + required: false + example: Chase Bank + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + - name: COUNTRY_OF_RESIDENCE + mandatory: true + estimatedExchangeRate: 1.0 + receivingCurrency: + code: USD + name: United States Dollar + symbol: $ + decimals: 2 + minAmount: 100 + maxAmount: 1000000 + - destinationType: IBAN + requiredPayeeDataFields: + - name: iban + type: string + description: International Bank Account Number + required: true + minLength: 15 + maxLength: 34 + example: DE89370400440532013000 + - name: swiftBic + type: string + description: SWIFT/BIC code (8 or 11 characters) + required: true + minLength: 8 + maxLength: 11 + example: DEUTDEFF + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + - name: BIRTH_DATE + mandatory: true + - name: NATIONALITY + mandatory: false + estimatedExchangeRate: 0.92 + receivingCurrency: + code: EUR + name: Euro + symbol: € + decimals: 2 + minAmount: 1 + maxAmount: 1000000 + - destinationType: SPARK_WALLET + requiredPayeeDataFields: + - name: address + type: string + description: Spark wallet address + required: true + example: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu + - name: assetType + type: string + description: Type of asset + required: true + enum: + - BTC + - USDB + example: BTC + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + estimatedExchangeRate: 0.000023 + receivingCurrency: + code: BTC + name: Bitcoin + symbol: ₿ + decimals: 8 + minAmount: 1000 + maxAmount: 100000000 + - destinationType: SPARK_WALLET + requiredPayeeDataFields: + - name: address + type: string + description: Spark wallet address + required: true + example: spark1pgssyuuuhnrrdjswal5c3s3rafw9w3y5dd4cjy3duxlf7hjzkp0rqx6dj6mrhu + requiredPayerDataFields: + - name: FULL_NAME + mandatory: true + estimatedExchangeRate: 1.0 + receivingCurrency: + code: USDC + name: USD Coin + symbol: $ + decimals: 6 + minAmount: 100 + maxAmount: 1000000 + '400': + description: Bad request - Missing or invalid parameters + content: + application/json: + schema: + $ref: ../../../components/schemas/errors/Error400.yaml + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: ../../../components/schemas/errors/Error401.yaml + '500': + description: Internal service error + content: + application/json: + schema: + $ref: ../../../components/schemas/errors/Error500.yaml +