Kushki Transfer Payments API

Accept bank-rail transfers across LatAm — PSE in Colombia, Webpay Transferencia in Chile, SPEI in Mexico, PIX in Brazil, and direct debit in Ecuador and Peru. Initiate the charge, return a redirect/QR for the payer, and receive webhook confirmation when the bank settles.

Kushki Transfer Payments API is one of 8 APIs that Kushki publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Bank Transfers, Payments, PSE, Webpay, and PIX. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 1 Naftiko capability spec.

OpenAPI Specification

kushki-transfer-payments-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Kushki Transfer Payments API
  description: |
    Bank-rail transfer payments across LatAm — PSE (Colombia), Webpay Transferencia
    (Chile), SPEI (Mexico), PIX (Brazil), and direct debit (Ecuador, Peru). Returns
    a redirect URL or QR for the payer; final state is delivered by webhook.
  version: "1.0.0"
  contact:
    name: Kushki
    url: https://kushkipagos.com/
    email: [email protected]
servers:
  - url: https://api.kushkipagos.com
    description: Production
  - url: https://api-uat.kushkipagos.com
    description: UAT / Sandbox
security:
  - PublicMerchantId: []
  - PrivateMerchantId: []
tags:
  - name: Transfer
    description: Bank-rail transfer charges
paths:
  /transfer/v1/init:
    post:
      summary: Kushki Initialize Transfer Charge
      description: Initialize a transfer payment. Returns a redirect URL (PSE / Webpay) or QR/CopyPaste payload (PIX) plus a Kushki ticket number.
      operationId: initTransferCharge
      tags:
        - Transfer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferInitRequest'
            example:
              callbackUrl: https://merchant.example.com/checkout/return
              userType: "0"
              documentType: CC
              documentNumber: "100000001"
              email: [email protected]
              paymentDescription: Order 42
              amount:
                subtotalIva: 0
                subtotalIva0: 50000
                iva: 0
                currency: COP
      responses:
        '200':
          description: Transfer initialized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferInitResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /transfer/v1/charge:
    post:
      summary: Kushki Confirm Transfer Charge
      description: Confirm a transfer charge after the payer authorizes at the bank. Normally driven by the redirect callback; webhook delivery is the authoritative event.
      operationId: confirmTransferCharge
      tags:
        - Transfer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferChargeRequest'
      responses:
        '200':
          description: Charge confirmed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferChargeResponse'
  /transfer/v1/charges/{ticketNumber}:
    get:
      summary: Kushki Get Transfer Charge
      description: Retrieve the current status of a transfer charge.
      operationId: getTransferCharge
      tags:
        - Transfer
      parameters:
        - name: ticketNumber
          in: path
          required: true
          schema: { type: string }
      responses:
        '200':
          description: Charge status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransferChargeResponse'
components:
  securitySchemes:
    PublicMerchantId:
      type: apiKey
      in: header
      name: Public-Merchant-Id
    PrivateMerchantId:
      type: apiKey
      in: header
      name: Private-Merchant-Id
  schemas:
    Amount:
      type: object
      required: [subtotalIva, subtotalIva0, iva, currency]
      properties:
        subtotalIva: { type: number }
        subtotalIva0: { type: number }
        ice: { type: number, default: 0 }
        iva: { type: number }
        currency: { type: string, enum: [USD, COP, PEN, CLP, MXN, BRL] }
    TransferInitRequest:
      type: object
      required: [callbackUrl, email, amount]
      properties:
        callbackUrl: { type: string, format: uri }
        userType:
          type: string
          enum: ["0", "1"]
          description: "0 = natural person, 1 = legal entity (Colombia PSE convention)."
        documentType:
          type: string
          enum: [CC, NIT, CE, DNI, RUT, CURP, RFC, RUC, CPF, CNPJ]
        documentNumber: { type: string }
        email: { type: string, format: email }
        paymentDescription: { type: string }
        amount: { $ref: '#/components/schemas/Amount' }
        bankId: { type: string, description: PSE bank identifier (Colombia only). }
        metadata: { type: object, additionalProperties: true }
    TransferInitResponse:
      type: object
      properties:
        token: { type: string }
        redirectUrl: { type: string, format: uri }
        ticketNumber: { type: string }
        pixCopyPaste: { type: string, description: PIX copy-paste string (Brazil). }
        qrCode: { type: string, description: Base64-encoded QR image (PIX). }
    TransferChargeRequest:
      type: object
      required: [token]
      properties:
        token: { type: string }
        amount: { $ref: '#/components/schemas/Amount' }
        metadata: { type: object, additionalProperties: true }
    TransferChargeResponse:
      type: object
      properties:
        ticketNumber: { type: string }
        transactionStatus:
          type: string
          enum: [APPROVAL, INITIALIZED, DECLINED, PENDING]
        approvalCode: { type: string }
        responseText: { type: string }
        paymentBrand: { type: string, description: PSE / Webpay / SPEI / PIX. }
        bankName: { type: string }
    Error:
      type: object
      properties:
        code: { type: string }
        message: { type: string }
  responses:
    ErrorResponse:
      description: Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'