---
title: 현금영수증 취소
description: POST /v2/cash-receipts/{id}/cancel 로 발급된 현금영수증의 전체나 일부 금액을 취소해요.
sidebar:
  order: 4
  badge: POST
---

```http
POST /v2/cash-receipts/{id}/cancel
```

국세청 발급이 끝난(`ISSUED`) 원본 현금영수증을 취소해요. 페이싱크가 취소 금액만큼 취소 영수증(`kind: CANCELLATION`)을 발급하고, 응답으로 그 취소 영수증을 돌려줘요. 금액 일부만 취소할 수 있고, 남은 금액은 다시 나눠서 취소할 수 있어요.

원본 금액 전체가 취소되면 원본의 `status`가 `CANCELED`로 바뀌어요. 일부만 취소하면 원본은 `ISSUED`로 남고 `canceledAmount`, `remainingAmount`가 바뀌어요.

| 원본 상태 | 취소 가능 여부 |
| --- | --- |
| `PENDING` | 국세청 처리가 끝난 뒤에 취소할 수 있어요. 보통 다음 날 오전 10시 이후예요. |
| `ISSUED` | 취소할 수 있어요. |
| `FAILED` | 발급되지 않아서 취소할 수 없어요. |
| `CANCELED` | 이미 전액 취소했어요. |

취소 영수증은 다시 취소할 수 없어요.

## 경로 파라미터

| 파라미터 | 타입 | 설명 |
| --- | --- | --- |
| `id` | string | 취소할 원본 현금영수증 ID예요. `crt_`로 시작해요. |

## 요청 본문

| 필드 | 타입 | 필수 | 설명 |
| --- | --- | --- | --- |
| `reason` | string | 예 | 취소 사유예요. 1~100자예요. `거래 취소`, `오류 발급`, 그 밖의 사유로 나눠서 국세청에 신고해요. |
| `amount` | integer | | 취소할 금액(원)이에요. 빼면 남은 금액 전체를 취소해요. 남은 금액보다 클 수 없어요. |

부분 취소의 공급가액과 부가세는 취소 금액으로 다시 계산해요. 마지막 취소는 남은 공급가액과 부가세를 모두 가져가서, 원본과 취소 영수증의 합계가 맞아요.

## 요청 예시

```bash cURL
curl -X POST https://api.paysync.kr/v2/cash-receipts/crt_a1b2c3d4e5f6g7h8i9j0k1l2/cancel \
  -H "Authorization: Bearer $PAYSYNC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 20000, "reason": "거래 취소" }'
```

```js Node.js
const res = await fetch(`https://api.paysync.kr/v2/cash-receipts/${cashReceiptId}/cancel`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.PAYSYNC_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ amount: 20000, reason: "거래 취소" }),
});
const { code, data } = await res.json();
```

```python Python
import os
import requests

res = requests.post(
    f"https://api.paysync.kr/v2/cash-receipts/{cash_receipt_id}/cancel",
    headers={"Authorization": f"Bearer {os.environ['PAYSYNC_API_KEY']}"},
    json={"amount": 20000, "reason": "거래 취소"},
)
print(res.json())
```

## 응답

새로 만든 취소 영수증이 [현금영수증 객체](/api-reference/cash-receipts/get#현금영수증-객체)로 와요.

```json 200 OK
{
  "code": "10001",
  "data": {
    "id": "crt_c3d4e5f6g7h8i9j0k1l2m3n4",
    "kind": "CANCELLATION",
    "status": "PENDING",
    "amount": 20000,
    "supplyCost": 18182,
    "tax": 1818,
    "originalId": "crt_a1b2c3d4e5f6g7h8i9j0k1l2",
    "partial": true,
    "cancelReason": "거래 취소",
    "...": "..."
  }
}
```

## 오류

| HTTP | `code` | 발생 조건 |
| --- | --- | --- |
| 401 | `290006` | API 키가 올바르지 않아요. |
| 403 | `290007` | 읽기 전용 API 키예요. |
| 404 | `20015` | 현금영수증이 없어요. |
| 409 | `240006` | 취소할 수 없는 상태예요. `data.reason`은 `NTS_PENDING`, `NOT_ISSUED`, `FULLY_CANCELED`, `CANCELLATION_RECEIPT` 중 하나이고, `data.message`에 안내 문구가 와요. |
| 422 | `30007` | JSON 본문을 읽을 수 없거나 `reason`이 없어요. |
| 422 | `240001` | 현금영수증 ID 형식이 틀렸어요. |
| 422 | `240004` | `amount`가 0 이하이거나 남은 금액보다 커요. |
| 422 | `240008` | 팝빌이 취소를 거절했어요. `data`에 `status`가 `FAILED`인 취소 영수증이 와요. 원본은 그대로예요. |
| 422 | `240010` | `reason`이 비었거나 100자를 넘어요. |
