Toss Payments Payments API
Confirm, retrieve, and cancel payments.
Confirm, retrieve, and cancel payments.
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_`.