openapi: 3.2.0 info: title: Global Accounts API version: 1.0.0 description: "## API idempotency \nEach `POST` request creating a resource (for example a transaction) requires to send a unique idempotency key. It is included in the `Idempotency-Key` HTTP header. Idempotency key helps prevent duplicates in your `POST` requests. We recommend using an **UUID** for the key, however you may use any other unique identifier you choose.\n\n#### Preventing duplicates \nIf we have already processed the request and you send a request using the same idempotency key, it will fail with an error, returning a ```409 Conflict``` response.\n\n## Case-sensitivity\nAll properties/keys within request's/response's payload are case-sensitive.\n\nHTTP headers' names are case-insensitive.\n\n## API base URL\n**Sandbox: [https://accounts.sandbox.volt.io]()**\n\n**Production: [https://accounts.volt.io]()**" contact: email: support@volt.io name: Volt Support url: https://www.volt.io/contact/ servers: - url: https://accounts.sandbox.volt.io description: Sandbox - url: https://accounts.volt.io description: Production security: - BearerAuth: [] tags: - name: Accounts description: Management of accounts. paths: /accounts: get: summary: List of accounts operationId: get-accounts tags: - Accounts parameters: - $ref: '#/components/parameters/XVoltApiVersion' - $ref: '#/components/parameters/LimitParam' - $ref: '#/components/parameters/PageParam' - in: query name: currency[] schema: type: array description: Filter by Currency. items: $ref: '#/components/schemas/CurrencyCode' example: - EUR - in: query name: active description: Filter by Active. schema: type: boolean responses: '200': description: Retrieve accounts list. headers: limit: $ref: '#/components/headers/PaginationLimit' page: $ref: '#/components/headers/PaginationPage' page-count: $ref: '#/components/headers/PaginationPageCount' total-items: $ref: '#/components/headers/PaginationTotalItems' content: application/json: schema: type: array items: $ref: '#/components/schemas/AccountMinimalDetails' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '405': $ref: '#/components/responses/405' '406': $ref: '#/components/responses/406' '415': $ref: '#/components/responses/415' '422': $ref: '#/components/responses/422' '500': $ref: '#/components/responses/500' /accounts/{accountId}: get: tags: - Accounts summary: Get account details operationId: get-account-details parameters: - $ref: '#/components/parameters/XVoltApiVersion' - name: accountId in: path required: true schema: type: string format: uuid description: Unique identifier of the account. responses: '200': description: Successful account details response. content: application/json: schema: $ref: '#/components/schemas/AccountDetails' example: id: 7523a8d3-70a9-4448-822a-ba1a38e0b715 currency: EUR identifications: - iban: DE33500105173822933531 bic: ALBPPLPW name: My EUR account active: true country: DK balance: available: 123 timestamp: '2023-10-16T16:52:37+00:00' type: VOLT_ACCOUNT '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '404': $ref: '#/components/responses/404' '405': $ref: '#/components/responses/405' '406': $ref: '#/components/responses/406' '415': $ref: '#/components/responses/415' '422': $ref: '#/components/responses/422' '500': $ref: '#/components/responses/500' /accounts/{accountId}/close: post: tags: - Accounts summary: Close account operationId: close-account description: Immediately closes the specified account. A closed account cannot be reopened or used for further transactions. Only Named Accounts can be closed. parameters: - $ref: '#/components/parameters/IdempotencyKey' - $ref: '#/components/parameters/XVoltApiVersion' - name: accountId in: path required: true schema: type: string format: uuid description: Unique identifier of the account to be closed. requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/AccountCloseRequest' responses: '200': description: Account successfully closed. '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '404': $ref: '#/components/responses/404' '405': $ref: '#/components/responses/405' '406': $ref: '#/components/responses/406' '409': $ref: '#/components/responses/409' '415': $ref: '#/components/responses/415' '422': $ref: '#/components/responses/422' '500': $ref: '#/components/responses/500' /accounts/{accountId}/beneficiaries: get: summary: List of transaction beneficiaries operationId: get-account-beneficiaries tags: - Accounts parameters: - $ref: '#/components/parameters/XVoltApiVersion' - $ref: '#/components/parameters/LimitParam' - $ref: '#/components/parameters/PageParam' - name: accountId in: path required: true schema: type: string format: uuid description: Unique identifier of the account - in: query name: iban schema: type: string example: DE07500105176551562526 description: Filter by IBAN. - in: query name: sortCode schema: type: string example: 12345678 description: Filter by SortCode number. - in: query name: accountNumber schema: type: string example: 12345678 description: Filter by Account number. - in: query name: order[createdAt] description: Sort order by createdAt field. schema: allOf: - $ref: '#/components/schemas/SortOrder' default: desc responses: '200': description: List of account beneficiaries headers: limit: $ref: '#/components/headers/PaginationLimit' page: $ref: '#/components/headers/PaginationPage' page-count: $ref: '#/components/headers/PaginationPageCount' total-items: $ref: '#/components/headers/PaginationTotalItems' content: application/json: schema: type: array items: $ref: '#/components/schemas/AccountBeneficiaryMinimalDetails' example: - name: John Doe accountIdentifiers: iban: DE07500105176551562526 swiftBic: '123456' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '404': $ref: '#/components/responses/404' '405': $ref: '#/components/responses/405' '406': $ref: '#/components/responses/406' '415': $ref: '#/components/responses/415' '422': $ref: '#/components/responses/422' '500': $ref: '#/components/responses/500' components: schemas: Error401Response: type: object description: Error response for HTTP 401 Unauthorized. properties: code: type: string description: Error code. enum: - UNAUTHORISED message: type: string description: Error message. required: - code - message AccountStatusEnum: type: string description: The current status of the account. enum: - ACTIVE - SUSPENDED - CLOSED Error403Response: type: object description: Error response for HTTP 403 Forbidden. properties: code: type: string description: Error code. enum: - ACCESS_DENIED message: type: string description: Error message. required: - code - message AccountBeneficiaryMinimalDetails: type: object properties: name: type: string description: Name of the beneficiary example: John Doe accountIdentifiers: $ref: accounts-common.yaml#/components/schemas/AccountIdentifier AccountBalance: type: object description: The account balance in minor units. properties: available: type: integer format: int64 timestamp: type: string format: date-time AccountCloseRequest: type: object properties: communication: $ref: '#/components/schemas/Communication' AccountHolderMinimalDetails: type: object required: - entityId - legalName properties: entityId: $ref: '#/components/schemas/AccountHolderEntityId' legalName: type: string description: Full name or legal entity name of the account holder as registered with the bank. Error500Response: type: object description: Error response for HTTP 500 Internal Server Error. properties: code: type: string description: Error code. enum: - INTERNAL_SERVER_ERROR message: type: string description: Error message. required: - code - message Communication: type: object properties: notifications: type: object description: Settings for webhook notifications delivery. properties: url: type: string pattern: ^https?://[^ ]+$ description: URL where the notifications (webhooks) are going to be sent when the transaction status changes. This value will take precedence over Fuzebox configuration. Provide a value here only if you need to overwrite it. Note that a default notifications URL must be configured in Fuzebox for notifications to be delivered; if it is not configured, no notification will be sent even when this overwrite URL is provided. example: https://mywebsite.com/webhooks AccountDetails: type: object allOf: - $ref: '#/components/schemas/AccountMinimalDetails' - type: object properties: _links: type: object properties: self: $ref: '#/components/schemas/LinkObject' AccountType: type: string enum: - VOLT_ACCOUNT - NAMED_ACCOUNT - CONNECTED_ACCOUNT Error422Response: type: object description: Error response for HTTP 422 Unprocessable Entity. properties: code: type: string description: Error code. enum: - VALIDATION_FAILURE message: type: string description: Error message. errors: type: array description: Field validation errors. items: $ref: '#/components/schemas/ValidationErrorDetail' required: - code - message - errors AccountSubType: type: string enum: - BUSINESS - INDIVIDUAL Error400Response: type: object description: Error response for HTTP 400 Bad Request. properties: code: type: string description: Error code. enum: - BAD_REQUEST - INVALID_PATH_VARIABLE - MISSING_HTTP_HEADER - INVALID_HTTP_HEADER - MALFORMED_PATH_PARAM - MISSING_QUERY_PARAM - INVALID_QUERY_PARAM - MALFORMED_QUERY_PARAM - CONFIGURATION_ERROR message: type: string description: Error message. required: - code - message SortOrder: description: Sorting direction type: string enum: - asc - desc ValidationErrorType: $ref: ./error-common.yaml#/components/schemas/ValidationErrorType Identifications: description: A list of one or more account identifiers. type: array items: $ref: accounts-common.yaml#/components/schemas/AccountIdentifier minItems: 1 Error409Response: type: object description: Error response for HTTP 409 Conflict. properties: code: type: string description: Error code. enum: - CONFLICT - IDEMPOTENCY_CONFLICT - RESOURCE_NOT_MODIFIABLE message: type: string description: Error message. required: - code - message Error405Response: type: object description: HTTP method is not supported for this URL. properties: code: type: string description: Error code. enum: - METHOD_NOT_SUPPORTED message: type: string description: Error message. required: - code - message AccountHolderEntityId: type: string format: uuid description: 'The unique identifier of the account holder entity depends on the entity type: * Volt Business Customer: customer identifier * Merchant Clients (Business/Individual): unique identifier issued during the client onboarding process ' example: 40bb9716-fb00-484e-b4a2-eb3a220b3906 Error404Response: type: object description: Error response for HTTP 404 Not Found. properties: code: type: string description: Error code. enum: - RESOURCE_NOT_FOUND message: type: string description: Error message. required: - code - message LinkObject: type: object properties: href: type: string format: uri method: type: string enum: - GET - POST - PATCH - DELETE required: - href CurrencyCode: type: string description: Three-letter ISO 4217 currency code. example: EUR pattern: ^[A-Z]{3}$ CountryCode: description: Alpha-2 country code example: DE pattern: ^[A-Z]{2}$ type: string Error415Response: type: object description: Request contains data in an unsupported content type. properties: code: type: string description: Error code. enum: - UNSUPPORTED_MEDIA_TYPE message: type: string description: Error message. required: - code - message ValidationErrorDetail: type: object description: Details about a specific validation error. properties: type: $ref: '#/components/schemas/ValidationErrorType' propertyPath: type: string description: Points to the specific field or property in the incoming request that violated the validation rule. message: type: string description: Human-readable message about constraint violation. Error406Response: type: object description: API is not able to generate a response in the format defined in the Accept HTTP request header. properties: code: type: string description: Error code. enum: - MEDIA_TYPE_NOT_ACCEPTABLE message: type: string description: Error message. required: - code - message AccountMinimalDetails: type: object properties: id: type: string format: uuid description: Id of Account. currency: $ref: '#/components/schemas/CurrencyCode' identifications: $ref: '#/components/schemas/Identifications' name: type: string description: User-defined account alias. active: type: boolean description: Boolean flag indicating if the account is currently enabled for processing transactions. status: $ref: '#/components/schemas/AccountStatusEnum' country: $ref: '#/components/schemas/CountryCode' balance: $ref: '#/components/schemas/AccountBalance' type: $ref: '#/components/schemas/AccountType' subType: $ref: '#/components/schemas/AccountSubType' accountHolder: $ref: '#/components/schemas/AccountHolderMinimalDetails' responses: '403': description: '**Access denied** - Although your credentials are correct, your access to this section of the API has been disabled or limited. Subsequent requests to this endpoint will not be processed.' content: application/json: schema: $ref: '#/components/schemas/Error403Response' '404': description: '**Not found** - The resource that you are requesting cannot be found.' content: application/json: schema: $ref: '#/components/schemas/Error404Response' '401': description: '**Unauthorized** - Your credentials were invalid. It may be that the token you''ve used has expired. Try re-authenticating with valid or updated credentials and retry this request.' content: application/json: schema: $ref: '#/components/schemas/Error401Response' '406': description: '**Media-type not acceptable** - API is not able to generate a response in the format defined in the Accept HTTP request header.' content: application/json: schema: $ref: '#/components/schemas/Error406Response' '405': description: '**Method not supported** - HTTP method is not supported for this URL.' content: application/json: schema: $ref: '#/components/schemas/Error405Response' '422': description: '**Unprocessable** - Request''s payload validation fails.' content: application/json: schema: $ref: '#/components/schemas/Error422Response' '409': description: '**Conflict** - Modification of a resource is not possible, because current state of it does not allow it. Or `Idempotency-Key` was already used.' content: application/json: schema: $ref: '#/components/schemas/Error409Response' '500': description: '**Internal server error** - Something went wrong and request cannot be processed due to server error. Message will contain trace ID and timestamp, which allows to investigate what went wrong.' content: application/json: schema: $ref: '#/components/schemas/Error500Response' '400': description: '**Bad request** - Request you sent is invalid or malformed. Response will contain a description of the actual problem.' content: application/json: schema: $ref: '#/components/schemas/Error400Response' '415': description: '**Unsupported media-type** - Request contains data in an unsupported content type.' content: application/json: schema: $ref: '#/components/schemas/Error415Response' parameters: PageParam: name: page in: query description: Page index for pagination. schema: type: integer minimum: 1 default: 1 LimitParam: name: limit in: query description: Number of items to return per page (max 100). required: false schema: type: integer minimum: 1 maximum: 100 default: 25 IdempotencyKey: name: Idempotency-Key in: header description: It helps preventing duplicates in your `POST` requests. It is recommend using a **UUID** for the key, however you may use any other unique identifier you choose. required: true schema: type: string maxLength: 160 example: 85136c79cbf9fe36bb9d05d0639c70c265c18d37 XVoltApiVersion: name: X-Volt-Api-Version in: header description: Version of the API used. Currently, version `1` is the only version. required: true schema: type: integer example: 1 enum: - 1 headers: PaginationPageCount: description: Total number of available pages. schema: type: integer example: 6 PaginationLimit: description: Number of items per page. schema: type: integer example: 25 PaginationTotalItems: description: The absolute count of items matching the query. schema: type: integer example: 150 PaginationPage: description: The current page number. schema: type: integer example: 1 securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: JWT