# 수정세금계산서 발급



이미 발급한 전자세금계산서를 수정사유 코드에 따라 수정발급하거나 취소합니다. 사유 4(계약의 해제)가 취소이고, 사유 3·4는 금액 부호를 서버가 자동으로 뒤집습니다.



인증: Authorization: Bearer $APICK_API_KEY

본문 있는 REST 요청: multipart/form-data. GET 본문 및 MCP JSON-RPC 규격은 해당 명세를 따릅니다.

인증키는 서버에 보관하세요. 모든 예제는 정적 자료입니다.



## POST /rest/req_etax_issue 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.schemaVersion` (string): 응답 스키마의 버전입니다. 현재 "1.0"으로 고정되어 있으며, 필드 구조가 바뀌면 값이 올라갑니다. 클라이언트는 이 값을 저장해 두고 파싱 로직을 분기할 수 있습니다.

- `data.transactionId` (string): 간편인증 요청에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId와 같으며, 같은 거래의 결과를 조회하거나 문의할 때 사용합니다. 인증이 만료되면 새 거래를 만들어야 합니다.

- `data.product` (string): 조회한 상품 코드입니다. 인증요청 때 보낸 product와 같은 값이며, 응답의 result 구조를 해석할 때 기준이 됩니다.

- `data.status` (string): 현재 처리 상태 코드입니다. 괄호 안 설명은 이 서비스에서의 상태 의미이며, 값별 다음 행동은 이 문서의 상태 표를 확인하세요. 상태가 바뀌면 같은 경로를 다시 조회합니다. 가능한 값은 9가지입니다. AUTH_REQUESTED = 인증 요청만 접수되어 사용자 승인을 기다리는 상태, AUTH_WAITING = 승인 전 대기, AUTH_COMPLETED = 승인은 끝났고 결과 준비 전, COLLECTING = 결과 준비 중, SUCCESS = 정상 완료되어 결과 사용 가능, PARTIAL_SUCCESS = 일부 자료만 준비되어 sources의 항목별 status 확인 필요, FAILED = 서버 처리 실패, AUTH_REJECTED = 사용자가 인증 거부, AUTH_EXPIRED = 승인 유효시간(300초) 만료입니다.

- `data.resultAvailable` (boolean): 결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 결과를 지금 사용할 수 있는 경우, false = 아직 처리 중이거나 실패·만료되어 결과가 없는 경우입니다. false면 data.status를 확인하세요.

- `data.charged` (boolean): 이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이번 조회에서 포인트가 실제로 차감된 경우(유료 결과를 처음 받은 때), false = 이미 차감된 결과를 다시 조회했거나 무료 응답인 경우입니다. api.cost가 0이면 false입니다.

- `data.sources` (array): 자료 항목별 처리 결과 목록입니다. 항목별 성공·실패를 구분하므로 일부만 성공한 응답을 판단할 때 사용합니다.

- `data.message` (string): 상태 메시지 (고정값: "인증 대기중입니다."). 안내 문구입니다. 오류 원인과 다음 행동을 설명합니다.

- `data.approvals` (integer): 사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다.

- `data.expiresAt` (string): 이 응답이나 인증 요청의 유효 만료 시각입니다. 한국시간(UTC+09:00) ISO 8601 형식이며, 이 시각을 넘기면 같은 요청을 다시 접수해야 합니다.

- `data.success` (integer): 업무 처리 결과 코드입니다. 1은 정상 결과, 0은 실패 또는 무료 응답입니다. 서비스에 따라 2·3처럼 추가 코드를 쓰므로 같은 응답의 status·msg·error 필드도 함께 확인하세요.

- `data.progress` (object): 결과 준비 진행 상태 묶음입니다. 전체 자료 수와 완료된 자료 수를 담습니다.

- `data.checkedAt` (string): 실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다.

- `data.errorCode` (string): 오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED 가능한 값은 4가지입니다. RESULT_EXPIRED = 결과 재조회 기간이 지난 경우(새로 인증해야 함), AUTH_EXPIRED = 승인 유효시간이 지난 경우, AUTH_REJECTED = 사용자가 인증을 거부한 경우, COLLECT_FAILED = 승인 뒤 결과 준비가 실패한 경우입니다. 오류가 없으면 null입니다.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

- `api.pl_id` (integer): 포인트 차감 기록 ID입니다. 차감이 발생한 호출에만 값이 있으며, 과금 내역을 문의할 때 이 번호를 사용합니다. 무과금 응답은 -1·null이거나 필드가 생략됩니다.

## 인증 요청: POST /rest/req_etax_issue



### 입력

- `name` (string, 필수): 조회 대상의 이름입니다. 간편인증·개인 조회에서는 성명, 기업 조회에서는 법인명·상호를 뜻합니다. 생년월일·전화번호 같은 보조 식별자와 함께 확인하세요.

- `birthDate` (string, 필수): 대상자의 생년월일 8자리입니다. 예: 19900101. 주민등록상 생년월일과 같아야 하며, 하이픈·공백은 넣지 않습니다.

- `phone` (string, 필수): 본인 명의 휴대전화 번호입니다. 하이픈 없이 숫자만 입력하며(예: 01012341234), 인증 문자를 받을 수 있는 번호여야 합니다.

- `authProvider` (string, 필수): 사용할 간편인증 수단의 식별자입니다. 예: kakao, naver, toss, pass. 지원 값과 표시 이름은 이 문서의 간편인증 목록을 확인하세요.

- `business_no` (string, 필수): 사업자등록번호 10자리(숫자만). 대표자 본인 확인에 쓰므로 반드시 보냅니다.

- `businessNo` (string, 필수): 발행자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `idempotency_key` (string, 필수): 같은 요청을 다시 보낼 때 중복 접수·과금을 막는 고유 키입니다. 요청 내용이 같으면 같은 키를 유지하고, 내용이 바뀌면 새 키를 만드세요. 키를 생략할 수 있는 API에서 생략하면 같은 요청은 기존 작업으로 처리됩니다.

- `originApprovalNo` (string, 필수): 수정 대상 원본 승인번호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendCode` (string, 필수): 수정사유 코드 1~6 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendReason` (string, 선택): 수정사유 설명 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `buyerNo` (string, 필수): 공급받는자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `buyerName` (string, 필수): 공급받는자 상호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `writtenDate` (string, 선택): 작성일자 8자리(YYYYMMDD). 없으면 오늘 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `items` (array, 필수): 품목 목록(itemName·quantity·unitPrice·supplyAmount·taxAmount)

- `bind_id` (string, 선택): 이전 사업자 조회 결과에서 받은 bind_id. 같은 계정·같은 사업자등록번호이고 유효기간(90일) 안이면 agreed 없이 접수합니다.

- `agreed` (boolean, 조건부): 대표자 본인 확인 동의. bind_id 가 없으면 true 로 보내야 접수됩니다. 빠지면 인증을 보내지 않고 무과금으로 거절합니다. 결과에 대표자명이 있으면 응답의 bind_id 로 다음 조회에 다시 쓸 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `business_type` (string, 선택): 사업자 구분. corporate(법인)는 공동인증서가 필수, personal(개인)은 간편인증·공동인증서 모두 가능. 없으면 personal

- `certificate_id` (string, 선택): 등록한 공동인증서 ID. 없으면 기본 인증서를 쓴다 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `auth_type` (string, 선택): 인증 방식. certificate(공동인증서) 또는 simple(간편인증). 없으면 business_type·certificate_id 로 정한다

- `transactionId` (string, 필수): 인증요청 단계에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId를 그대로 넣어야 하며, 임의 값이나 만료된 ID는 거부됩니다.



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "schemaVersion": {
          "type": "string",
          "description": "결과 스키마 버전 (고정값: \"1.0\")"
        },
        "transactionId": {
          "type": "string",
          "description": "결과 조회에 사용하는 트랜잭션 ID"
        },
        "product": {
          "type": "string",
          "description": "조회 항목 코드. 결과조회에도 같은 값이 오므로 어느 항목의 결과인지 대조할 수 있습니다."
        },
        "status": {
          "type": "string",
          "description": "처리 상태 (AUTH_REQUESTED: 인증 요청 완료)"
        },
        "resultAvailable": {
          "type": "boolean",
          "description": "결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다."
        },
        "charged": {
          "type": "boolean",
          "description": "이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다."
        },
        "sources": {
          "type": "array",
          "items": {},
          "description": "항상 포함됩니다. 값이 없으면 빈 배열 [] 입니다. 항목이 여러 개인 상품에서 어느 것이 성공·실패했는지 알려줍니다. 각 항목은 source(자료 이름), type(데이터 종류), status(SUCCESS/FAILED). 결과 준비가 끝나기 전에는 아직 확정되지 않은 항목이 FAILED 로 보일 수 있습니다."
        },
        "message": {
          "type": "string",
          "description": "상태 메시지 (고정값: \"인증 대기중입니다.\")"
        },
        "approvals": {
          "type": "integer",
          "description": "사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다."
        },
        "expiresAt": {
          "type": "string",
          "description": "인증 유효 기한(ISO 8601). 이 시각까지 승인하지 못하면 인증 실패 처리됩니다."
        },
        "success": {
          "type": "integer",
          "description": "과금 여부0: 실패 또는 재사용(무과금)1: 발송 성공(과금)"
        },
        "progress": {
          "type": "object",
          "description": "진행률(COLLECTING 일 때). total(전체 항목), completed(완료 항목)"
        },
        "checkedAt": {
          "type": "string",
          "description": "실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다."
        },
        "errorCode": {
          "type": "string",
          "description": "오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED"
        }
      },
      "description": "인증 요청 결과"
    },
    "api": {
      "type": "object",
      "properties": {
        "success": {
          "type": "boolean",
          "description": "API 서버 정상 응답 여부"
        },
        "cost": {
          "type": "integer",
          "description": "API 호출 요금"
        },
        "ms": {
          "type": "integer",
          "description": "API 응답 시간"
        },
        "pl_id": {
          "type": "integer",
          "description": "API 결제 로그 ID"
        }
      },
      "description": "API 호출 공통 데이터"
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "AUTH_REQUESTED",
    "resultAvailable": false,
    "charged": true,
    "sources": [],
    "message": "인증 대기중입니다.",
    "approvals": 1,
    "expiresAt": "2026-09-20T05:24:07+09:00",
    "success": 1
  },
  "api": {
    "success": true,
    "cost": 20,
    "ms": 1284,
    "pl_id": 4902
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/req_etax_issue' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'business_type=corporate' \
  --form-string 'certificate_id=123' \
  --form-string 'businessNo=1234567890' \
  --form-string 'idempotency_key=order-20261027-0001' \
  --form-string 'buyerNo=2208101733' \
  --form-string 'buyerName=주식회사 예시' \
  --form-string 'writtenDate=20261027' \
  --form-string 'items=[{"itemName":"자문 용역","quantity":1,"unitPrice":1000000,"supplyAmount":1000000,"taxAmount":100000}]'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("business_type", "corporate");
form.append("certificate_id", "123");
form.append("businessNo", "1234567890");
form.append("idempotency_key", "order-20261027-0001");
form.append("buyerNo", "2208101733");
form.append("buyerName", "주식회사 예시");
form.append("writtenDate", "20261027");
form.append("items", "[{\"itemName\":\"자문 용역\",\"quantity\":1,\"unitPrice\":1000000,\"supplyAmount\":1000000,\"taxAmount\":100000}]");
const response = await fetch("https://apick.app/rest/req_etax_issue", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("business_type", (None, "corporate")),
    ("certificate_id", (None, "123")),
    ("businessNo", (None, "1234567890")),
    ("idempotency_key", (None, "order-20261027-0001")),
    ("buyerNo", (None, "2208101733")),
    ("buyerName", (None, "주식회사 예시")),
    ("writtenDate", (None, "20261027")),
    ("items", (None, "[{\"itemName\":\"자문 용역\",\"quantity\":1,\"unitPrice\":1000000,\"supplyAmount\":1000000,\"taxAmount\":100000}]")),
]
response = requests.request("POST", "https://apick.app/rest/req_etax_issue",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'business_type' => 'corporate',
    'certificate_id' => '123',
    'businessNo' => '1234567890',
    'idempotency_key' => 'order-20261027-0001',
    'buyerNo' => '2208101733',
    'buyerName' => '주식회사 예시',
    'writtenDate' => '20261027',
    'items' => '[{"itemName":"자문 용역","quantity":1,"unitPrice":1000000,"supplyAmount":1000000,"taxAmount":100000}]',
];
$curl = curl_init('https://apick.app/rest/req_etax_issue');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/get_etax_issue 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.schemaVersion` (string): 응답 스키마의 버전입니다. 현재 "1.0"으로 고정되어 있으며, 필드 구조가 바뀌면 값이 올라갑니다. 클라이언트는 이 값을 저장해 두고 파싱 로직을 분기할 수 있습니다.

- `data.transactionId` (string): 간편인증 요청에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId와 같으며, 같은 거래의 결과를 조회하거나 문의할 때 사용합니다. 인증이 만료되면 새 거래를 만들어야 합니다.

- `data.product` (string): 조회한 상품 코드입니다. 인증요청 때 보낸 product와 같은 값이며, 응답의 result 구조를 해석할 때 기준이 됩니다.

- `data.status` (string): 현재 처리 상태 코드입니다. 괄호 안 설명은 이 서비스에서의 상태 의미이며, 값별 다음 행동은 이 문서의 상태 표를 확인하세요. 상태가 바뀌면 같은 경로를 다시 조회합니다. 가능한 값은 9가지입니다. AUTH_REQUESTED = 인증 요청만 접수되어 사용자 승인을 기다리는 상태, AUTH_WAITING = 승인 전 대기, AUTH_COMPLETED = 승인은 끝났고 결과 준비 전, COLLECTING = 결과 준비 중, SUCCESS = 정상 완료되어 결과 사용 가능, PARTIAL_SUCCESS = 일부 자료만 준비되어 sources의 항목별 status 확인 필요, FAILED = 서버 처리 실패, AUTH_REJECTED = 사용자가 인증 거부, AUTH_EXPIRED = 승인 유효시간(300초) 만료입니다.

- `data.resultAvailable` (boolean): 결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 결과를 지금 사용할 수 있는 경우, false = 아직 처리 중이거나 실패·만료되어 결과가 없는 경우입니다. false면 data.status를 확인하세요.

- `data.charged` (boolean): 이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이번 조회에서 포인트가 실제로 차감된 경우(유료 결과를 처음 받은 때), false = 이미 차감된 결과를 다시 조회했거나 무료 응답인 경우입니다. api.cost가 0이면 false입니다.

- `data.sources` (array): 자료 항목별 처리 결과 목록입니다. 항목별 성공·실패를 구분하므로 일부만 성공한 응답을 판단할 때 사용합니다.

- `data.sources[].source` (string): 자료 항목의 표시 이름입니다. type과 함께 어떤 자료인지 구분할 때 사용합니다.

- `data.sources[].type` (string): 자료 유형 구분자입니다. 같은 상품 안에서 여러 종류의 자료를 묶어 받을 때 종류를 구분합니다.

- `data.sources[].status` (string): 해당 자료 항목의 처리 상태입니다. SUCCESS는 정상, 그 외 값은 그 항목만 실패했거나 자료가 없음을 뜻합니다. 가능한 값은 2가지입니다. SUCCESS = 해당 자료 항목을 정상적으로 받은 경우, FAILED = 그 항목만 실패해 result에 그 자료가 빠진 경우입니다. 전체 status가 SUCCESS여도 항목별 FAILED가 있을 수 있습니다.

- `data.message` (string): 상태 메시지 (고정값: "인증 대기중입니다."). 안내 문구입니다. 오류 원인과 다음 행동을 설명합니다.

- `data.expiresAt` (string): 이 응답이나 인증 요청의 유효 만료 시각입니다. 한국시간(UTC+09:00) ISO 8601 형식이며, 이 시각을 넘기면 같은 요청을 다시 접수해야 합니다.

- `data.success` (integer): 업무 처리 결과 코드입니다. 1은 정상 결과, 0은 실패 또는 무료 응답입니다. 서비스에 따라 2·3처럼 추가 코드를 쓰므로 같은 응답의 status·msg·error 필드도 함께 확인하세요.

- `data.progress` (object): 결과 준비 진행 상태 묶음입니다. 전체 자료 수와 완료된 자료 수를 담습니다.

- `data.progress.total` (integer): 이번 조회에서 준비할 전체 자료 항목 수입니다. 여러 자료를 묶은 상품에서 진행률 계산의 분모로 사용합니다.

- `data.progress.completed` (integer): 현재까지 준비를 마친 자료 항목 수입니다. total과 같아지면 모든 항목의 처리가 끝난 것입니다.

- `data.checkedAt` (string): 실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다.

- `data.resultExpiresAt` (string): 결과 재조회 만료 시각. 한국시간(UTC+09:00) ISO 8601 입니다.

- `data.result` (object): 조회 결과 본문입니다. 서비스가 찾은 실제 데이터가 들어 있으며, 자료가 없거나 조회에 실패하면 null이거나 필드가 생략됩니다.

- `data.result.etaxAmend` (object): 이 조회 항목의 결과입니다. 항목은 결과 규격을 참고하세요. 하위 필드에 코드·이름·상태 같은 세부 값이 들어 있으며, 자료가 없으면 빈 객체이거나 생략됩니다.

- `data.result.etaxAmend.승인번호` (string): 발급된 수정세금계산서 승인번호 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.작성일자` (string): 작성일자 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.공급받는자상호` (string): 공급받는자 상호 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.공급가액` (integer): 공급가액 합계(원) 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.result.etaxAmend.세액` (integer): 부가가치세 합계(원) 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.result.etaxAmend.합계금액` (integer): 공급가액 + 세액(원) 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.result.etaxAmend.전송상태` (string): 전송 처리 상태 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.기존발급건` (boolean): 같은 요청 키로 이미 발급된 건을 다시 돌려줬는지 true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `data.result.etaxAmend.수정사유코드` (string): 수정사유 코드 1~6 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.수정사유` (string): 수정사유 설명 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.원본승인번호` (string): 수정 대상 원본 승인번호 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.approvals` (integer): 사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다.

- `data.errorCode` (string): 오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED 가능한 값은 4가지입니다. RESULT_EXPIRED = 결과 재조회 기간이 지난 경우(새로 인증해야 함), AUTH_EXPIRED = 승인 유효시간이 지난 경우, AUTH_REJECTED = 사용자가 인증을 거부한 경우, COLLECT_FAILED = 승인 뒤 결과 준비가 실패한 경우입니다. 오류가 없으면 null입니다.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

- `api.pl_id` (integer): 포인트 차감 기록 ID입니다. 차감이 발생한 호출에만 값이 있으며, 과금 내역을 문의할 때 이 번호를 사용합니다. 무과금 응답은 -1·null이거나 필드가 생략됩니다.

## 결과 조회: POST /rest/get_etax_issue



### 입력

- `name` (string, 필수): 조회 대상의 이름입니다. 간편인증·개인 조회에서는 성명, 기업 조회에서는 법인명·상호를 뜻합니다. 생년월일·전화번호 같은 보조 식별자와 함께 확인하세요.

- `birthDate` (string, 필수): 대상자의 생년월일 8자리입니다. 예: 19900101. 주민등록상 생년월일과 같아야 하며, 하이픈·공백은 넣지 않습니다.

- `phone` (string, 필수): 본인 명의 휴대전화 번호입니다. 하이픈 없이 숫자만 입력하며(예: 01012341234), 인증 문자를 받을 수 있는 번호여야 합니다.

- `authProvider` (string, 필수): 사용할 간편인증 수단의 식별자입니다. 예: kakao, naver, toss, pass. 지원 값과 표시 이름은 이 문서의 간편인증 목록을 확인하세요.

- `business_no` (string, 필수): 사업자등록번호 10자리(숫자만). 대표자 본인 확인에 쓰므로 반드시 보냅니다.

- `businessNo` (string, 필수): 발행자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `idempotency_key` (string, 필수): 같은 요청을 다시 보낼 때 중복 접수·과금을 막는 고유 키입니다. 요청 내용이 같으면 같은 키를 유지하고, 내용이 바뀌면 새 키를 만드세요. 키를 생략할 수 있는 API에서 생략하면 같은 요청은 기존 작업으로 처리됩니다.

- `originApprovalNo` (string, 필수): 수정 대상 원본 승인번호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendCode` (string, 필수): 수정사유 코드 1~6 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendReason` (string, 선택): 수정사유 설명 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `buyerNo` (string, 필수): 공급받는자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `buyerName` (string, 필수): 공급받는자 상호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `writtenDate` (string, 선택): 작성일자 8자리(YYYYMMDD). 없으면 오늘 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `items` (array, 필수): 품목 목록(itemName·quantity·unitPrice·supplyAmount·taxAmount)

- `bind_id` (string, 선택): 이전 사업자 조회 결과에서 받은 bind_id. 같은 계정·같은 사업자등록번호이고 유효기간(90일) 안이면 agreed 없이 접수합니다.

- `agreed` (boolean, 조건부): 대표자 본인 확인 동의. bind_id 가 없으면 true 로 보내야 접수됩니다. 빠지면 인증을 보내지 않고 무과금으로 거절합니다. 결과에 대표자명이 있으면 응답의 bind_id 로 다음 조회에 다시 쓸 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `business_type` (string, 선택): 사업자 구분. corporate(법인)는 공동인증서가 필수, personal(개인)은 간편인증·공동인증서 모두 가능. 없으면 personal

- `certificate_id` (string, 선택): 등록한 공동인증서 ID. 없으면 기본 인증서를 쓴다 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `auth_type` (string, 선택): 인증 방식. certificate(공동인증서) 또는 simple(간편인증). 없으면 business_type·certificate_id 로 정한다

- `transactionId` (string, 필수): 인증요청 단계에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId를 그대로 넣어야 하며, 임의 값이나 만료된 ID는 거부됩니다.



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "schemaVersion": {
          "type": "string",
          "description": "결과 스키마 버전 (고정값: \"1.0\")"
        },
        "transactionId": {
          "type": "string",
          "description": "결과 조회에 사용하는 트랜잭션 ID"
        },
        "product": {
          "type": "string",
          "description": "조회 항목 코드. 결과조회에도 같은 값이 오므로 어느 항목의 결과인지 대조할 수 있습니다."
        },
        "status": {
          "type": "string",
          "description": "처리 상태 (AUTH_REQUESTED: 인증 요청 완료)"
        },
        "resultAvailable": {
          "type": "boolean",
          "description": "결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다."
        },
        "charged": {
          "type": "boolean",
          "description": "이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다."
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "status": {
                "type": "string"
              }
            }
          },
          "description": "항상 포함됩니다. 값이 없으면 빈 배열 [] 입니다. 항목이 여러 개인 상품에서 어느 것이 성공·실패했는지 알려줍니다. 각 항목은 source(자료 이름), type(데이터 종류), status(SUCCESS/FAILED). 결과 준비가 끝나기 전에는 아직 확정되지 않은 항목이 FAILED 로 보일 수 있습니다."
        },
        "message": {
          "type": "string",
          "description": "상태 메시지 (고정값: \"인증 대기중입니다.\")"
        },
        "expiresAt": {
          "type": "string",
          "description": "인증 유효 기한(ISO 8601). 이 시각까지 승인하지 못하면 인증 실패 처리됩니다."
        },
        "success": {
          "type": "integer",
          "description": "과금 여부0: 실패 또는 재사용(무과금)1: 발송 성공(과금)"
        },
        "progress": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "completed": {
              "type": "integer"
            }
          },
          "description": "진행률(COLLECTING 일 때). total(전체 항목), completed(완료 항목)"
        },
        "checkedAt": {
          "type": "string",
          "description": "실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다."
        },
        "resultExpiresAt": {
          "type": "string",
          "description": "결과 재조회 만료 시각. 한국시간(UTC+09:00) ISO 8601 입니다."
        },
        "result": {
          "type": "object",
          "properties": {
            "etaxAmend": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "승인번호": {
                  "type": "string",
                  "description": "발급된 수정세금계산서 승인번호"
                },
                "작성일자": {
                  "type": "string",
                  "description": "작성일자"
                },
                "공급받는자상호": {
                  "type": "string",
                  "description": "공급받는자 상호"
                },
                "공급가액": {
                  "type": "integer",
                  "description": "공급가액 합계(원)"
                },
                "세액": {
                  "type": "integer",
                  "description": "부가가치세 합계(원)"
                },
                "합계금액": {
                  "type": "integer",
                  "description": "공급가액 + 세액(원)"
                },
                "전송상태": {
                  "type": "string",
                  "description": "전송 처리 상태"
                },
                "기존발급건": {
                  "type": "boolean",
                  "description": "같은 요청 키로 이미 발급된 건을 다시 돌려줬는지"
                },
                "수정사유코드": {
                  "type": "string",
                  "description": "수정사유 코드 1~6"
                },
                "수정사유": {
                  "type": "string",
                  "description": "수정사유 설명"
                },
                "원본승인번호": {
                  "type": "string",
                  "description": "수정 대상 원본 승인번호"
                }
              },
              "description": "이 조회 항목의 결과입니다. 항목은 결과 규격을 참고하세요."
            }
          },
          "description": "조회된 결과 묶음. 실제 데이터가 있을 때만 포함됩니다."
        },
        "approvals": {
          "type": "integer",
          "description": "사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다."
        },
        "errorCode": {
          "type": "string",
          "description": "오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED"
        }
      },
      "description": "인증 요청 결과"
    },
    "api": {
      "type": "object",
      "properties": {
        "success": {
          "type": "boolean",
          "description": "API 서버 정상 응답 여부"
        },
        "cost": {
          "type": "integer",
          "description": "API 호출 요금"
        },
        "ms": {
          "type": "integer",
          "description": "API 응답 시간"
        },
        "pl_id": {
          "type": "integer",
          "description": "API 결제 로그 ID"
        }
      },
      "description": "API 호출 공통 데이터"
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "AUTH_WAITING",
    "resultAvailable": false,
    "charged": false,
    "sources": [],
    "message": "인증 대기중입니다.",
    "expiresAt": "2026-09-20T05:24:07+09:00",
    "success": 0
  },
  "api": {
    "success": true,
    "cost": 0,
    "ms": 42,
    "pl_id": -1
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "COLLECTING",
    "resultAvailable": false,
    "charged": false,
    "sources": [],
    "progress": {
      "total": 1,
      "completed": 0
    },
    "message": "정보를 조회하고 있습니다.",
    "success": 0
  },
  "api": {
    "success": true,
    "cost": 0,
    "ms": 38,
    "pl_id": -1
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "SUCCESS",
    "resultAvailable": true,
    "charged": true,
    "sources": [
      {
        "source": "수정세금계산서 발급",
        "type": "ETAX_AMEND",
        "status": "SUCCESS"
      }
    ],
    "checkedAt": "2026-09-20T04:47:33+09:00",
    "resultExpiresAt": "2026-09-21T04:47:33+09:00",
    "result": {
      "etaxAmend": {
        "승인번호": "20261026-41000002-12345678",
        "작성일자": "20261026",
        "공급받는자상호": "주식회사 예시",
        "공급가액": 900000,
        "세액": 90000,
        "합계금액": 990000,
        "기존발급건": false,
        "수정사유코드": "2",
        "원본승인번호": "20261001-41000001-12345678"
      }
    },
    "message": "인증이 완료되었습니다.",
    "success": 1
  },
  "api": {
    "success": true,
    "cost": 100,
    "ms": 318,
    "pl_id": 4903
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/get_etax_issue' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'transactionId=9f2c4a7b1d8e35c60a4f7b2d1e9c803a'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("transactionId", "9f2c4a7b1d8e35c60a4f7b2d1e9c803a");
const response = await fetch("https://apick.app/rest/get_etax_issue", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("transactionId", (None, "9f2c4a7b1d8e35c60a4f7b2d1e9c803a")),
]
response = requests.request("POST", "https://apick.app/rest/get_etax_issue",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'transactionId' => '9f2c4a7b1d8e35c60a4f7b2d1e9c803a',
];
$curl = curl_init('https://apick.app/rest/get_etax_issue');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/req_etax_amend 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.schemaVersion` (string): 응답 스키마의 버전입니다. 현재 "1.0"으로 고정되어 있으며, 필드 구조가 바뀌면 값이 올라갑니다. 클라이언트는 이 값을 저장해 두고 파싱 로직을 분기할 수 있습니다.

- `data.transactionId` (string): 간편인증 요청에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId와 같으며, 같은 거래의 결과를 조회하거나 문의할 때 사용합니다. 인증이 만료되면 새 거래를 만들어야 합니다.

- `data.product` (string): 조회한 상품 코드입니다. 인증요청 때 보낸 product와 같은 값이며, 응답의 result 구조를 해석할 때 기준이 됩니다.

- `data.status` (string): 현재 처리 상태 코드입니다. 괄호 안 설명은 이 서비스에서의 상태 의미이며, 값별 다음 행동은 이 문서의 상태 표를 확인하세요. 상태가 바뀌면 같은 경로를 다시 조회합니다. 가능한 값은 9가지입니다. AUTH_REQUESTED = 인증 요청만 접수되어 사용자 승인을 기다리는 상태, AUTH_WAITING = 승인 전 대기, AUTH_COMPLETED = 승인은 끝났고 결과 준비 전, COLLECTING = 결과 준비 중, SUCCESS = 정상 완료되어 결과 사용 가능, PARTIAL_SUCCESS = 일부 자료만 준비되어 sources의 항목별 status 확인 필요, FAILED = 서버 처리 실패, AUTH_REJECTED = 사용자가 인증 거부, AUTH_EXPIRED = 승인 유효시간(300초) 만료입니다.

- `data.resultAvailable` (boolean): 결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 결과를 지금 사용할 수 있는 경우, false = 아직 처리 중이거나 실패·만료되어 결과가 없는 경우입니다. false면 data.status를 확인하세요.

- `data.charged` (boolean): 이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이번 조회에서 포인트가 실제로 차감된 경우(유료 결과를 처음 받은 때), false = 이미 차감된 결과를 다시 조회했거나 무료 응답인 경우입니다. api.cost가 0이면 false입니다.

- `data.sources` (array): 자료 항목별 처리 결과 목록입니다. 항목별 성공·실패를 구분하므로 일부만 성공한 응답을 판단할 때 사용합니다.

- `data.message` (string): 상태 메시지 (고정값: "인증 대기중입니다."). 안내 문구입니다. 오류 원인과 다음 행동을 설명합니다.

- `data.approvals` (integer): 사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다.

- `data.expiresAt` (string): 이 응답이나 인증 요청의 유효 만료 시각입니다. 한국시간(UTC+09:00) ISO 8601 형식이며, 이 시각을 넘기면 같은 요청을 다시 접수해야 합니다.

- `data.success` (integer): 업무 처리 결과 코드입니다. 1은 정상 결과, 0은 실패 또는 무료 응답입니다. 서비스에 따라 2·3처럼 추가 코드를 쓰므로 같은 응답의 status·msg·error 필드도 함께 확인하세요.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

- `api.pl_id` (integer): 포인트 차감 기록 ID입니다. 차감이 발생한 호출에만 값이 있으며, 과금 내역을 문의할 때 이 번호를 사용합니다. 무과금 응답은 -1·null이거나 필드가 생략됩니다.

## 인증 요청: POST /rest/req_etax_amend



### 입력

- `name` (string, 필수): 조회 대상의 이름입니다. 간편인증·개인 조회에서는 성명, 기업 조회에서는 법인명·상호를 뜻합니다. 생년월일·전화번호 같은 보조 식별자와 함께 확인하세요.

- `birthDate` (string, 필수): 대상자의 생년월일 8자리입니다. 예: 19900101. 주민등록상 생년월일과 같아야 하며, 하이픈·공백은 넣지 않습니다.

- `phone` (string, 필수): 본인 명의 휴대전화 번호입니다. 하이픈 없이 숫자만 입력하며(예: 01012341234), 인증 문자를 받을 수 있는 번호여야 합니다.

- `authProvider` (string, 필수): 사용할 간편인증 수단의 식별자입니다. 예: kakao, naver, toss, pass. 지원 값과 표시 이름은 이 문서의 간편인증 목록을 확인하세요.

- `business_no` (string, 필수): 사업자등록번호 10자리(숫자만). 대표자 본인 확인에 쓰므로 반드시 보냅니다.

- `businessNo` (string, 필수): 발행자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `idempotency_key` (string, 필수): 같은 요청을 다시 보낼 때 중복 접수·과금을 막는 고유 키입니다. 요청 내용이 같으면 같은 키를 유지하고, 내용이 바뀌면 새 키를 만드세요. 키를 생략할 수 있는 API에서 생략하면 같은 요청은 기존 작업으로 처리됩니다.

- `originApprovalNo` (string, 필수): 수정 대상 원본 승인번호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendCode` (string, 필수): 수정사유 코드 1~6 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendReason` (string, 선택): 수정사유 설명 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `buyerNo` (string, 필수): 공급받는자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `buyerName` (string, 필수): 공급받는자 상호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `writtenDate` (string, 선택): 작성일자 8자리(YYYYMMDD). 없으면 오늘 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `items` (array, 필수): 품목 목록(itemName·quantity·unitPrice·supplyAmount·taxAmount)

- `bind_id` (string, 선택): 이전 사업자 조회 결과에서 받은 bind_id. 같은 계정·같은 사업자등록번호이고 유효기간(90일) 안이면 agreed 없이 접수합니다.

- `agreed` (boolean, 조건부): 대표자 본인 확인 동의. bind_id 가 없으면 true 로 보내야 접수됩니다. 빠지면 인증을 보내지 않고 무과금으로 거절합니다. 결과에 대표자명이 있으면 응답의 bind_id 로 다음 조회에 다시 쓸 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `business_type` (string, 선택): 사업자 구분. corporate(법인)는 공동인증서가 필수, personal(개인)은 간편인증·공동인증서 모두 가능. 없으면 personal

- `certificate_id` (string, 선택): 등록한 공동인증서 ID. 없으면 기본 인증서를 쓴다 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `auth_type` (string, 선택): 인증 방식. certificate(공동인증서) 또는 simple(간편인증). 없으면 business_type·certificate_id 로 정한다



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "schemaVersion": {
          "type": "string",
          "description": "결과 스키마 버전 (고정값: \"1.0\")"
        },
        "transactionId": {
          "type": "string",
          "description": "결과 조회에 사용하는 트랜잭션 ID"
        },
        "product": {
          "type": "string",
          "description": "조회 항목 코드. 결과조회에도 같은 값이 오므로 어느 항목의 결과인지 대조할 수 있습니다."
        },
        "status": {
          "type": "string",
          "description": "처리 상태 (AUTH_REQUESTED: 인증 요청 완료)"
        },
        "resultAvailable": {
          "type": "boolean",
          "description": "결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다."
        },
        "charged": {
          "type": "boolean",
          "description": "이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다."
        },
        "sources": {
          "type": "array",
          "items": {}
        },
        "message": {
          "type": "string",
          "description": "상태 메시지 (고정값: \"인증 대기중입니다.\")"
        },
        "approvals": {
          "type": "integer",
          "description": "사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다."
        },
        "expiresAt": {
          "type": "string",
          "description": "인증 유효 기한(ISO 8601). 이 시각까지 승인하지 못하면 인증 실패 처리됩니다."
        },
        "success": {
          "type": "integer",
          "description": "과금 여부0: 실패 또는 재사용(무과금)1: 발송 성공(과금)"
        }
      },
      "description": "인증 요청 결과"
    },
    "api": {
      "type": "object",
      "properties": {
        "success": {
          "type": "boolean",
          "description": "API 서버 정상 응답 여부"
        },
        "cost": {
          "type": "integer",
          "description": "API 호출 요금"
        },
        "ms": {
          "type": "integer",
          "description": "API 응답 시간"
        },
        "pl_id": {
          "type": "integer",
          "description": "API 결제 로그 ID"
        }
      },
      "description": "API 호출 공통 데이터"
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "AUTH_REQUESTED",
    "resultAvailable": false,
    "charged": true,
    "sources": [],
    "message": "인증 대기중입니다.",
    "approvals": 1,
    "expiresAt": "2026-09-20T05:24:07+09:00",
    "success": 1
  },
  "api": {
    "success": true,
    "cost": 20,
    "ms": 1284,
    "pl_id": 4902
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/req_etax_amend' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'business_type=corporate' \
  --form-string 'certificate_id=123' \
  --form-string 'businessNo=1234567890' \
  --form-string 'idempotency_key=cancel-20261027-0001' \
  --form-string 'originApprovalNo=20261027-41000001-12345678' \
  --form-string 'amendCode=4' \
  --form-string 'buyerNo=2208101733' \
  --form-string 'buyerName=주식회사 예시' \
  --form-string 'writtenDate=20261027' \
  --form-string 'items=[{"itemName":"자문 용역","quantity":1,"unitPrice":1000000,"supplyAmount":1000000,"taxAmount":100000}]'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("business_type", "corporate");
form.append("certificate_id", "123");
form.append("businessNo", "1234567890");
form.append("idempotency_key", "cancel-20261027-0001");
form.append("originApprovalNo", "20261027-41000001-12345678");
form.append("amendCode", "4");
form.append("buyerNo", "2208101733");
form.append("buyerName", "주식회사 예시");
form.append("writtenDate", "20261027");
form.append("items", "[{\"itemName\":\"자문 용역\",\"quantity\":1,\"unitPrice\":1000000,\"supplyAmount\":1000000,\"taxAmount\":100000}]");
const response = await fetch("https://apick.app/rest/req_etax_amend", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("business_type", (None, "corporate")),
    ("certificate_id", (None, "123")),
    ("businessNo", (None, "1234567890")),
    ("idempotency_key", (None, "cancel-20261027-0001")),
    ("originApprovalNo", (None, "20261027-41000001-12345678")),
    ("amendCode", (None, "4")),
    ("buyerNo", (None, "2208101733")),
    ("buyerName", (None, "주식회사 예시")),
    ("writtenDate", (None, "20261027")),
    ("items", (None, "[{\"itemName\":\"자문 용역\",\"quantity\":1,\"unitPrice\":1000000,\"supplyAmount\":1000000,\"taxAmount\":100000}]")),
]
response = requests.request("POST", "https://apick.app/rest/req_etax_amend",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'business_type' => 'corporate',
    'certificate_id' => '123',
    'businessNo' => '1234567890',
    'idempotency_key' => 'cancel-20261027-0001',
    'originApprovalNo' => '20261027-41000001-12345678',
    'amendCode' => '4',
    'buyerNo' => '2208101733',
    'buyerName' => '주식회사 예시',
    'writtenDate' => '20261027',
    'items' => '[{"itemName":"자문 용역","quantity":1,"unitPrice":1000000,"supplyAmount":1000000,"taxAmount":100000}]',
];
$curl = curl_init('https://apick.app/rest/req_etax_amend');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/req_etax_sales_list 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.schemaVersion` (string): 응답 스키마의 버전입니다. 현재 "1.0"으로 고정되어 있으며, 필드 구조가 바뀌면 값이 올라갑니다. 클라이언트는 이 값을 저장해 두고 파싱 로직을 분기할 수 있습니다.

- `data.transactionId` (string): 간편인증 요청에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId와 같으며, 같은 거래의 결과를 조회하거나 문의할 때 사용합니다. 인증이 만료되면 새 거래를 만들어야 합니다.

- `data.product` (string): 조회한 상품 코드입니다. 인증요청 때 보낸 product와 같은 값이며, 응답의 result 구조를 해석할 때 기준이 됩니다.

- `data.status` (string): 현재 처리 상태 코드입니다. 괄호 안 설명은 이 서비스에서의 상태 의미이며, 값별 다음 행동은 이 문서의 상태 표를 확인하세요. 상태가 바뀌면 같은 경로를 다시 조회합니다. 가능한 값은 9가지입니다. AUTH_REQUESTED = 인증 요청만 접수되어 사용자 승인을 기다리는 상태, AUTH_WAITING = 승인 전 대기, AUTH_COMPLETED = 승인은 끝났고 결과 준비 전, COLLECTING = 결과 준비 중, SUCCESS = 정상 완료되어 결과 사용 가능, PARTIAL_SUCCESS = 일부 자료만 준비되어 sources의 항목별 status 확인 필요, FAILED = 서버 처리 실패, AUTH_REJECTED = 사용자가 인증 거부, AUTH_EXPIRED = 승인 유효시간(300초) 만료입니다.

- `data.resultAvailable` (boolean): 결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 결과를 지금 사용할 수 있는 경우, false = 아직 처리 중이거나 실패·만료되어 결과가 없는 경우입니다. false면 data.status를 확인하세요.

- `data.charged` (boolean): 이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이번 조회에서 포인트가 실제로 차감된 경우(유료 결과를 처음 받은 때), false = 이미 차감된 결과를 다시 조회했거나 무료 응답인 경우입니다. api.cost가 0이면 false입니다.

- `data.sources` (array): 자료 항목별 처리 결과 목록입니다. 항목별 성공·실패를 구분하므로 일부만 성공한 응답을 판단할 때 사용합니다.

- `data.message` (string): 상태 메시지 (고정값: "인증 대기중입니다."). 안내 문구입니다. 오류 원인과 다음 행동을 설명합니다.

- `data.approvals` (integer): 사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다.

- `data.expiresAt` (string): 이 응답이나 인증 요청의 유효 만료 시각입니다. 한국시간(UTC+09:00) ISO 8601 형식이며, 이 시각을 넘기면 같은 요청을 다시 접수해야 합니다.

- `data.success` (integer): 업무 처리 결과 코드입니다. 1은 정상 결과, 0은 실패 또는 무료 응답입니다. 서비스에 따라 2·3처럼 추가 코드를 쓰므로 같은 응답의 status·msg·error 필드도 함께 확인하세요.

- `data.progress` (object): 결과 준비 진행 상태 묶음입니다. 전체 자료 수와 완료된 자료 수를 담습니다.

- `data.checkedAt` (string): 실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다.

- `data.errorCode` (string): 오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED 가능한 값은 4가지입니다. RESULT_EXPIRED = 결과 재조회 기간이 지난 경우(새로 인증해야 함), AUTH_EXPIRED = 승인 유효시간이 지난 경우, AUTH_REJECTED = 사용자가 인증을 거부한 경우, COLLECT_FAILED = 승인 뒤 결과 준비가 실패한 경우입니다. 오류가 없으면 null입니다.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

- `api.pl_id` (integer): 포인트 차감 기록 ID입니다. 차감이 발생한 호출에만 값이 있으며, 과금 내역을 문의할 때 이 번호를 사용합니다. 무과금 응답은 -1·null이거나 필드가 생략됩니다.

## 인증 요청: POST /rest/req_etax_sales_list



### 입력

- `name` (string, 필수): 조회 대상의 이름입니다. 간편인증·개인 조회에서는 성명, 기업 조회에서는 법인명·상호를 뜻합니다. 생년월일·전화번호 같은 보조 식별자와 함께 확인하세요.

- `birthDate` (string, 필수): 대상자의 생년월일 8자리입니다. 예: 19900101. 주민등록상 생년월일과 같아야 하며, 하이픈·공백은 넣지 않습니다.

- `phone` (string, 필수): 본인 명의 휴대전화 번호입니다. 하이픈 없이 숫자만 입력하며(예: 01012341234), 인증 문자를 받을 수 있는 번호여야 합니다.

- `authProvider` (string, 필수): 사용할 간편인증 수단의 식별자입니다. 예: kakao, naver, toss, pass. 지원 값과 표시 이름은 이 문서의 간편인증 목록을 확인하세요.

- `business_no` (string, 필수): 사업자등록번호 10자리(숫자만). 대표자 본인 확인에 쓰므로 반드시 보냅니다.

- `businessNo` (string, 필수): 발행자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `idempotency_key` (string, 필수): 같은 요청을 다시 보낼 때 중복 접수·과금을 막는 고유 키입니다. 요청 내용이 같으면 같은 키를 유지하고, 내용이 바뀌면 새 키를 만드세요. 키를 생략할 수 있는 API에서 생략하면 같은 요청은 기존 작업으로 처리됩니다.

- `originApprovalNo` (string, 필수): 수정 대상 원본 승인번호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendCode` (string, 필수): 수정사유 코드 1~6 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `amendReason` (string, 선택): 수정사유 설명 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `buyerNo` (string, 필수): 공급받는자 사업자등록번호 10자리 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `buyerName` (string, 필수): 공급받는자 상호 문자열로 보내며, 빼거나 빈 값으로 보내면 요청이 거부됩니다.

- `writtenDate` (string, 선택): 작성일자 8자리(YYYYMMDD). 없으면 오늘 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `items` (array, 필수): 품목 목록(itemName·quantity·unitPrice·supplyAmount·taxAmount)

- `bind_id` (string, 선택): 이전 사업자 조회 결과에서 받은 bind_id. 같은 계정·같은 사업자등록번호이고 유효기간(90일) 안이면 agreed 없이 접수합니다.

- `agreed` (boolean, 조건부): 대표자 본인 확인 동의. bind_id 가 없으면 true 로 보내야 접수됩니다. 빠지면 인증을 보내지 않고 무과금으로 거절합니다. 결과에 대표자명이 있으면 응답의 bind_id 로 다음 조회에 다시 쓸 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `business_type` (string, 선택): 사업자 구분. corporate(법인)는 공동인증서가 필수, personal(개인)은 간편인증·공동인증서 모두 가능. 없으면 personal

- `certificate_id` (string, 선택): 등록한 공동인증서 ID. 없으면 기본 인증서를 쓴다 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `auth_type` (string, 선택): 인증 방식. certificate(공동인증서) 또는 simple(간편인증). 없으면 business_type·certificate_id 로 정한다

- `transactionId` (string, 필수): 인증요청 단계에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId를 그대로 넣어야 하며, 임의 값이나 만료된 ID는 거부됩니다.



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "schemaVersion": {
          "type": "string",
          "description": "결과 스키마 버전 (고정값: \"1.0\")"
        },
        "transactionId": {
          "type": "string",
          "description": "결과 조회에 사용하는 트랜잭션 ID"
        },
        "product": {
          "type": "string",
          "description": "조회 항목 코드. 결과조회에도 같은 값이 오므로 어느 항목의 결과인지 대조할 수 있습니다."
        },
        "status": {
          "type": "string",
          "description": "처리 상태 (AUTH_REQUESTED: 인증 요청 완료)"
        },
        "resultAvailable": {
          "type": "boolean",
          "description": "결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다."
        },
        "charged": {
          "type": "boolean",
          "description": "이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다."
        },
        "sources": {
          "type": "array",
          "items": {},
          "description": "항상 포함됩니다. 값이 없으면 빈 배열 [] 입니다. 항목이 여러 개인 상품에서 어느 것이 성공·실패했는지 알려줍니다. 각 항목은 source(자료 이름), type(데이터 종류), status(SUCCESS/FAILED). 결과 준비가 끝나기 전에는 아직 확정되지 않은 항목이 FAILED 로 보일 수 있습니다."
        },
        "message": {
          "type": "string",
          "description": "상태 메시지 (고정값: \"인증 대기중입니다.\")"
        },
        "approvals": {
          "type": "integer",
          "description": "사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다."
        },
        "expiresAt": {
          "type": "string",
          "description": "인증 유효 기한(ISO 8601). 이 시각까지 승인하지 못하면 인증 실패 처리됩니다."
        },
        "success": {
          "type": "integer",
          "description": "과금 여부0: 실패 또는 재사용(무과금)1: 발송 성공(과금)"
        },
        "progress": {
          "type": "object",
          "description": "진행률(COLLECTING 일 때). total(전체 항목), completed(완료 항목)"
        },
        "checkedAt": {
          "type": "string",
          "description": "실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다."
        },
        "errorCode": {
          "type": "string",
          "description": "오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED"
        }
      },
      "description": "인증 요청 결과"
    },
    "api": {
      "type": "object",
      "properties": {
        "success": {
          "type": "boolean",
          "description": "API 서버 정상 응답 여부"
        },
        "cost": {
          "type": "integer",
          "description": "API 호출 요금"
        },
        "ms": {
          "type": "integer",
          "description": "API 응답 시간"
        },
        "pl_id": {
          "type": "integer",
          "description": "API 결제 로그 ID"
        }
      },
      "description": "API 호출 공통 데이터"
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "AUTH_REQUESTED",
    "resultAvailable": false,
    "charged": true,
    "sources": [],
    "message": "인증 대기중입니다.",
    "approvals": 1,
    "expiresAt": "2026-09-20T05:24:07+09:00",
    "success": 1
  },
  "api": {
    "success": true,
    "cost": 20,
    "ms": 1284,
    "pl_id": 4902
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/req_etax_sales_list' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'business_type=corporate' \
  --form-string 'certificate_id=123' \
  --form-string 'businessNo=1234567890' \
  --form-string 'from=20260701' \
  --form-string 'to=20260930'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("business_type", "corporate");
form.append("certificate_id", "123");
form.append("businessNo", "1234567890");
form.append("from", "20260701");
form.append("to", "20260930");
const response = await fetch("https://apick.app/rest/req_etax_sales_list", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("business_type", (None, "corporate")),
    ("certificate_id", (None, "123")),
    ("businessNo", (None, "1234567890")),
    ("from", (None, "20260701")),
    ("to", (None, "20260930")),
]
response = requests.request("POST", "https://apick.app/rest/req_etax_sales_list",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'business_type' => 'corporate',
    'certificate_id' => '123',
    'businessNo' => '1234567890',
    'from' => '20260701',
    'to' => '20260930',
];
$curl = curl_init('https://apick.app/rest/req_etax_sales_list');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/get_etax_amend 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.schemaVersion` (string): 응답 스키마의 버전입니다. 현재 "1.0"으로 고정되어 있으며, 필드 구조가 바뀌면 값이 올라갑니다. 클라이언트는 이 값을 저장해 두고 파싱 로직을 분기할 수 있습니다.

- `data.transactionId` (string): 간편인증 요청에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId와 같으며, 같은 거래의 결과를 조회하거나 문의할 때 사용합니다. 인증이 만료되면 새 거래를 만들어야 합니다.

- `data.product` (string): 조회한 상품 코드입니다. 인증요청 때 보낸 product와 같은 값이며, 응답의 result 구조를 해석할 때 기준이 됩니다.

- `data.status` (string): 현재 처리 상태 코드입니다. 괄호 안 설명은 이 서비스에서의 상태 의미이며, 값별 다음 행동은 이 문서의 상태 표를 확인하세요. 상태가 바뀌면 같은 경로를 다시 조회합니다. 가능한 값은 9가지입니다. AUTH_REQUESTED = 인증 요청만 접수되어 사용자 승인을 기다리는 상태, AUTH_WAITING = 승인 전 대기, AUTH_COMPLETED = 승인은 끝났고 결과 준비 전, COLLECTING = 결과 준비 중, SUCCESS = 정상 완료되어 결과 사용 가능, PARTIAL_SUCCESS = 일부 자료만 준비되어 sources의 항목별 status 확인 필요, FAILED = 서버 처리 실패, AUTH_REJECTED = 사용자가 인증 거부, AUTH_EXPIRED = 승인 유효시간(300초) 만료입니다.

- `data.resultAvailable` (boolean): 실제 결과 포함 여부. 과금 여부도 이 값으로 결정됩니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 결과를 지금 사용할 수 있는 경우, false = 아직 처리 중이거나 실패·만료되어 결과가 없는 경우입니다. false면 data.status를 확인하세요.

- `data.charged` (boolean): 이번 호출의 과금 발생 여부. 최초 결과 반환에서만 true 입니다. true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이번 조회에서 포인트가 실제로 차감된 경우(유료 결과를 처음 받은 때), false = 이미 차감된 결과를 다시 조회했거나 무료 응답인 경우입니다. api.cost가 0이면 false입니다.

- `data.sources` (array): 자료 항목별 처리 결과 목록입니다. 항목별 성공·실패를 구분하므로 일부만 성공한 응답을 판단할 때 사용합니다.

- `data.sources[].source` (string): 자료 항목의 표시 이름입니다. type과 함께 어떤 자료인지 구분할 때 사용합니다.

- `data.sources[].type` (string): 자료 유형 구분자입니다. 같은 상품 안에서 여러 종류의 자료를 묶어 받을 때 종류를 구분합니다.

- `data.sources[].status` (string): 해당 자료 항목의 처리 상태입니다. SUCCESS는 정상, 그 외 값은 그 항목만 실패했거나 자료가 없음을 뜻합니다. 가능한 값은 2가지입니다. SUCCESS = 해당 자료 항목을 정상적으로 받은 경우, FAILED = 그 항목만 실패해 result에 그 자료가 빠진 경우입니다. 전체 status가 SUCCESS여도 항목별 FAILED가 있을 수 있습니다.

- `data.message` (string): 안내 문구입니다. 오류 원인과 다음 행동을 설명합니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.expiresAt` (string): 이 응답이나 인증 요청의 유효 만료 시각입니다. 한국시간(UTC+09:00) ISO 8601 형식이며, 이 시각을 넘기면 같은 요청을 다시 접수해야 합니다.

- `data.success` (integer): 업무 처리 결과 코드입니다. 1은 정상 결과, 0은 실패 또는 무료 응답입니다. 서비스에 따라 2·3처럼 추가 코드를 쓰므로 같은 응답의 status·msg·error 필드도 함께 확인하세요.

- `data.progress` (object): 결과 준비 진행 상태 묶음입니다. 전체 자료 수와 완료된 자료 수를 담습니다.

- `data.progress.total` (integer): 이번 조회에서 준비할 전체 자료 항목 수입니다. 여러 자료를 묶은 상품에서 진행률 계산의 분모로 사용합니다.

- `data.progress.completed` (integer): 현재까지 준비를 마친 자료 항목 수입니다. total과 같아지면 모든 항목의 처리가 끝난 것입니다.

- `data.checkedAt` (string): 실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다.

- `data.resultExpiresAt` (string): 결과 재조회 만료 시각. 한국시간(UTC+09:00) ISO 8601 입니다.

- `data.result` (object): 조회 결과 본문입니다. 서비스가 찾은 실제 데이터가 들어 있으며, 자료가 없거나 조회에 실패하면 null이거나 필드가 생략됩니다.

- `data.result.etaxAmend` (object): 이 조회 항목의 결과입니다. 항목은 결과 규격을 참고하세요. 하위 필드에 코드·이름·상태 같은 세부 값이 들어 있으며, 자료가 없으면 빈 객체이거나 생략됩니다.

- `data.result.etaxAmend.승인번호` (string): 발급된 수정세금계산서 승인번호 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.작성일자` (string): 작성일자 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.공급받는자상호` (string): 공급받는자 상호 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.공급가액` (integer): 공급가액 합계(원) 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.result.etaxAmend.세액` (integer): 부가가치세 합계(원) 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.result.etaxAmend.합계금액` (integer): 공급가액 + 세액(원) 숫자로 오며, 단위·범위는 같은 응답의 다른 필드나 이 문서의 설명을 확인하세요.

- `data.result.etaxAmend.전송상태` (string): 전송 처리 상태 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.기존발급건` (boolean): 같은 요청 키로 이미 발급된 건을 다시 돌려줬는지 true/false로 오며, 값이 없으면 필드가 생략되거나 null일 수 있습니다. true = 이 필드가 나타내는 조건이 성립한 경우, false = 성립하지 않은 경우입니다. 두 값 모두 정상 응답에 올 수 있으며, 값이 없으면 필드가 생략되거나 null일 수 있습니다.

- `data.result.etaxAmend.수정사유코드` (string): 수정사유 코드 1~6 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.수정사유` (string): 수정사유 설명 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.result.etaxAmend.원본승인번호` (string): 수정 대상 원본 승인번호 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요.

- `data.errorCode` (string): 오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED 가능한 값은 4가지입니다. RESULT_EXPIRED = 결과 재조회 기간이 지난 경우(새로 인증해야 함), AUTH_EXPIRED = 승인 유효시간이 지난 경우, AUTH_REJECTED = 사용자가 인증을 거부한 경우, COLLECT_FAILED = 승인 뒤 결과 준비가 실패한 경우입니다. 오류가 없으면 null입니다.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

- `api.pl_id` (integer): 포인트 차감 기록 ID입니다. 차감이 발생한 호출에만 값이 있으며, 과금 내역을 문의할 때 이 번호를 사용합니다. 무과금 응답은 -1·null이거나 필드가 생략됩니다.

## 결과 조회: POST /rest/get_etax_amend



### 입력

- `transactionId` (string, 필수): 인증요청 단계에서 발급된 거래 ID입니다. 인증요청 응답의 transactionId를 그대로 넣어야 하며, 임의 값이나 만료된 ID는 거부됩니다.



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "schemaVersion": {
          "type": "string",
          "description": "결과 스키마 버전 (고정값: \"1.0\")"
        },
        "transactionId": {
          "type": "string",
          "description": "트랜잭션 ID"
        },
        "product": {
          "type": "string",
          "description": "조회 항목 코드. 인증요청 응답과 같은 값입니다."
        },
        "status": {
          "type": "string",
          "description": "처리 상태 (위 표 참고)"
        },
        "resultAvailable": {
          "type": "boolean",
          "description": "실제 결과 포함 여부. 과금 여부도 이 값으로 결정됩니다."
        },
        "charged": {
          "type": "boolean",
          "description": "이번 호출의 과금 발생 여부. 최초 결과 반환에서만 true 입니다."
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "status": {
                "type": "string"
              }
            }
          },
          "description": "항상 포함됩니다. 값이 없으면 빈 배열 [] 입니다. 항목이 여러 개인 상품에서 어느 것이 성공·실패했는지 알려줍니다. 각 항목은 source(자료 이름), type(데이터 종류), status(SUCCESS/FAILED). 결과 준비가 끝나기 전에는 아직 확정되지 않은 항목이 FAILED 로 보일 수 있습니다."
        },
        "message": {
          "type": "string",
          "description": "상태 메시지"
        },
        "expiresAt": {
          "type": "string"
        },
        "success": {
          "type": "integer",
          "description": "과금 여부0: 결과 없음 또는 재조회(무과금)1: 최초 결과 반환(과금)"
        },
        "progress": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "completed": {
              "type": "integer"
            }
          },
          "description": "진행률(COLLECTING 일 때). total(전체 항목), completed(완료 항목)"
        },
        "checkedAt": {
          "type": "string",
          "description": "실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다."
        },
        "resultExpiresAt": {
          "type": "string",
          "description": "결과 재조회 만료 시각. 한국시간(UTC+09:00) ISO 8601 입니다."
        },
        "result": {
          "type": "object",
          "properties": {
            "etaxAmend": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "승인번호": {
                  "type": "string",
                  "description": "발급된 수정세금계산서 승인번호"
                },
                "작성일자": {
                  "type": "string",
                  "description": "작성일자"
                },
                "공급받는자상호": {
                  "type": "string",
                  "description": "공급받는자 상호"
                },
                "공급가액": {
                  "type": "integer",
                  "description": "공급가액 합계(원)"
                },
                "세액": {
                  "type": "integer",
                  "description": "부가가치세 합계(원)"
                },
                "합계금액": {
                  "type": "integer",
                  "description": "공급가액 + 세액(원)"
                },
                "전송상태": {
                  "type": "string",
                  "description": "전송 처리 상태"
                },
                "기존발급건": {
                  "type": "boolean",
                  "description": "같은 요청 키로 이미 발급된 건을 다시 돌려줬는지"
                },
                "수정사유코드": {
                  "type": "string",
                  "description": "수정사유 코드 1~6"
                },
                "수정사유": {
                  "type": "string",
                  "description": "수정사유 설명"
                },
                "원본승인번호": {
                  "type": "string",
                  "description": "수정 대상 원본 승인번호"
                }
              },
              "description": "이 조회 항목의 결과입니다. 항목은 결과 규격을 참고하세요."
            }
          },
          "description": "조회된 결과 묶음. 실제 데이터가 있을 때만 포함됩니다."
        },
        "errorCode": {
          "type": "string",
          "description": "오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED"
        }
      },
      "description": "상태·결과"
    },
    "api": {
      "type": "object",
      "properties": {
        "success": {
          "type": "boolean",
          "description": "API 서버 정상 응답 여부"
        },
        "cost": {
          "type": "integer",
          "description": "API 호출 요금"
        },
        "ms": {
          "type": "integer",
          "description": "API 응답 시간"
        },
        "pl_id": {
          "type": "integer",
          "description": "API 결제 로그 ID"
        }
      },
      "description": "API 호출 공통 데이터"
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "AUTH_WAITING",
    "resultAvailable": false,
    "charged": false,
    "sources": [],
    "message": "인증 대기중입니다.",
    "expiresAt": "2026-09-20T05:24:07+09:00",
    "success": 0
  },
  "api": {
    "success": true,
    "cost": 0,
    "ms": 42,
    "pl_id": -1
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "COLLECTING",
    "resultAvailable": false,
    "charged": false,
    "sources": [],
    "progress": {
      "total": 1,
      "completed": 0
    },
    "message": "정보를 조회하고 있습니다.",
    "success": 0
  },
  "api": {
    "success": true,
    "cost": 0,
    "ms": 38,
    "pl_id": -1
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "schemaVersion": "1.0",
    "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a",
    "product": "etax_amend",
    "status": "SUCCESS",
    "resultAvailable": true,
    "charged": true,
    "sources": [
      {
        "source": "수정세금계산서 발급",
        "type": "ETAX_AMEND",
        "status": "SUCCESS"
      }
    ],
    "checkedAt": "2026-09-20T04:47:33+09:00",
    "resultExpiresAt": "2026-09-21T04:47:33+09:00",
    "result": {
      "etaxAmend": {
        "승인번호": "20261026-41000002-12345678",
        "작성일자": "20261026",
        "공급받는자상호": "주식회사 예시",
        "공급가액": 900000,
        "세액": 90000,
        "합계금액": 990000,
        "기존발급건": false,
        "수정사유코드": "2",
        "원본승인번호": "20261001-41000001-12345678"
      }
    },
    "message": "인증이 완료되었습니다.",
    "success": 1
  },
  "api": {
    "success": true,
    "cost": 100,
    "ms": 318,
    "pl_id": 4903
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/get_etax_amend' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'transactionId=9f2c4a7b1d8e35c60a4f7b2d1e9c803a'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("transactionId", "9f2c4a7b1d8e35c60a4f7b2d1e9c803a");
const response = await fetch("https://apick.app/rest/get_etax_amend", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("transactionId", (None, "9f2c4a7b1d8e35c60a4f7b2d1e9c803a")),
]
response = requests.request("POST", "https://apick.app/rest/get_etax_amend",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'transactionId' => '9f2c4a7b1d8e35c60a4f7b2d1e9c803a',
];
$curl = curl_init('https://apick.app/rest/get_etax_amend');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## 코드·오류

## 상세 기능·요금

먼저 정할 것 — 간편인증인가, 공동인증서인가 전자세금계산서는 발행 사업자 명의로 나갑니다. 인증 방식은 사업자 구분으로 정해집니다. 사업자 구분쓸 수 있는 인증요청에 넣는 값 법인 공동인증서만 됩니다. 간편인증으로는 발급되지 않습니다. business_type=corporate + certificate_id 개인사업자 간편인증 또는 공동인증서 중 편한 쪽 간편인증: name·birthday·phone·provider공동인증서: business_type=personal + certificate_id 법인이 auth_type=simple 로 요청하면 발송 전에 SIMPLE_AUTH_CERT_REQUIRED(400, 무과금)로 끝납니다. 인증 요청이 나가지 않으므로 비용이 발생하지 않습니다. 법인 준비 순서 — 인증서 등록부터 첫 발급까지 아래 순서를 그대로 따라가면 됩니다. 1~4단계는 한 번만 하면 되고, 5단계부터가 실제 발급 호출입니다. 순서할 일호출·화면 1 회원가입 후 API 인증키를 확인합니다. 모든 호출은 이 키로 인증합니다. Authorization: Bearer <API_KEY> 2 법인 공동인증서를 인증서 파일과 개인키 파일로 준비합니다. 인증서 비밀번호도 필요합니다. 인증서 관리 화면 /etax/certificates 3 인증서를 등록합니다. 등록 응답의 certificate_id 를 다음 호출에 계속 씁니다. 첫 등록은 자동으로 기본 인증서가 됩니다. POST /main/rest/etax_certificates/uploadmultipart: cert_file·key_file·password·label 4 등록한 인증서로 로그인이 되는지 먼저 확인합니다. 여기서 실패하면 발급도 실패하므로 반드시 먼저 확인하세요. POST /main/rest/etax_certificates/verify{"certificate_id": 123} 5 발급을 접수합니다. 이 응답의 transactionId 를 6단계에 그대로 씁니다. POST /rest/req_etax_issue 6 결과를 조회해 승인번호를 받습니다. 이 승인번호가 발급 사실의 근거입니다. POST /rest/get_etax_issue{"transactionId": "..."} 3단계 · 인증서 등록 요청 cert_file 은 인증서 파일, key_file 은 개인키 파일입니다. 두 파일과 비밀번호는 등록 직후 복호화해 보관하며 응답에 다시 나오지 않습니다. form-data 전체 예제 보기 응답의 data.certificate.certificate_id 를 기록해 둡니다. 이 값이 이후 모든 호출의 연결고리입니다. 등록 목록은 GET /main/rest/etax_certificates/list 로 언제든 확인할 수 있습니다. 하려는 일호출본문 등록 목록·기본 인증서 확인 GET /main/rest/etax_certificates/list 없음 기본 인증서 바꾸기 POST /main/rest/etax_certificates/default {"certificate_id": 123} 등록한 인증서 삭제 POST /main/rest/etax_certificates/delete {"certificate_id": 123} certificate_id 는 세션 로그인 계정에 귀속됩니다. API 인증키가 같은 계정의 키여야 그 인증서를 쓸 수 있습니다. 발급 요청에서 certificate_id 를 빼면 그 계정의 기본 인증서를 씁니다. 4단계 · 로그인 확인 form-data 전체 예제 보기 성공하면 확인된 사업자 정보가 가린 형태로 돌아옵니다. 실패하면 CERT_LOGIN_FAILED(424)이며, 인증서·비밀번호·발행 사업자를 확인해 다시 등록합니다. 이 단계가 통과해야 발급을 호출하세요. 발급 호출 — 두 번 부르면 끝 법인 공동인증서는 휴대폰 승인이 없습니다. 접수 응답을 받은 뒤 곧바로 결과조회를 부르면 됩니다. 개인 간편인증은 그 사이에 사용자가 휴대폰에서 승인합니다. 단계엔드포인트무엇을 넣나무엇이 나오나 접수 /rest/req_etax_issue business_type=corporate·certificate_id·businessNo·idempotency_key·buyerNo·buyerName·items transactionId 결과 /rest/get_etax_issue transactionId 승인번호·합계금액·전송상태 접수 예시 — 품목 1건 form-data 전체 예제 보기 supplyAmount·taxAmount 는 품목별로 넣고, 합계는 서버가 계산합니다. 합계를 따로 보낼 때는 품목 합계와 같아야 하며 다르면 ETAX_ISSUE_SUPPLY_MISMATCH(400, 무과금)로 거절됩니다. idempotency_key 는 발급 1건당 하나입니다. 같은 키로 다시 부르면 새로 발급하지 않고 이미 발급된 결과를 돌려줍니다. 재시도할 때도 키를 바꾸지 마세요. 응답이 유실돼 결과를 확정할 수 없으면 ETAX_ISSUE_UNKNOWN_PENDING 이 오며, 이때는 새 키로 다시 발급하지 말고 장부에서 발급 여부를 확인합니다. 발급 전 무과금 초안 검증(선택) 실제 발급 전에 같은 본문을 POST /rest/req_etax_issue_preview 로 보내면 발급 요청을 보내지 않고 세액·합계 계산과 입력 검증만 합니다. 응답의 draft 에서 공급가액·세액·합계금액 을 확인한 뒤 실제 발급을 호출하세요. 수정발급 초안은 같은 엔드포인트에 kind=AMEND 또는 originApprovalNo 를 넣습니다. 이 호출은 과금되지 않습니다. 결과 예시 form-data 전체 예제 보기 조회 7종도 같은 인증서로 호출합니다 매출·매입 내역, 합계표, 통계, 거래처, 품목 조회도 발급과 같은 인증서를 씁니다. 인증서를 다시 등록할 필요 없이, 발급 요청에 넣던 business_type=corporate·certificate_id 를 조회 요청에도 그대로 넣으면 됩니다. 단계엔드포인트무엇을 넣나 접수 POST /rest/req_etax_sales_listPOST /rest/req_etax_purchase_listPOST /rest/req_etax_sales_summaryPOST /rest/req_etax_purchase_summaryPOST /rest/req_etax_statsPOST /rest/req_etax_client_listPOST /rest/req_etax_item_list business_type=corporate·certificate_id·businessNo·from·to 결과 POST /rest/get_etax_sales_list 등 접수와 같은 이름의 get_ transactionId from·to 는 YYYYMMDD 이고, 생략하면 각각 최근 90일과 오늘입니다. 결과는 최초 1회만 과금되고 유효기간 안의 재조회는 무과금입니다. 매출내역 조회 예시 form-data 전체 예제 보기 법인은 간편인증 입력(name·birthday·phone·provider)을 넣지 않습니다. 넣어도 인증서 모드가 우선하며, business_type=corporate 에 auth_type=simple 을 함께 보내면 SIMPLE_AUTH_CERT_REQUIRED 로 거절됩니다. 인증요청 → 사용자 승인 → 정보조회 → 정보제공 4단계이며, 과금은 인증요청 발송 성공과 결과 최초 제공 두 번만 발생합니다. 그 사이 반복 조회는 무과금입니다. 1단계 · 조회 인증 요청 /rest/req_etax_amend20P · 인증요청 5분 유효 2단계 · 결과조회 /rest/get_etax_amend100P · 결과 24시간 보관 요금과 포인트 상태와 성공 판정 호출 제한과 재시도 공통 오류 응답 자주 묻는 질문 공통 가이드 전체 보기 이용 전 확인 인증 요청이 사용자에게 발송되면 20P, 결과가 처음 반환될 때 결과 단가 100P가 차감됩니다. 입력 오류로 거절된 요청, 인증 거부·만료, 조회 실패는 결과 단가가 차감되지 않고, 결과를 받은 뒤 24시간 안의 재조회는 무료입니다. 사용자는 인증 요청 후 5분 안에 휴대폰에서 승인해야 합니다. 같은 계정·같은 상품으로 진행 중이거나 30초 안에 접수한 요청이 있으면 인증을 다시 보내지 않고 기존 transactionId를 돌려주며 과금하지 않습니다. 문서는 승인한 본인 명의로만 발급됩니다. name·birthDate·phone 은 휴대폰에서 승인할 본인의 정보여야 합니다. 사업자 상품이라 접수 전에 대표자 본인 확인을 합니다. 처음에는 business_no(10자리)와 agreed=true 를 함께 보내세요. 승인할 사람은 그 사업자의 대표자 본인이어야 합니다. 승인 뒤 결과가 준비되는 동안 COLLECTING 이 이어집니다. 발급 상품은 문서를 준비하는 데 1분 넘게 걸릴 수 있습니다. 결과조회는 5초 → 10초 → 20초 → 30초 간격으로 반복하고 resultAvailable=true 를 받으면 멈추세요. 인증키는 서버 환경변수에 보관하고 브라우저·앱에 넣지 마세요. 공통 규칙은 연동 전에 확인하세요를 참고하세요. 수정세금계산서 자료를 조회하기 위한 인증 요청입니다. 사용자에게 간편인증을 요청하고, 결과 조회에 쓸 transactionId 를 바로 돌려줍니다. 인증요청과 결과조회는 완전히 분리되어 있습니다. 이 호출은 인증요청만 보내고 transactionId 를 즉시 반환합니다. 결과는 사용자가 승인한 뒤 /rest/get_etax_amend 에 transactionId 를 넣어 확인합니다. 조회 항목은 엔드포인트로 정해지므로 별도로 지정하는 파라미터가 없습니다. 이 응답의 expiresAt 까지만 승인할 수 있습니다. 남은 시간을 화면에 표시하고, 만료되면 사용자가 다시 요청할 수 있게 해 주세요. 2단계 · 결과조회 엔드포인트 Method URL POST https://apick.app/rest/get_etax_amend 이 API 는 polling 용도입니다. 호출 자체는 언제든 무료이며, 실제 결과가 최초로 반환되는 1회에만 과금됩니다. 같은 transactionId 로 다시 조회하면 charged=false 로 추가 과금이 없습니다. 인증 대기(AUTH_WAITING)·조회 중(COLLECTING)·실패(FAILED)·만료(AUTH_EXPIRED) 응답은 과금되지 않습니다. 결과를 받을 때까지 안심하고 반복 조회하세요. 결과가 준비된 뒤에는 조회 시각 기준 24시간 동안 재조회할 수 있습니다. 이 기간의 재조회는 무과금입니다. 응답에는 실제 정보를 확인한 시각이 checkedAt 으로 포함됩니다. 저장해 둔 값을 돌려주는 것이 아니라 그 시점에 확인한 값입니다. 폴링은 resultAvailable=true 를 받는 순간 멈추세요. 최대 시간은 expiresAt(인증 대기)까지이고, 그 뒤로는 결과가 나올 때까지입니다. 자세한 값은 호출 제한과 재시도를 참고하세요. 조회 항목이 여러 개인 상품은 일부만 성공하면 PARTIAL_SUCCESS 로 반환하며, 이때도 실제 조회된 데이터가 있으면 최초 1회 과금됩니다. 기본은 결과 단가 전액이지만, 선택형 묶음은 요청에서 고른 조회 중 실제 받은 항목의 단가만 합산하고, 발급형 증명은 문서를 받은 항목만 청구합니다. 문서 미수신·기관 거절·PDF 파싱 실패는 무과금이며, 받은 항목이 하나도 없으면 charged=false·cost 0 으로 응답합니다. 어느 항목이 성공·실패했는지는 sources 에 표시됩니다. 결과조회를 호출할 때마다 보유 포인트가 이 상품의 결과 단가 이상인지 먼저 확인합니다. 모자라면 인증 대기 중이어도 HTTP 200 과 result.error(사용 가능한 포인트이 부족합니다.)로 거절되고 과금되지 않으므로, 충전한 뒤 같은 transactionId 로 다시 조회하세요. 결과 단가는 건당 100P입니다. 이 상품은 조회 기간 입력이 없어 기간 배수가 적용되지 않습니다.

## 상세 요청

1단계 · 조회 인증 요청 Method URL POST https://apick.app/rest/req_etax_amend Header 이름 필수 설명 Authorization O Bearer 인증키 모든 입력은 하위 객체 없이 최상위 이름 그대로 보냅니다. user·requestData·options 같은 묶음은 쓰지 않습니다. 형식별 예시는 요청 본문 형식을 참고하세요. 조회 항목마다 필요한 추가 입력 이 다릅니다. 값이 비어 있으면 인증을 보내지 않고 무과금으로 거절하며, 이때는 결과 단가도 발생하지 않습니다. 필수 칸이 조건부인 값은 설명에 적힌 조건에 해당할 때만 필수입니다. 예: delivery=04(팩스)이면 fax_no, delivery=12(전자문서지갑)이면 wallet_address. 대표자 본인 확인이 필요한 사업자 상품입니다. 처음 접수할 때는 business_no(10자리)와 agreed=true 를 함께 보냅니다. 같은 계정·같은 사업자등록번호의 bind_id(90일 유효)가 있으면 agreed 없이 접수할 수 있습니다. 둘 다 없으면 인증을 보내지 않고 무과금으로 거절합니다. 간편인증 방식(authProvider) 값 인증 방식 kakao 카카오톡 naver 네이버 toss 토스 pass 통신사 PASS samsung 삼성패스 kb KB국민은행 shinhan 신한은행 hana 하나은행 woori 우리은행 ibk IBK기업은행 nh NH농협은행 kakaobank 카카오뱅크 banksalad 뱅크샐러드 Header 이름 필수 설명 Authorization O Bearer 인증키 본문은 transactionId 하나입니다. 결과조회 엔드포인트는 인증요청과 짝이 되는 /rest/get_etax_amend 이며, 다른 항목의 엔드포인트로 조회하면 실패합니다. 조회 시각 기준 24시간이 지나면 RESULT_EXPIRED 가 반환됩니다. 이때는 인증요청부터 다시 시작해야 하며, 인증요청 단가(20P)가 다시 발생합니다. 요청 예시 form-data 전체 예제 보기

## 상세 응답

Body 이름 타입 설명 data Object 인증 요청 결과 schemaVersion String 결과 스키마 버전 (고정값: "1.0") transactionId String 결과 조회에 사용하는 트랜잭션 ID product String 조회 항목 코드. 결과조회에도 같은 값이 오므로 어느 항목의 결과인지 대조할 수 있습니다. status String 처리 상태 (AUTH_REQUESTED: 인증 요청 완료) message String 상태 메시지 (고정값: "인증 대기중입니다.") approvals Integer 사용자가 휴대폰에서 승인해야 하는 횟수. 같은 인증으로 처리되는 조회는 묶음이어도 1회입니다. resultAvailable Boolean 결과 데이터 포함 여부. 인증 요청 응답은 항상 false 입니다. charged Boolean 이번 호출의 과금 발생 여부. 실제 발송에 성공하면 true 입니다. expiresAt String 인증 유효 기한(ISO 8601). 이 시각까지 승인하지 못하면 인증 실패 처리됩니다. success Integer 과금 여부0: 실패 또는 재사용(무과금)1: 발송 성공(과금) api Object API 호출 공통 데이터 success Boolean API 서버 정상 응답 여부 cost Integer API 호출 요금 ms Integer API 응답 시간 pl_id Integer API 결제 로그 ID 처리 상태(status) 값 의미 과금 AUTH_REQUESTED 조회 인증 요청 (/rest/req_etax_amend 응답) 인증요청 시 과금 AUTH_WAITING 사용자 인증 대기중 무과금 AUTH_COMPLETED 승인 완료, 조회 시작 전 무과금 COLLECTING 조회 결과를 준비하는 중 무과금 SUCCESS 모든 항목 조회 완료 최초 1회만 PARTIAL_SUCCESS 일부 항목만 조회 완료 (sources 참고) 최초 1회 — 선택형 묶음·발급형은 받은 항목 단가만, 받은 항목이 없으면 무과금 AUTH_REJECTED 사용자가 인증을 거부 무과금 AUTH_EXPIRED 제한 시간 안에 승인하지 않음 무과금 FAILED 조회 실패 무과금 Body 이름 타입 설명 data Object 상태·결과 schemaVersion String 결과 스키마 버전 (고정값: "1.0") transactionId String 트랜잭션 ID product String 조회 항목 코드. 인증요청 응답과 같은 값입니다. status String 처리 상태 (위 표 참고) resultAvailable Boolean 실제 결과 포함 여부. 과금 여부도 이 값으로 결정됩니다. charged Boolean 이번 호출의 과금 발생 여부. 최초 결과 반환에서만 true 입니다. sources Array 항상 포함됩니다. 값이 없으면 빈 배열 [] 입니다. 항목이 여러 개인 상품에서 어느 것이 성공·실패했는지 알려줍니다. 각 항목은 source(자료 이름), type(데이터 종류), status(SUCCESS/FAILED). 결과 준비가 끝나기 전에는 아직 확정되지 않은 항목이 FAILED 로 보일 수 있습니다. progress Object 진행률(COLLECTING 일 때). total(전체 항목), completed(완료 항목) checkedAt String 실제 정보를 확인한 시각. 한국시간(UTC+09:00) ISO 8601 이며 재조회 유효기간의 기준입니다. resultExpiresAt String 결과 재조회 만료 시각. 한국시간(UTC+09:00) ISO 8601 입니다. errorCode String 오류 구분. RESULT_EXPIRED(재조회 기간 만료) / AUTH_EXPIRED / AUTH_REJECTED / COLLECT_FAILED result Object 조회된 결과 묶음. 실제 데이터가 있을 때만 포함됩니다. etaxAmend Object 이 조회 항목의 결과입니다. 항목은 결과 규격을 참고하세요. message String 상태 메시지 success Integer 과금 여부0: 결과 없음 또는 재조회(무과금)1: 최초 결과 반환(과금) api Object API 호출 공통 데이터 success Boolean API 서버 정상 응답 여부 cost Integer API 호출 요금 ms Integer API 응답 시간 pl_id Integer API 결제 로그 ID 결과 규격 result.etaxAmend 경로 타입 값 존재 설명 예시 승인번호 String O 발급된 수정세금계산서 승인번호 20261026-41000002-12345678 작성일자 String(YYYYMMDD) O 작성일자 20261026 공급받는자상호 String O 공급받는자 상호 주식회사 예시 공급가액 Integer O 공급가액 합계(원) 900000 세액 Integer O 부가가치세 합계(원) 90000 합계금액 Integer O 공급가액 + 세액(원) 990000 전송상태 String 조건부 전송 처리 상태 전송완료 기존발급건 Boolean O 같은 요청 키로 이미 발급된 건을 다시 돌려줬는지 false 수정사유코드 String O 수정사유 코드 1~6 2 수정사유 String 조건부 수정사유 설명 공급가액 정정 원본승인번호 String O 수정 대상 원본 승인번호 20261001-41000001-12345678 타입 읽는 법 — String 은 문자열, Integer 는 소수점 없는 정수(원 단위 금액 포함), Boolean 은 true/false, Object 는 이름이 있는 하위 항목 묶음, Array<Object> 는 같은 구조가 여러 건 오는 목록, Array<String> 은 문자열 목록입니다. String(YYYY-MM-DD) 처럼 괄호가 붙으면 그 형식의 문자열이라는 뜻이고 날짜 타입이 아닙니다. 값 존재 — O는 정상 결과에 있는 항목, 조건부는 해당 정보가 있을 때 제공하는 항목입니다. 누락·빈 문자열·빈 배열·0·null의 의미는 항목별 설명을 따릅니다. 부모 항목이 없으면 그 하위 항목도 없습니다. 예시 — 응답에 들어오는 형태 그대로의 값입니다. 실제 조회 결과가 아니며 개인을 특정할 수 없는 가상의 값입니다. 이 열이 비어 있으면 하위 항목이 있는 묶음이거나 값이 빠질 수 있는 항목입니다. 들여쓰기된 항목은 바로 위 부모 안에 들어 있는 하위 항목입니다. 경로 표기에서 . 는 하위 항목, [ ] 를 붙인 항목은 그 안에 여러 건이 오는 목록이라는 뜻입니다.

## 상세 코드·정책

수정발급과 취소 — 같은 엔드포인트, 사유 코드만 다름 수정과 취소는 별도 상품이 아닙니다. 수정발급 호출에 사유 코드를 넣으면 그 코드에 따라 정정되거나 취소됩니다. 코드사유쓸 때금액 부호 1기재사항 착오정정상호·품목 등 기재 내용이 틀렸을 때당초분과 수정분을 함께 발급 2공급가액 변동금액이 바뀌었을 때보낸 금액 그대로 3환입물건이 돌아왔을 때자동으로 음수 처리 4계약의 해제발급한 계산서를 취소할 때자동으로 음수 처리 5내국신용장 사후개설신용장이 나중에 열렸을 때당초분과 수정분을 함께 발급 6착오로 인한 이중발급같은 건을 두 번 발급했을 때보낸 금액 그대로 사유 3·4 는 원본과 같은 금액을 양수로 보내면 서버가 부호를 뒤집어 상계합니다. 마이너스 금액을 직접 넣지 마세요. 사유 1·5 는 원본을 되돌리는 당초분과 새로 발급할 수정분을 서버가 함께 만들어 보냅니다. 취소 예시 — 사유 4 form-data 전체 예제 보기 결과는 발급과 같이 POST /rest/get_etax_amend 에 transactionId 를 넣어 받습니다. 응답의 승인번호 가 취소분 승인번호입니다. 원본 승인번호는 이미 발급된 계산서여야 하며, 찾지 못하면 ETAX_AMEND_ORIGIN_NOT_FOUND 로 끝나고 과금되지 않습니다. 품목 수는 원본과 같아야 합니다. 원본 품목 수와 다르면 입력 항목이 잘못됐습니다.(원본과 같은 품목 수) 로 거절됩니다. 인증서 관련 오류와 조치 오류 코드HTTP뜻조치 SIMPLE_AUTH_CERT_REQUIRED400법인인데 간편인증으로 요청함business_type=corporate 와 certificate_id 를 넣어 다시 호출합니다. 발송 전이라 과금되지 않습니다. SIMPLE_AUTH_CERT_NOT_REGISTERED400등록된 인증서가 없음인증서 관리에서 먼저 등록합니다. SIMPLE_AUTH_CERT_INACTIVE400만료·사용 중지된 인증서갱신한 인증서를 다시 등록합니다. ETAX_SIGN_CERT_REQUIRED400발급 서명에 쓸 인증서가 없음인증서를 등록한 뒤 다시 호출합니다. 발급 전에 끝나 무과금입니다. CERT_LOGIN_FAILED424등록한 인증서로 로그인이 안 됨/main/rest/etax_certificates/verify 로 먼저 확인합니다. 비밀번호·인증서 파일·발행 사업자를 점검합니다. ETAX_ISSUE_KEY_REQUIRED400idempotency_key 누락발급 1건마다 고유한 키를 넣습니다. ETAX_ISSUE_UNKNOWN_PENDING400앞선 발급의 결과가 확정되지 않음새 키로 다시 발급하지 마세요. 장부에서 발급 여부를 먼저 확인합니다. ETAX_AMEND_ORIGIN_NOT_FOUND400수정 대상 원본을 찾지 못함원본 승인번호와 발행 사업자를 확인합니다. 무과금입니다. 인증키는 서버 환경변수에 보관하고 브라우저·앱에 넣지 마세요. 공통 규칙은 연동 전에 확인하세요에 있습니다. 오류와 복구 입력 오류와 처리 중 거절은 data.error 에 안내 문구가 오고 과금되지 않습니다(api.cost 0). 실패 응답은 표의 HTTP 상태 코드와 함께 옵니다. 인증 거부·만료·조회 실패처럼 진행이 끝난 상태는 HTTP 200 으로 오며 data.status·data.errorCode 로 구분합니다. 상황HTTPdata.error해결 이름·생년월일·휴대전화 번호가 비었거나 형식이 틀림400입력 항목이 잘못됐습니다.(이름) — 괄호 안에 항목 이름(생년월일 8자리·휴대전화 번호)이 표시됩니다.값을 고쳐 인증 요청을 다시 보냅니다. 인증이 발송되지 않아 과금되지 않습니다. authProvider 가 허용값이 아니거나 지금 쓸 수 없는 인증방식400입력 항목이 잘못됐습니다.(인증방식)간편인증 방식 표의 값(예: kakao)으로 보냅니다. business_no 가 없거나 10자리가 아님400입력 항목이 잘못됐습니다.(사업자등록번호 10자리)사업자등록번호 10자리를 숫자로 보냅니다. bind_id 없이 agreed 를 빠뜨림400입력 항목이 잘못됐습니다.(agreed)agreed=true 를 함께 보냅니다. bind_id 유효기간이 지났거나 폐기됨410사업자 인증 유효기간이 지났습니다. 다시 인증해 주세요.bind_id 를 빼고 agreed=true 로 다시 접수합니다. 없는 bind_id404사업자 인증 정보를 찾을 수 없습니다.bind_id 를 빼고 agreed=true 로 다시 접수합니다. bind_id 의 사업자등록번호와 business_no 가 다름400입력한 사업자등록번호가 인증된 번호와 다릅니다.bind_id 를 만든 사업자등록번호로 보내거나, bind_id 없이 agreed=true 로 접수합니다. 같은 상품의 앞선 요청을 처리하는 중429앞선 요청을 처리하고 있습니다. 잠시 후 다시 시도해 주세요.인증 요청을 다시 보내지 말고 잠시 뒤 받은 transactionId 로 결과를 조회합니다. 보유 포인트가 이번 호출 단가보다 적음200data 대신 result.error 에 사용 가능한 포인트이 부족합니다.충전한 뒤 다시 호출합니다. 결과조회는 같은 transactionId 를 그대로 씁니다. 결과를 청구하는 순간 포인트가 부족함402결제 금액보다 보유 포인트이 부족합니다.충전한 뒤 같은 transactionId 로 다시 조회합니다. 결과는 24시간 보관됩니다. 결과조회에 transactionId 가 없음400입력 항목이 잘못됐습니다.(transactionId)인증 요청 응답의 transactionId 를 보냅니다. 없는 transactionId 또는 다른 상품의 결과조회 경로404요청을 찾을 수 없습니다.인증 요청한 상품의 /rest/get_etax_amend 로 조회합니다. 사용자가 승인을 거부함200없음 — status=AUTH_REJECTED, errorCode=AUTH_REJECTED다시 시도할지 사용자에게 묻고 인증 요청부터 다시 합니다(인증 요청 단가가 다시 발생). 5분 안에 승인하지 않음200없음 — status=AUTH_EXPIRED, errorCode=AUTH_EXPIRED인증 요청부터 다시 합니다. 결과 단가는 발생하지 않습니다. 발급하지 못함(대상이 아니거나 일시적으로 처리하지 못함)200없음 — status=FAILED, errorCode=COLLECT_FAILED결과 단가는 발생하지 않습니다. 입력값과 대표자 본인 여부를 확인한 뒤 잠시 후 인증 요청부터 다시 합니다. 결과 재조회 기간(24시간)이 지남200없음 — errorCode=RESULT_EXPIRED받은 결과는 바로 저장해 두세요. 다시 받으려면 인증 요청부터 합니다. HTTP 상태만으로 성공을 판단하지 말고 data.resultAvailable 과 data.status 를 함께 보세요. 공통 규칙은 공통 오류 응답에 있습니다.

## 상세 예제

요청 예시 form-data 전체 예제 보기 응답 예시 { "data": { "schemaVersion": "1.0", "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a", "product": "etax_amend", "status": "AUTH_REQUESTED", "resultAvailable": false, "charged": true, "sources": [], "message": "인증 대기중입니다.", "approvals": 1, "expiresAt": "2026-09-20T05:24:07+09:00", "success": 1 }, "api": { "success": true, "cost": 20, "ms": 1284, "pl_id": 4902 } } 인증 대기중 (무과금) { "data": { "schemaVersion": "1.0", "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a", "product": "etax_amend", "status": "AUTH_WAITING", "resultAvailable": false, "charged": false, "sources": [], "message": "인증 대기중입니다.", "expiresAt": "2026-09-20T05:24:07+09:00", "success": 0 }, "api": { "success": true, "cost": 0, "ms": 42, "pl_id": -1 } } 조회 중 (무과금) { "data": { "schemaVersion": "1.0", "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a", "product": "etax_amend", "status": "COLLECTING", "resultAvailable": false, "charged": false, "sources": [], "progress": { "total": 1, "completed": 0 }, "message": "정보를 조회하고 있습니다.", "success": 0 }, "api": { "success": true, "cost": 0, "ms": 38, "pl_id": -1 } } 조회 완료 (과금) { "data": { "schemaVersion": "1.0", "transactionId": "9f2c4a7b1d8e35c60a4f7b2d1e9c803a", "product": "etax_amend", "status": "SUCCESS", "resultAvailable": true, "charged": true, "sources": [ { "source": "수정세금계산서 발급","type": "ETAX_AMEND", "status": "SUCCESS" } ], "checkedAt": "2026-09-20T04:47:33+09:00", "resultExpiresAt": "2026-09-21T04:47:33+09:00", "result": { "etaxAmend": { "승인번호": "20261026-41000002-12345678", "작성일자": "20261026", "공급받는자상호": "주식회사 예시", "공급가액": 900000, "세액": 90000, "합계금액": 990000, "기존발급건": false, "수정사유코드": "2", "원본승인번호": "20261001-41000001-12345678" } }, "message": "인증이 완료되었습니다.", "success": 1 }, "api": { "success": true, "cost": 100, "ms": 318, "pl_id": 4903 } } 위 값은 응답 구조를 보여주기 위한 예시입니다. 값은 가상이지만 필드 구성과 타입은 실제 응답과 같습니다. 전체 항목은 결과 규격을 참고하세요. expiresAt 은 SUCCESS 응답에 없습니다. 인증 대기 기한(AUTH_WAITING)에만 있고, 결과를 받은 뒤에는 resultExpiresAt 이 그 역할을 대신합니다. 둘 중 어느 것이 오는지로 "지금이 승인 대기인지 결과 보관 기간인지"를 구분할 수 있습니다.
