Toss Payments Payments API

Confirm, retrieve, and cancel payments.

OpenAPI Specification

toss-payments-payments-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Toss Core Billing Payments API
  description: 'The Toss Payments Core API is a REST interface for accepting and managing online payments in South Korea across cards, easy-pay wallets (Toss Pay, KakaoPay, Naver Pay), virtual accounts, bank transfer, and mobile-phone billing. This document models a representative, grounded subset of the Core API: payment confirmation and cancellation, recurring billing keys, virtual account issuance, cash receipts, transaction and settlement queries, and marketplace payouts. All requests authenticate with HTTP Basic auth - the secret API key is used as the username with an empty password, Base64 encoded (`Authorization: Basic base64(secretKey:)`). Asynchronous results (virtual account deposits, foreign payment cancellations, Brandpay and payout status changes) are delivered by webhooks, which are out of scope for this REST document. Field names follow the Korean documentation, translated where helpful. This is a modeled subset authored by API Evangelist from the public documentation, not an official Toss Payments OpenAPI artifact.'
  version: '2022-11-16'
  contact:
    name: Toss Payments Developer Center
    url: https://docs.tosspayments.com/en
  termsOfService: https://www.tosspayments.com
servers:
- url: https://api.tosspayments.com
  description: Toss Payments Core API (test and live selected by secret key prefix)
security:
- basicAuth: []
tags:
- name: Payments
  description: Confirm, retrieve, and cancel payments.
paths:
  /v1/payments/confirm:
    post:
      operationId: confirmPayment
      tags:
      - Payments
      summary: Confirm a payment
      description: Authorizes (approves) a payment that was created in the Toss Payments checkout window. The client supplies the paymentKey, orderId, and amount returned by the SDK success callback; the server validates that the amount matches and finalizes the transaction.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConfirmPaymentRequest'
      responses:
        '200':
          description: The approved Payment object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /v1/payments/key-in:
    post:
      operationId: keyInPayment
      tags:
      - Payments
      summary: Key-in (manual card) payment
      description: Approves a payment directly from card credentials (card number, expiry, and identity number) without the checkout window. Requires an additional contract with Toss Payments.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KeyInPaymentRequest'
      responses:
        '200':
          description: The approved Payment object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /v1/payments/{paymentKey}:
    parameters:
    - $ref: '#/components/parameters/PaymentKey'
    get:
      operationId: getPayment
      tags:
      - Payments
      summary: Get a payment by paymentKey
      description: Retrieves a Payment object by its paymentKey.
      responses:
        '200':
          description: The requested Payment object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /v1/payments/orders/{orderId}:
    parameters:
    - name: orderId
      in: path
      required: true
      description: The merchant-assigned order ID (6-64 chars; alphanumeric, `-`, `_`).
      schema:
        type: string
    get:
      operationId: getPaymentByOrderId
      tags:
      - Payments
      summary: Get a payment by orderId
      description: Retrieves a Payment object by the merchant's orderId.
      responses:
        '200':
          description: The requested Payment object.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /v1/payments/{paymentKey}/cancel:
    parameters:
    - $ref: '#/components/parameters/PaymentKey'
    post:
      operationId: cancelPayment
      tags:
      - Payments
      summary: Cancel a payment
      description: Cancels a payment in full, or partially when cancelAmount is provided. For virtual account payments a refundReceiveAccount is required to return funds to the customer.
      parameters:
      - name: Idempotency-Key
        in: header
        required: false
        description: Optional client-generated key to make the cancellation idempotent.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelPaymentRequest'
      responses:
        '200':
          description: The updated Payment object reflecting the cancellation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  responses:
    Forbidden:
      description: The key is not permitted to perform this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing or invalid secret key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: The request was invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    KeyInPaymentRequest:
      type: object
      required:
      - amount
      - orderId
      - orderName
      - cardNumber
      - cardExpirationYear
      - cardExpirationMonth
      properties:
        amount:
          type: integer
        orderId:
          type: string
        orderName:
          type: string
        cardNumber:
          type: string
        cardExpirationYear:
          type: string
        cardExpirationMonth:
          type: string
        customerIdentityNumber:
          type: string
          description: Birth date (YYMMDD) or business registration number.
        cardInstallmentPlan:
          type: integer
          description: Number of installment months (0 for lump sum).
    Cancel:
      type: object
      properties:
        cancelAmount:
          type: integer
        cancelReason:
          type: string
        canceledAt:
          type: string
          format: date-time
        transactionKey:
          type: string
        cancelStatus:
          type: string
    ConfirmPaymentRequest:
      type: object
      required:
      - paymentKey
      - orderId
      - amount
      properties:
        paymentKey:
          type: string
        orderId:
          type: string
        amount:
          type: integer
          description: The amount to approve; must match the amount created in the window.
    CancelPaymentRequest:
      type: object
      required:
      - cancelReason
      properties:
        cancelReason:
          type: string
        cancelAmount:
          type: integer
          description: Amount to cancel for a partial cancellation; omit to cancel in full.
        refundReceiveAccount:
          $ref: '#/components/schemas/RefundReceiveAccount'
        taxFreeAmount:
          type: integer
        currency:
          type: string
    VirtualAccount:
      type: object
      properties:
        accountType:
          type: string
          enum:
          - 일반
          - 고정
        accountNumber:
          type: string
        bankCode:
          type: string
        customerName:
          type: string
        dueDate:
          type: string
          format: date-time
        refundStatus:
          type: string
        settlementStatus:
          type: string
    Payment:
      type: object
      description: A Toss Payments Payment object.
      properties:
        version:
          type: string
        paymentKey:
          type: string
        orderId:
          type: string
        orderName:
          type: string
        status:
          type: string
          enum:
          - READY
          - IN_PROGRESS
          - WAITING_FOR_DEPOSIT
          - DONE
          - CANCELED
          - PARTIAL_CANCELED
          - ABORTED
          - EXPIRED
        method:
          type: string
          enum:
          - 카드
          - 가상계좌
          - 간편결제
          - 휴대폰
          - 계좌이체
          - 문화상품권
          - 도서문화상품권
          - 게임문화상품권
          description: Payment method (Korean label). English enum equivalents include CARD, VIRTUAL_ACCOUNT, EASY_PAY, MOBILE_PHONE, TRANSFER.
        totalAmount:
          type: integer
        balanceAmount:
          type: integer
        suppliedAmount:
          type: integer
        vat:
          type: integer
        taxFreeAmount:
          type: integer
        currency:
          type: string
        requestedAt:
          type: string
          format: date-time
        approvedAt:
          type: string
          format: date-time
        card:
          $ref: '#/components/schemas/Card'
        virtualAccount:
          $ref: '#/components/schemas/VirtualAccount'
        easyPay:
          type: object
          properties:
            provider:
              type: string
            amount:
              type: integer
            discountAmount:
              type: integer
        cancels:
          type: array
          items:
            $ref: '#/components/schemas/Cancel'
    Card:
      type: object
      properties:
        company:
          type: string
        number:
          type: string
        installmentPlanMonths:
          type: integer
        approveNo:
          type: string
        cardType:
          type: string
          enum:
          - 신용
          - 체크
          - 기프트
        ownerType:
          type: string
          enum:
          - 개인
          - 법인
    Error:
      type: object
      description: Standard Toss Payments error body.
      properties:
        code:
          type: string
          description: Machine-readable error code (for example INVALID_CARD_EXPIRATION).
        message:
          type: string
          description: Human-readable error message (Korean by default).
    RefundReceiveAccount:
      type: object
      description: Refund destination account, required for virtual account cancellations.
      required:
      - bank
      - accountNumber
      - holderName
      properties:
        bank:
          type: string
          description: Bank code.
        accountNumber:
          type: string
        holderName:
          type: string
  parameters:
    PaymentKey:
      name: paymentKey
      in: path
      required: true
      description: The unique key identifying the payment (max 200 chars).
      schema:
        type: string
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: HTTP Basic authentication. Use your Toss Payments secret key as the username and leave the password empty, then Base64 encode `secretKey:` for the Authorization header. Test keys are prefixed `test_sk_` / `test_gsk_` and live keys `live_sk_` / `live_gsk_`.