Kushki Card Payments API

Charge, void, refund, capture, and pre-authorize card transactions via the Kushki Card REST API. Card numbers are tokenized client-side (Kushki.js Hosted Fields or mobile SDKs) so PAN never touches the merchant server. One-step and two-step (auth/capture) flows, deferred payments with months and rate-of-interest, partial refunds, and 3DS 2.0 authentication are supported across Ecuador, Colombia, Peru, Chile, Mexico, and Brazil.

Kushki Card 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 3 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 2 JSON Schema definitions.

Tagged areas include Card Payments, Payments, Tokenization, 3DS, and Refunds. The published artifact set on APIs.io includes API documentation, an API reference, an OpenAPI specification, a JSON-LD context, 3 Naftiko capability specs, and 2 JSON Schemas.

OpenAPI Specification

kushki-card-payments-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Kushki Card Payments API
  description: |
    Card-not-present REST API for the Kushki regional non-banking acquirer.
    Card numbers are tokenized client-side by Kushki.js Hosted Fields or the
    iOS / Android SDKs and the resulting `transactionToken` is exchanged
    server-side for a charge, pre-authorization, capture, or void.
  version: "1.0.0"
  contact:
    name: Kushki
    url: https://kushkipagos.com/
    email: [email protected]
  license:
    name: Kushki API Terms
    url: https://kushkipagos.com/legal
servers:
  - url: https://api.kushkipagos.com
    description: Production
  - url: https://api-uat.kushkipagos.com
    description: UAT / Sandbox
  - url: https://api-stg.kushkipagos.com
    description: Staging
security:
  - PublicMerchantId: []
  - PrivateMerchantId: []
tags:
  - name: Tokens
    description: Card tokenization (client-side via Kushki.js, returns a one-time transactionToken)
  - name: Charges
    description: Direct charge against a previously created card token
  - name: Pre-Authorization
    description: Two-step authorize + capture flow
  - name: Voids and Refunds
    description: Void or refund a previously captured charge
paths:
  /card/v1/tokens:
    post:
      summary: Kushki Tokenize Card
      description: Tokenize a card. Normally invoked from Kushki.js Hosted Fields in the browser using the Public-Merchant-Id.
      operationId: createCardToken
      tags:
        - Tokens
      security:
        - PublicMerchantId: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            example:
              card:
                name: Juan Perez
                number: "4242424242424242"
                expiryMonth: "12"
                expiryYear: "29"
                cvv: "123"
              totalAmount: 1000
              currency: USD
      responses:
        '200':
          description: Token created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /card/v1/charges:
    post:
      summary: Kushki Create Card Charge
      description: Charge a previously tokenized card in a single step. Returns a ticketNumber used for void or refund.
      operationId: createCardCharge
      tags:
        - Charges
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChargeRequest'
            example:
              token: 0aabF1aae450476cb7547bda5bdfc11d
              amount:
                subtotalIva: 0
                subtotalIva0: 1000
                ice: 0
                iva: 0
                currency: USD
              fullResponse: true
      responses:
        '200':
          description: Charge approved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargeResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /card/v1/preAuthorization:
    post:
      summary: Kushki Pre-Authorize Card
      description: Reserve funds on a card without capturing them. Capture or void within the issuer-specific window.
      operationId: preAuthorizeCard
      tags:
        - Pre-Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChargeRequest'
      responses:
        '200':
          description: Authorization approved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargeResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /card/v1/capture:
    post:
      summary: Kushki Capture Pre-Authorization
      description: Capture funds previously held via /card/v1/preAuthorization. Supports partial capture below the original amount.
      operationId: captureCardCharge
      tags:
        - Pre-Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CaptureRequest'
            example:
              ticketNumber: "175632110000000123"
              amount:
                subtotalIva: 0
                subtotalIva0: 1000
                iva: 0
              fullResponse: true
      responses:
        '200':
          description: Capture approved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargeResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /card/v1/deferred:
    post:
      summary: Kushki Create Deferred Card Charge
      description: Charge a card with deferred/installment terms. Specify months and rate_of_interest per the issuer's deferred catalog.
      operationId: createDeferredCharge
      tags:
        - Charges
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeferredChargeRequest'
      responses:
        '200':
          description: Deferred charge approved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargeResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
  /v1/charges/{ticketNumber}:
    delete:
      summary: Kushki Void Or Refund Charge
      description: |
        Void (same day, before settlement) or refund (after settlement) a previously approved charge.
        Pass a partial amount in the body to perform a partial refund; omit amount to void the full transaction.
      operationId: voidOrRefundCharge
      tags:
        - Voids and Refunds
      parameters:
        - name: ticketNumber
          in: path
          required: true
          schema:
            type: string
          description: Ticket number returned by the original charge.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoidRequest'
      responses:
        '200':
          description: Void or refund accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChargeResponse'
        '4XX':
          $ref: '#/components/responses/ErrorResponse'
components:
  securitySchemes:
    PublicMerchantId:
      type: apiKey
      in: header
      name: Public-Merchant-Id
      description: Client-side merchant key. Used by Kushki.js and mobile SDKs to tokenize cards. Never use server-side for charging.
    PrivateMerchantId:
      type: apiKey
      in: header
      name: Private-Merchant-Id
      description: Server-side merchant key. Required for charge, capture, void, refund, subscription, and payout calls.
  parameters: {}
  schemas:
    Amount:
      type: object
      required: [subtotalIva, subtotalIva0, iva, currency]
      properties:
        subtotalIva:
          type: number
          description: Subtotal taxed at IVA / VAT.
        subtotalIva0:
          type: number
          description: Subtotal at 0% IVA / VAT.
        ice:
          type: number
          description: ICE (Ecuadorian excise tax). Use 0 if not applicable.
          default: 0
        iva:
          type: number
          description: IVA / VAT amount.
        extraTaxes:
          type: object
          additionalProperties:
            type: number
          description: Country-specific extra taxes (e.g. propina, tasaAeroportuaria, agenciaDeViaje).
        currency:
          type: string
          enum: [USD, COP, PEN, CLP, MXN, BRL]
    TokenRequest:
      type: object
      required: [card, totalAmount, currency]
      properties:
        card:
          type: object
          properties:
            name: { type: string }
            number: { type: string }
            expiryMonth: { type: string }
            expiryYear: { type: string }
            cvv: { type: string }
        totalAmount:
          type: number
        currency:
          type: string
    TokenResponse:
      type: object
      properties:
        token:
          type: string
          description: One-time transactionToken to pass to /card/v1/charges or /card/v1/preAuthorization.
    ChargeRequest:
      type: object
      required: [token, amount]
      properties:
        token:
          type: string
        amount:
          $ref: '#/components/schemas/Amount'
        months:
          type: integer
          description: Installment count for deferred payments.
        deferred:
          type: object
          properties:
            months: { type: integer }
            graceMonths: { type: integer }
            creditType: { type: string }
        contactDetails:
          $ref: '#/components/schemas/ContactDetails'
        metadata:
          type: object
          additionalProperties: true
        fullResponse:
          type: boolean
          default: false
        threeDomainSecure:
          type: object
          description: 3DS 2.0 authentication payload (eci, cavv, xid, directoryServerTransactionId).
    DeferredChargeRequest:
      allOf:
        - $ref: '#/components/schemas/ChargeRequest'
        - type: object
          required: [months]
          properties:
            months: { type: integer, minimum: 1, maximum: 48 }
            interestRate: { type: number }
    CaptureRequest:
      type: object
      required: [ticketNumber, amount]
      properties:
        ticketNumber: { type: string }
        amount:
          $ref: '#/components/schemas/Amount'
        fullResponse:
          type: boolean
          default: false
    VoidRequest:
      type: object
      properties:
        amount:
          $ref: '#/components/schemas/Amount'
        fullResponse:
          type: boolean
          default: false
    ChargeResponse:
      type: object
      properties:
        ticketNumber: { type: string }
        transactionReference: { type: string }
        approvedTransactionAmount: { type: number }
        currencyCode: { type: string }
        approvalCode: { type: string }
        token: { type: string }
        rrn: { type: string }
        responseText: { type: string }
        responseCode: { type: string }
        details:
          type: object
          properties:
            transactionId: { type: string }
            transactionStatus: { type: string }
            cardHolderName: { type: string }
            paymentBrand: { type: string }
            bin: { type: string }
            lastFourDigits: { type: string }
            cardType: { type: string }
            cardCountry: { type: string }
    ContactDetails:
      type: object
      properties:
        firstName: { type: string }
        lastName: { type: string }
        documentType: { type: string, enum: [CC, NIT, CE, DNI, RUT, CURP, RFC, RUC, CPF, CNPJ] }
        documentNumber: { type: string }
        email: { type: string, format: email }
        phoneNumber: { type: string }
    Error:
      type: object
      properties:
        code: { type: string }
        message: { type: string }
  responses:
    ErrorResponse:
      description: Error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'