openapi: 3.0.1 info: title: Pismo Accounts API description: Specification of the Pismo cloud-native issuer-processing and core-banking platform API. Covers accounts, customers, cards, authorizations, transactions and statements, programs, and event/webhook configuration. Pismo is a Visa-owned platform (acquired January 2024). Authentication uses OAuth2 client-credentials to obtain a Bearer access token; account-scoped endpoints additionally require an account-specific token that encodes a Pismo account ID. termsOfService: https://www.pismo.io contact: name: Pismo Developer Support url: https://developers.pismo.io version: '1.0' servers: - url: https://api.pismo.io description: Production - url: https://sandbox.pismolabs.io description: Sandbox security: - bearerAuth: [] tags: - name: Accounts description: Core-banking account lifecycle and balances. paths: /accounts/v1/accounts: post: operationId: createAccount tags: - Accounts summary: Create account description: Creates a core-banking account bound to a customer and a program. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateAccountRequest' responses: '201': description: Account created. content: application/json: schema: $ref: '#/components/schemas/Account' '401': $ref: '#/components/responses/Unauthorized' /accounts/v1/accounts/{accountId}: get: operationId: getAccount tags: - Accounts summary: Get account parameters: - $ref: '#/components/parameters/AccountId' responses: '200': description: Account found. content: application/json: schema: $ref: '#/components/schemas/Account' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateAccount tags: - Accounts summary: Update account parameters: - $ref: '#/components/parameters/AccountId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateAccountRequest' responses: '200': description: Account updated. content: application/json: schema: $ref: '#/components/schemas/Account' /accounts/v1/accounts/{accountId}/status: patch: operationId: updateAccountStatus tags: - Accounts summary: Update account status parameters: - $ref: '#/components/parameters/AccountId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AccountStatusUpdate' responses: '200': description: Status updated. content: application/json: schema: $ref: '#/components/schemas/Account' /accounts/v1/accounts/{accountId}/entity: patch: operationId: transferAccountOwnership tags: - Accounts summary: Transfer account ownership parameters: - $ref: '#/components/parameters/AccountId' requestBody: required: true content: application/json: schema: type: object properties: customer_id: type: integer format: int64 responses: '200': description: Ownership transferred. /accounts/v1/account-balances: get: operationId: getAccountBalance tags: - Accounts summary: Get account balance parameters: - name: account_id in: query required: true schema: type: integer format: int64 responses: '200': description: Current balance. content: application/json: schema: $ref: '#/components/schemas/AccountBalance' components: responses: NotFound: description: Resource not found. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing or invalid Bearer token. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: AccountStatusUpdate: type: object required: - status properties: status: type: string enum: - NORMAL - BLOCKED - CANCELLED - CLOSED reason: type: string Error: type: object properties: type: type: string title: type: string status: type: integer detail: type: string AccountBalance: type: object properties: account_id: type: integer format: int64 available_amount: type: number format: double current_amount: type: number format: double currency: type: string CreateAccountRequest: type: object required: - customer_id - program_id properties: customer_id: type: integer format: int64 program_id: type: integer format: int64 processing_code: type: string currency: type: string example: USD Account: type: object properties: id: type: integer format: int64 customer_id: type: integer format: int64 program_id: type: integer format: int64 status: type: string currency: type: string created_at: type: string format: date-time UpdateAccountRequest: type: object properties: program_id: type: integer format: int64 metadata: type: object additionalProperties: true parameters: AccountId: name: accountId in: path required: true schema: type: integer format: int64 securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: 'OAuth2 client-credentials access token obtained from POST /passport/v2/oauth/token. Pass as `Authorization: Bearer `. Account-scoped endpoints require an account-specific token encoded with a Pismo account ID.' oauth2: type: oauth2 flows: clientCredentials: tokenUrl: https://api.pismo.io/passport/v2/oauth/token scopes: {}