apick-api 4.8.2 → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,8 +1,38 @@
1
- # 4.8.2
2
-
3
- - 차명에 등급·연식·좌석을 함께 넣을 수 있습니다(`파나메라 gts 4인승 19년식`, `PANAMERA GTS 19년`). 입력한 연식·등급을 우선하며 좌석 수는 실제 제원과 일치해야 합니다. 근접 연식을 선택하면 반환 연식과 안내를 확인하세요. 지정 등급을 찾지 못하거나 확신이 낮으면 제원 없이 무료 후보만 반환하며, 유사 차량이 전혀 없으면 없음 오류로 응답하고 과금하지 않습니다. 별도 연식·등급과 문장 조건이 충돌하면 입력 오류입니다.
4
- - Put the model, trim, year and seat count in model (for example, PANAMERA GTS 19년). Matching prioritizes the supplied year and trim, and the seat count must match the specification. Check the returned year and notice when a nearby year is selected. Unmatched trims and low-confidence matches return suggestions without specifications or charges; no similar vehicle returns a no-result error without charging. Conflicting explicit and free-text constraints are rejected.
5
-
1
+ # 4.11.0
2
+
3
+ - 증빙서류 통합발급 묶음 2종을 추가했습니다. `requestIncomeCertBundle()`·`getIncomeCertBundle()`은 소득금액증명과 연금보험료등 소득세액 공제확인서를, `requestBusinessCertBundle()`·`getBusinessCertBundle()`은 사업자등록증명·부가가치세 과세표준증명·표준재무제표증명을 휴대폰 승인 한 번으로 함께 발급합니다. 접수 20P, 최초 결과는 84P·126P입니다. 사업자 묶음은 `business_no`와 대표자 본인 확인(`agreed: true` 또는 `bind_id`)이 없으면 서버를 부르기 전에 `TypeError`를 던집니다.
4
+ - Added two certificate bundles: `requestIncomeCertBundle()`/`getIncomeCertBundle()` (income amount and pension credit certificates) and `requestBusinessCertBundle()`/`getBusinessCertBundle()` (business registration, VAT tax base and standard financial statement certificates), issued after a single phone approval. 20P on acceptance, 84P/126P on the first result. The business bundle throws a `TypeError` before calling the server when `business_no` or representative consent (`agreed: true` or `bind_id`) is missing.
5
+ - Added `registryDocVerify(issueNo, options)` for `POST /rest/registry_doc_verify`. Pass the 12-character verification number printed on an issued Korean registration certificate (hyphens and spaces are accepted) and optionally `kind` (`realestate` default, `corporate`, `movable`). Returns `verified`, `status`, `message`, `document`, `issued_date` and `registry_office` at 60P per lookup. The certificate contents and any PDF are not returned, and verification is limited to certificates issued within the last three months.
6
+ - 등기·증명서 발급확인 `registryDocVerify(issueNo, options)` 를 추가했습니다. 증명서에 인쇄된 발급확인번호 12자리(하이픈·공백 허용)와 문서 종류 `kind`(`realestate` 기본·`corporate`·`movable`)를 넘기면 발급 사실 여부(`verified`)·상태(`status`)·증명서 종류·발급일·등기소를 건당 60P로 돌려줍니다. 증명서 원문(PDF)과 기재 내용은 제공하지 않으며, 발급일로부터 3개월 이내 발급분만 확인됩니다.
7
+ - Added `courtAuction(caseNo, court)` for `POST /rest/court_auction`. A case number is managed per court, so the court (name such as `서울중앙지방법원` or code such as `B000210`) is required. Returns case details (receipt date, claim amount, judge department, status), sale items (address, appraised price, minimum price, failed count, sale date/time, deposit rate), the sale schedule, the dividend claim deadline and related cases at 60P per lookup. Bidding assistance and bid form preparation are not provided.
8
+ - 법원 경매사건 조회 `courtAuction(caseNo, court)` 를 추가했습니다. 사건번호는 법원별로 관리되므로 법원(이름 `서울중앙지방법원` 또는 코드 `B000210`)이 함께 필요합니다. 사건 기본정보(접수일·청구금액·재판부·진행상태), 매각물건(소재지·감정가·최저매각가·유찰 횟수·매각기일·입찰보증금 비율), 매각기일 묶음, 배당요구종기, 관련 사건을 건당 60P로 돌려줍니다. 입찰대행·입찰서 작성은 제공하지 않습니다.
9
+ - Added `requestBusinessRegistrationCert(input)` / `getBusinessRegistrationCert(transactionId)`, `requestVatTaxBaseCert()` / `getVatTaxBaseCert()`, `requestFinancialStatementCert()` / `getFinancialStatementCert()` and `requestClosureCert()` / `getClosureCert()` for `POST /rest/req_*` and `POST /rest/get_*`. All four target a registered business, so `business_no` (10 digits) is required in addition to `year`, `use_purpose`, `submit_to` and `delivery` where applicable, and each issuance is a flat 60P. `period` (`1`, `2` or `all`) selects the VAT period for `requestVatTaxBaseCert()`.
10
+ - 사업자 단위 증명 4종을 추가했습니다. 사업자등록증명 `requestBusinessRegistrationCert()`·`getBusinessRegistrationCert()`, 부가가치세 과세표준증명 `requestVatTaxBaseCert()`·`getVatTaxBaseCert()`, 표준재무제표증명 `requestFinancialStatementCert()`·`getFinancialStatementCert()`, 폐업사실증명 `requestClosureCert()`·`getClosureCert()` 이며 모두 등록된 사업자를 대상으로 하므로 `business_no`(10자리)가 필수입니다. 발급 1건은 60P 정액이고 과세표준증명의 과세기간은 `period`(`1`·`2`·`all`)로 고릅니다.
11
+
12
+ # 2026-10-19 서버 동작 안내 / Server behavior notes
13
+
14
+ - 차량정보는 공백·대소문자가 다른 동일 등급을 우선해 찾으며 연식·사양이 다른 차량은 구분합니다. 기존 `안내`에서 연식·사양 대체, 사양 충돌, 국내 출시 여부 확인 보류, 일부 제원의 추가 검증 상태를 확인할 수 있습니다. 국내 미출시가 확인된 차량은 해외 자료 기준이며 100% 정확성을 보장하지 않는다는 안내가 추가됩니다. 반환된 연식·등급과 안내를 확인하세요. 입력·응답 구조와 과금 방식은 유지됩니다.
15
+ - Vehicle information prioritizes the same trim across spacing and case variations while distinguishing model years and specifications. The existing `안내` notice can describe year/specification substitutions, conflicting specifications, unverified Korean-market availability, or specifications still under review. Confirmed non-Korean-market vehicles receive an additional notice that overseas data does not guarantee 100% accuracy. Check the returned year, trim and notices. Request/response shapes and billing behavior remain unchanged.
16
+ - 유효한 특장차 전고와 전기차 CO₂ 배출량 0을 보존합니다. 누락값은 0으로 대체하지 않습니다.
17
+ - Valid special-body vehicle heights and zero CO₂ emissions for electric vehicles are preserved. Missing values are not replaced with zero.
18
+
19
+ # 4.8.2
20
+
21
+ - 차명에 등급·연식·좌석을 함께 넣을 수 있습니다(`파나메라 gts 4인승 19년식`, `PANAMERA GTS 19년`). 입력한 연식·등급을 우선하며 좌석 수는 실제 제원과 일치해야 합니다. 근접 연식을 선택하면 반환 연식과 안내를 확인하세요. 지정 등급을 찾지 못하거나 확신이 낮으면 제원 없이 무료 후보만 반환하며, 유사 차량이 전혀 없으면 없음 오류로 응답하고 과금하지 않습니다. 별도 연식·등급과 문장 조건이 충돌하면 입력 오류입니다.
22
+ - Put the model, trim, year and seat count in model (for example, PANAMERA GTS 19년). Matching prioritizes the supplied year and trim, and the seat count must match the specification. Check the returned year and notice when a nearby year is selected. Unmatched trims and low-confidence matches return suggestions without specifications or charges; no similar vehicle returns a no-result error without charging. Conflicting explicit and free-text constraints are rejected.
23
+
24
+ # 4.9.1
25
+
26
+ - Added `requestIncomeAmountCert(input)` / `getIncomeAmountCert(transactionId)`, `requestPensionCreditCert()` / `getPensionCreditCert()`, `requestFactCert()` / `getFactCert()` and `requestTaxClearanceCert()` / `getTaxClearanceCert()` for `POST /rest/req_*` and `POST /rest/get_*`. All four issue a Hometax certificate for the authenticated person at a flat 60P per issuance and require `year`, `use_purpose`, `submit_to` and `delivery`. `format` (`pdf`, `json` or `both`; default `both`) selects the response; with `json`/`both` the issued PDF is parsed into `PDF데이터.필드`. The structured values in the result body are authoritative and parsed fields may be empty depending on the table layout. Certificates that need a registered business (business registration, VAT tax base, financial statements) are not part of this release.
27
+ - 홈택스 민원증명 4종을 추가했습니다. 소득금액증명 `requestIncomeAmountCert()`·`getIncomeAmountCert()`, 연금보험료등 소득세액 공제확인서 `requestPensionCreditCert()`·`getPensionCreditCert()`, 납부내역증명 `requestFactCert()`·`getFactCert()`, 납세증명서 `requestTaxClearanceCert()`·`getTaxClearanceCert()` 이며 `POST /rest/req_*`·`POST /rest/get_*` 를 씁니다. 모두 신청인 본인명의 발급이고 발급 1건은 60P 정액이며 `year`·`use_purpose`·`submit_to`·`delivery` 가 필수입니다. `format`(`pdf`·`json`·`both`, 기본 `both`)으로 응답을 고르고 `json`·`both` 이면 발급된 PDF를 파싱한 `PDF데이터.필드` 가 함께 옵니다. 구조화 값은 결과 본문이 정본이고 표 구조에 따라 파싱 필드가 비어 있을 수 있습니다. 사업자 세적이 필요한 사업자등록증명·부가가치세 과세표준증명·표준재무제표증명은 이번 배포에 포함하지 않았습니다.
28
+
29
+ # 4.9.0
30
+
31
+ - Added `requestResidentRegistration(input)` / `getResidentRegistration(transactionId)` for `POST /rest/req_resident_registration` and `POST /rest/get_resident_registration`, and `requestResidentRegistrationCho(input)` / `getResidentRegistrationCho(transactionId)` for the 초본 variant. Both require the registered address (`sido`, `sigungu`) and optionally take `purposeCd`, `submitTarget`, `includeAddressHistory` and `includeHousehold` (`Y`/`N`). Each issued copy costs 80P and the result includes the original PDF as base64 (`발급문서`) with its filename, SHA-256 (`문서해시`) and byte size (`문서크기`).
32
+ - Added `requestGov24Bundle(input)` / `getGov24Bundle(transactionId)` for `POST /rest/req_gov24_bundle` and `POST /rest/get_gov24_bundle` — one simple-auth approval for the selectable Government24 products. `products` picks any subset of the 13 keys exported as `GOV24_BUNDLE_PRODUCTS`; the bill is the sum of the selected products (resident registration 80P each) and unselected products are never verified or collected. `sido`/`sigungu` are required only when a resident registration certificate is selected. Result sections use camelCase keys (`residentRegistration`, `residentRegistrationCho`, …).
33
+ - `requestResidentRegistration()`·`getResidentRegistration()`(`POST /rest/req_resident_registration`·`POST /rest/get_resident_registration`)와 초본용 `requestResidentRegistrationCho()`·`getResidentRegistrationCho()`를 추가했습니다. 주민등록 주소지 `sido`·`sigungu`가 필수이고 `purposeCd`·`submitTarget`·`includeAddressHistory`·`includeHousehold`(`Y`/`N`)를 선택으로 받습니다. 발급 1건은 80P이며 결과에는 PDF 원본 base64(`발급문서`)와 파일명·SHA-256(`문서해시`)·바이트 크기(`문서크기`)가 함께 옵니다.
34
+ - 정부24 통합 조회 `requestGov24Bundle()`·`getGov24Bundle()`(`POST /rest/req_gov24_bundle`·`POST /rest/get_gov24_bundle`)를 추가했습니다. 간편인증 1회로 `products`에 고른 상품만 조회하며, 선택 가능한 13개 키는 `GOV24_BUNDLE_PRODUCTS`로 제공합니다. 과금은 고른 상품 단가의 합(등본·초본 각 80P)이고 고르지 않은 상품은 인증·수집하지 않습니다. `sido`·`sigungu`는 등본·초본을 고를 때만 필요합니다. 결과 섹션 키는 camelCase(`residentRegistration`, `residentRegistrationCho` 등)입니다.
35
+
6
36
  # 4.8.1
7
37
 
8
38
  - `vehicleModelInfo(options)` also covers motorcycles and scooters alongside passenger cars; the `차체형상` value adds 스쿠터, 언더본, 네이키드, 스포츠바이크, 투어링바이크, 크루저, 어드벤처, 오프로드 and 클래식바이크. Request and response shapes are unchanged.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 APICK
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 APICK
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -96,6 +96,8 @@ Leave the allowed-IP list blank for unrestricted access. To restrict access, reg
96
96
  | `linkedinProfile(url)` | 링크드인 프로필 / LinkedIn profile | JSON |
97
97
  | `linkedinCompany(url)` | 링크드인 회사 정보 / LinkedIn company | JSON |
98
98
  | `linkedinJob(url)` | 링크드인 채용공고 / LinkedIn job posting | JSON |
99
+ | `courtAuction(caseNo, court)` | 법원 경매사건 조회 / Court auction case | JSON |
100
+ | `registryDocVerify(issueNo, options)` | 등기·증명서 발급확인 / Registry certificate verification | JSON |
99
101
  | `createTtsJob(text, options)` | 한국어 내레이션 작업 접수 / Create TTS job | JSON |
100
102
  | `getTtsJob(jobId)` | TTS 작업 상태 / TTS job status | JSON |
101
103
  | `cancelTtsJob(jobId)` | 대기·생성 중 TTS 작업 취소 / Cancel waiting or processing TTS job | JSON |
@@ -124,6 +126,19 @@ Leave the allowed-IP list blank for unrestricted access. To restrict access, reg
124
126
  | `requestHealthCheckup(input)` / `getHealthCheckup(transactionId)` | 국가 건강검진 결과 조회 / National health checkup results | JSON |
125
127
  | `requestCashReceiptDeduction(input)` / `getCashReceiptDeduction(transactionId)` | 현금영수증 소득공제 내역 / Cash receipt income deductions | JSON |
126
128
  | `requestTaxReturnHistory(input)` / `getTaxReturnHistory(transactionId)` | 국세 신고내역 조회 / National tax return history | JSON |
129
+ | `requestResidentRegistration(input)` / `getResidentRegistration(transactionId)` | 주민등록표등본 발급 / Resident registration certificate | JSON |
130
+ | `requestResidentRegistrationCho(input)` / `getResidentRegistrationCho(transactionId)` | 주민등록표초본 발급 / Resident registration certificate (cho) | JSON |
131
+ | `requestGov24Bundle(input)` / `getGov24Bundle(transactionId)` | 정부24 통합 조회 / Selectable Government24 bundle | JSON |
132
+ | `requestIncomeAmountCert(input)` / `getIncomeAmountCert(transactionId)` | 소득금액증명 발급 / Income amount certificate | PDF·JSON |
133
+ | `requestPensionCreditCert(input)` / `getPensionCreditCert(transactionId)` | 연금보험료등 소득세액 공제확인서 발급 / Pension credit certificate | PDF·JSON |
134
+ | `requestFactCert(input)` / `getFactCert(transactionId)` | 납부내역증명(납세사실증명) 발급 / Tax payment fact certificate | PDF·JSON |
135
+ | `requestTaxClearanceCert(input)` / `getTaxClearanceCert(transactionId)` | 납세증명서 발급 / Tax clearance certificate | PDF·JSON |
136
+ | `requestIncomeCertBundle(input)` / `getIncomeCertBundle(transactionId)` | 소득 증빙서류 통합발급 / Income certificate bundle | PDF·JSON |
137
+ | `requestBusinessCertBundle(input)` / `getBusinessCertBundle(transactionId)` | 사업자 증빙서류 통합발급 / Business certificate bundle | PDF·JSON |
138
+ | `requestBusinessRegistrationCert(input)` / `getBusinessRegistrationCert(transactionId)` | 사업자등록증명 발급 / Business registration certificate | PDF·JSON |
139
+ | `requestVatTaxBaseCert(input)` / `getVatTaxBaseCert(transactionId)` | 부가가치세 과세표준증명 발급 / VAT tax base certificate | PDF·JSON |
140
+ | `requestFinancialStatementCert(input)` / `getFinancialStatementCert(transactionId)` | 표준재무제표증명 발급 / Financial statements certificate | PDF·JSON |
141
+ | `requestClosureCert(input)` / `getClosureCert(transactionId)` | 폐업사실증명 발급 / Business closure certificate | PDF·JSON |
127
142
  | `searchSkills(options)` / `getSkill(skillId)` | Skill 검색·상세 / Search and inspect Skills | JSON |
128
143
  | `getSkillPerformance()` | 시험 방법·표본 수·기계 검사·품질 점수 / Measured results and methods | JSON |
129
144
  | `quoteSkill(skillId, input, options)` | Skill 견적(무료) / Quote a run (free) | JSON |
@@ -313,9 +328,9 @@ The four document-specific methods return JSON. `maskResidentNumber` returns PNG
313
328
 
314
329
  ## 간편인증 기반 데이터 조회 / Simple-auth data lookups
315
330
 
316
- 본인 간편인증이 필요한 조회 상품(재직·소득·연금·면허·건강검진·현금영수증·국세 신고내역)은 접수(`request*`)와 결과 조회(`get*`)가 분리되어 있습니다. 접수 응답의 `transactionId`로 결과를 폴링하세요.
331
+ 본인 간편인증이 필요한 조회 상품(재직·소득·연금·면허·건강검진·현금영수증·국세 신고내역·주민등록표 발급·정부24 통합 조회·홈택스 민원증명)은 접수(`request*`)와 결과 조회(`get*`)가 분리되어 있습니다. 접수 응답의 `transactionId`로 결과를 폴링하세요.
317
332
 
318
- Products that require the user's own simple-auth verification (employment, income, pension, driver's license, health checkup, cash receipts, tax returns) split the call into a `request*()` acceptance and a `get*()` poll. Use the `transactionId` from the accepted response to poll for the result.
333
+ Products that require the user's own simple-auth verification (employment, income, pension, driver's license, health checkup, cash receipts, tax returns, resident registration certificates, and the Government24 bundle) split the call into a `request*()` acceptance and a `get*()` poll. Use the `transactionId` from the accepted response to poll for the result.
319
334
 
320
335
  아래 함수는 7종 모두에 공통으로 사용합니다. 같은 `transactionId`로 순차 조회하며 5→10→20→30초 간격으로 늘린 뒤 30초를 유지합니다. `resultAvailable === true`이면 즉시 결과를 반환합니다. `SUCCESS`는 전체 성공, `PARTIAL_SUCCESS`는 부분 성공이므로 `sources`에서 누락·실패 항목을 확인하세요. `AUTH_REJECTED`·`AUTH_EXPIRED`·`FAILED`는 실패 종료이며, `errorCode: 'RESULT_EXPIRED'`는 결과 보관 기간 만료입니다. 실패·만료 시 자동으로 재접수하지 않습니다.
321
336
 
@@ -392,6 +407,25 @@ try {
392
407
  ```
393
408
  <!-- simple-auth-usage:end -->
394
409
 
410
+ ### 정부24 통합 조회 / Government24 bundle
411
+
412
+ ```js
413
+ const bundle = await apick.requestGov24Bundle({
414
+ name: '홍길동',
415
+ birthDate: '19900101',
416
+ phone: '01011112222',
417
+ authProvider: 'kakao',
418
+ // 고른 상품만 인증·조회합니다. 등본 80P, 초본 80P로 선택한 상품 단가를 합산합니다.
419
+ products: ['resident_registration', 'resident_registration_cho'],
420
+ sido: '서울특별시',
421
+ sigungu: '구로구'
422
+ });
423
+ const issued = await pollDataResult(id => apick.getGov24Bundle(id), bundle);
424
+ const pdfBase64 = issued.data.result.residentRegistration['발급문서'];
425
+ ```
426
+
427
+ `GOV24_BUNDLE_PRODUCTS` lists the 13 selectable product keys. Selecting only `driving_license` (or any non-resident product) does not require `sido`/`sigungu`. / `GOV24_BUNDLE_PRODUCTS` lists the 13 selectable keys; the address is required only when a resident registration certificate is selected.
428
+
395
429
  근거: [APICK 개발가이드](https://apick.app/dev_guide/data_health_checkup) · [MCP 3.5.0 상태 계약](https://github.com/lead788/apick-mcp/blob/a803abcb81d07377c85f49bb0b670baf0c17ed04/TOOLS.md)
396
430
 
397
431
  지원 간편인증 방식(`authProvider`) 13종은 `AUTH_PROVIDERS`로 제공됩니다: `kakao`, `naver`, `toss`, `pass`, `samsung`, `kb`, `shinhan`, `hana`, `woori`, `ibk`, `nh`, `kakaobank`, `banksalad`.
@@ -411,6 +445,41 @@ Acceptance is billed at a flat rate; the result is billed only on its first succ
411
445
  | 국가 건강검진 결과 / Health checkup | `requestHealthCheckup` / `getHealthCheckup` | — |
412
446
  | 현금영수증 소득공제 내역 / Cash receipt deductions | `requestCashReceiptDeduction` / `getCashReceiptDeduction` | `incomeYears` (1–3) |
413
447
  | 국세 신고내역 조회 / Tax return history | `requestTaxReturnHistory` / `getTaxReturnHistory` | `years` (1–10) |
448
+ | 주민등록표등본 발급 / Resident registration certificate | `requestResidentRegistration` / `getResidentRegistration` | `sido`, `sigungu` (필수 / required), `purposeCd`, `submitTarget`, `includeAddressHistory`, `includeHousehold` |
449
+ | 주민등록표초본 발급 / Resident registration certificate (cho) | `requestResidentRegistrationCho` / `getResidentRegistrationCho` | `sido`, `sigungu` (필수 / required), `purposeCd`, `submitTarget`, `includeAddressHistory`, `includeHousehold` |
450
+ | 정부24 통합 조회 / Selectable Government24 bundle | `requestGov24Bundle` / `getGov24Bundle` | `products` (필수 / required), 등본·초본 선택 시 `sido`·`sigungu` (필수 / required when either resident certificate is selected) |
451
+ | 소득금액증명 발급 / Income amount certificate | `requestIncomeAmountCert` / `getIncomeAmountCert` | `year`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `format`, `engl_yn`, `quantity`, `email`, `fax_no`, `wallet_address` |
452
+ | 연금보험료등 소득세액 공제확인서 발급 / Pension credit certificate | `requestPensionCreditCert` / `getPensionCreditCert` | `year`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `format`, `address_open_yn`, `resno_open_yn`, `quantity`, `email`, `fax_no`, `wallet_address` |
453
+ | 납부내역증명(납세사실증명) 발급 / Tax payment fact certificate | `requestFactCert` / `getFactCert` | `use_purpose`, `submit_to`, `delivery`, `itrf_cd` (필수 / required), `year`, `start_month`, `end_month`, `issuance`, `engl_yn`, `format` |
454
+ | 납세증명서 발급 / Tax clearance certificate | `requestTaxClearanceCert` / `getTaxClearanceCert` | `cert_type`(`B0006` 납세증명서·`B0010` 해외이주용), `use_purpose`, `submit_to`, `delivery`, `itrf_cd` (필수 / required), `year`, `start_month`, `end_month`, `issuance`, `format` |
455
+ | 소득 증빙서류 통합발급 / Income certificate bundle | `requestIncomeCertBundle` / `getIncomeCertBundle` | `year`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `format`, `amount_open_yn`, `income_source_open_yn`, `withholding_all_print_yn`, `address_open_yn`, `resno_open_yn`, `quantity`, `email`, `fax_no`, `wallet_address` |
456
+ | 사업자 증빙서류 통합발급 / Business certificate bundle | `requestBusinessCertBundle` / `getBusinessCertBundle` | `business_no`, `year`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `agreed: true` 또는 `bind_id` (둘 중 하나 필수 / one required), `period`, `engl_yn`, `format`, `quantity`, `email`, `fax_no`, `wallet_address` |
457
+ | 사업자등록증명 발급 / Business registration certificate | `requestBusinessRegistrationCert` / `getBusinessRegistrationCert` | `business_no`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `engl_yn`, `format`, `quantity`, `email`, `fax_no`, `wallet_address` |
458
+ | 부가가치세 과세표준증명 발급 / VAT tax base certificate | `requestVatTaxBaseCert` / `getVatTaxBaseCert` | `business_no`, `year`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `period`(`1`·`2`·`all`), `engl_yn`, `format` |
459
+ | 표준재무제표증명 발급 / Financial statements certificate | `requestFinancialStatementCert` / `getFinancialStatementCert` | `business_no`, `year`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `engl_yn`, `format` |
460
+ | 폐업사실증명 발급 / Business closure certificate | `requestClosureCert` / `getClosureCert` | `business_no`, `use_purpose`, `submit_to`, `delivery` (필수 / required), `engl_yn`, `format` |
461
+
462
+ 홈택스 민원증명은 발급 1건 60P 정액이고 `format` 으로 응답을 고릅니다(`pdf`·`json`·`both`, 기본 `both`). `json`·`both` 이면 발급된 PDF를 파싱한 `PDF데이터.필드` 가 함께 오며, 표 구조에 따라 필드가 비어 있을 수 있습니다. 구조화 값의 정본은 결과 본문(`문서확인번호`·`귀속연도` 등)입니다.
463
+ Hometax certificates cost a flat 60P per issuance. `format` selects the response (`pdf`, `json`, or `both`; default `both`). With `json`/`both` the parsed PDF fields arrive in `PDF데이터.필드`; some fields may be empty depending on the table layout. The structured values in the result body (`문서확인번호`, `귀속연도`, …) are authoritative.
464
+
465
+ 법원 경매사건 조회는 동기 상품입니다. 사건번호는 법원별로 관리되므로 `courtAuction(caseNo, court)` 처럼 법원(이름 `서울중앙지방법원` 또는 코드 `B000210`)을 함께 넘깁니다. 응답에는 사건 기본정보·매각물건·매각기일·배당요구종기가 담기고, 입찰대행·입찰서 작성은 제공하지 않습니다.
466
+ Court auction lookup is synchronous. A case number belongs to one court, so pass the court (name such as `서울중앙지방법원` or code such as `B000210`) together: `courtAuction(caseNo, court)`. The result contains case details, sale items, sale schedule and the dividend claim deadline; bidding assistance and bid form preparation are not provided.
467
+
468
+ 등기·증명서 발급확인 `registryDocVerify(issueNo, options)` 는 증명서에 인쇄된 발급확인번호 12자리(하이픈·공백 허용)와 문서 종류 `options.kind`(`realestate` 기본, `corporate`, `movable`)를 받습니다. 응답은 `verified`·`status`·`message`·`document`·`issued_date`·`registry_office` 이며 증명서 원문은 포함되지 않습니다. 발급일로부터 3개월 이내 발급분만 확인됩니다.
469
+ `registryDocVerify(issueNo, options)` verifies the 12-character verification number printed on an issued registration certificate (hyphens and spaces are accepted); `options.kind` selects `realestate` (default), `corporate` or `movable`. The result carries `verified`, `status`, `message`, `document`, `issued_date` and `registry_office` — never the certificate itself — and only certificates issued within the last three months can be verified.
470
+
471
+ 증빙서류 묶음 2종은 휴대폰 승인 한 번으로 담긴 증명을 함께 발급합니다. 소득 묶음은 소득금액증명·연금보험료등 소득세액 공제확인서(결과 `result.incomeAmountCert`·`result.pensionCreditCert`), 사업자 묶음은 사업자등록증명·부가가치세 과세표준증명·표준재무제표증명(결과 `result.businessRegistrationCert`·`result.vatTaxBaseCert`·`result.financialStatementCert`)입니다. 접수 20P, 최초 결과는 84P·126P로 개별 발급 합계보다 30% 쌉니다. 사업자 묶음은 대표자 본인 확인을 받으므로 `agreed: true` 또는 이전 응답의 `bind_id`(같은 계정·같은 사업자등록번호, 90일)를 보내야 하며, 빠지면 SDK가 호출 전에 `TypeError` 를 던집니다. 일부 증명만 발급되면 `status` 가 `PARTIAL_SUCCESS` 이고 결과 단가는 그대로 청구됩니다.
472
+ The two certificate bundles issue every included certificate after a single phone approval. Acceptance is 20P and the first result is 84P (income) or 126P (business), 30% below issuing each certificate separately. The business bundle requires representative consent: send `agreed: true` or a `bind_id` from a previous response (same account and business number, valid for 90 days); the SDK throws a `TypeError` before calling the server when both are missing. If only some certificates are issued, `status` is `PARTIAL_SUCCESS` and the bundle result price still applies.
473
+
474
+ ```js
475
+ const bundle = await client.requestBusinessCertBundle({
476
+ name: '홍길동', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
477
+ business_no: '1234567890', year: '2025', period: 'all',
478
+ use_purpose: '99', submit_to: '99', delivery: '06', format: 'json', agreed: true
479
+ });
480
+ const issued = await pollDataResult(id => client.getBusinessCertBundle(id), bundle);
481
+ const { businessRegistrationCert, vatTaxBaseCert, financialStatementCert } = issued.data.result;
482
+ ```
414
483
 
415
484
  ## 오류 처리 / Error handling
416
485
 
@@ -505,13 +574,19 @@ Set `APICK_API_KEY` in the environment. 원격 MCP는 업로드된 자료를 처
505
574
 
506
575
 
507
576
  TTS: [Gemini·ChatGPT·정규화 / engines and normalization](docs/tts.md). `createOpenAiTtsJob`, `listOpenAiTtsVoices`, `getTtsOptions`를 포함한 최신 계약입니다.
508
-
509
- ## 차량 자유문 검색 / Vehicle free-text search
510
-
511
- 차명에 등급·연식·좌석을 함께 넣을 수 있습니다(`파나메라 gts 4인승 19년식`, `PANAMERA GTS 19년`). 입력한 연식·등급을 우선하며 좌석 수는 실제 제원과 일치해야 합니다. 근접 연식을 선택하면 반환 연식과 안내를 확인하세요. 지정 등급을 찾지 못하거나 확신이 낮으면 제원 없이 무료 후보만 반환하며, 유사 차량이 전혀 없으면 없음 오류로 응답하고 과금하지 않습니다. 별도 연식·등급과 문장 조건이 충돌하면 입력 오류입니다.
512
-
513
- Put the model, trim, year and seat count in model (for example, PANAMERA GTS 19년). Matching prioritizes the supplied year and trim, and the seat count must match the specification. Check the returned year and notice when a nearby year is selected. Unmatched trims and low-confidence matches return suggestions without specifications or charges; no similar vehicle returns a no-result error without charging. Conflicting explicit and free-text constraints are rejected.
514
-
515
- ```js
516
- await client.vehicleModelInfo({ model: "파나메라 gts 4인승 19년식" });
517
- ```
577
+
578
+ ## 차량 자유문 검색 / Vehicle free-text search
579
+
580
+ 차명에 등급·연식·좌석을 함께 넣을 수 있습니다(`파나메라 gts 4인승 19년식`, `PANAMERA GTS 19년`). 입력한 연식·등급을 우선하며 좌석 수는 확인 가능한 차량 사양과 일치해야 합니다. 근접 연식을 선택하면 반환 연식과 안내를 확인하세요. 지정 등급을 찾지 못하거나 확신이 낮으면 제원 없이 무료 후보만 반환하며, 유사 차량이 전혀 없으면 없음 오류로 응답하고 과금하지 않습니다. 별도 연식·등급과 문장 조건이 충돌하면 입력 오류입니다.
581
+
582
+ Put the model, trim, year and seat count in model (for example, PANAMERA GTS 19년). Matching prioritizes the supplied year and trim, and the seat count must be identifiable and consistent with the available specification. Check the returned year and notice when a nearby year is selected. Unmatched trims and low-confidence matches return suggestions without specifications or charges; no similar vehicle returns a no-result error without charging. Conflicting explicit and free-text constraints are rejected.
583
+
584
+ ```js
585
+ await client.vehicleModelInfo({ model: "파나메라 gts 4인승 19년식" });
586
+ ```
587
+
588
+ ### 차량정보 안내 / Vehicle information notices
589
+
590
+ 차량정보는 공백·대소문자가 다른 동일 등급을 우선해 찾으며 연식·사양이 다른 차량은 구분합니다. 기존 `안내`에서 연식·사양 대체, 사양 충돌, 국내 출시 여부 확인 보류, 일부 제원의 추가 검증 상태를 확인할 수 있습니다. 국내 미출시가 확인된 차량은 해외 자료 기준이며 100% 정확성을 보장하지 않는다는 안내가 추가됩니다. 반환된 연식·등급과 안내를 확인하세요. 입력·응답 구조와 과금 방식은 유지됩니다.
591
+
592
+ Vehicle information prioritizes the same trim across spacing and case variations while distinguishing model years and specifications. The existing `안내` notice can describe year/specification substitutions, conflicting specifications, unverified Korean-market availability, or specifications still under review. Confirmed non-Korean-market vehicles receive an additional notice that overseas data does not guarantee 100% accuracy. Check the returned year, trim and notices. Request/response shapes and billing behavior remain unchanged.
package/SECURITY.md CHANGED
@@ -1,11 +1,11 @@
1
- # Security
2
-
3
- ## API keys
4
-
5
- Keep APICK API keys in server-side environment variables. Do not commit keys, include them in client-side browser bundles, place them in URLs, or print them in logs.
6
-
7
- If a key may have been exposed, regenerate it from your APICK account immediately.
8
-
9
- ## Reporting a vulnerability
10
-
11
- Please report security issues privately through the contact channel listed at <https://apick.app>. Do not open a public issue containing credentials, personal data, or exploit details.
1
+ # Security
2
+
3
+ ## API keys
4
+
5
+ Keep APICK API keys in server-side environment variables. Do not commit keys, include them in client-side browser bundles, place them in URLs, or print them in logs.
6
+
7
+ If a key may have been exposed, regenerate it from your APICK account immediately.
8
+
9
+ ## Reporting a vulnerability
10
+
11
+ Please report security issues privately through the contact channel listed at <https://apick.app>. Do not open a public issue containing credentials, personal data, or exploit details.
package/docs/guide.en.md CHANGED
@@ -306,6 +306,38 @@ Sources: [APICK development guide](https://apick.app/dev_guide/data_health_check
306
306
 
307
307
  `authProvider` is one of the 13 values in `AUTH_PROVIDERS` (kakao, naver, toss, pass, samsung, kb, shinhan, hana, woori, ibk, nh, kakaobank, banksalad). Acceptance is billed at a flat rate; the result is billed only on its first return and free to re-poll afterward. `requestEmployment` takes an optional `insuranceYears` (1-3), `requestPersonalIncome` takes `incomeYears` (1-5), and `requestNpsJoinHistory` takes optional `from`/`to` (`YYYY-MM`). `requestNpsDeductionCert` takes optional `years` (1-5) and `requestNpsCareerHistory` takes optional `from`/`to` (`YYYY-MM`). `requestCashReceiptDeduction` takes optional `incomeYears` (1-3) and `requestTaxReturnHistory` takes optional `years` (1-10). The remaining products are `requestDrivingLicense` and `requestHealthCheckup`.
308
308
 
309
+ `requestResidentRegistration()` and `requestResidentRegistrationCho()` issue the resident registration certificate and require the resident address `sido` and `sigungu`. Each issue costs 80P, and the result carries the PDF base64 in `발급문서` and its SHA-256 in `문서해시`. `requestGov24Bundle()` collects only the products named in `products` with a single authentication, and the charge is the sum of the selected products' prices. `GOV24_BUNDLE_PRODUCTS` exports the 13 selectable keys, and `sido`/`sigungu` are required only when a resident registration product is selected.
310
+
311
+ ```js
312
+ const bundle = await client.requestGov24Bundle({
313
+ name: 'Hong Gildong', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
314
+ products: ['resident_registration', 'resident_registration_cho'],
315
+ sido: '서울특별시', sigungu: '구로구'
316
+ });
317
+ const issued = await pollDataResult(id => client.getGov24Bundle(id), bundle);
318
+ ```
319
+
320
+ Hometax certificates are issued with `requestIncomeAmountCert` (income amount), `requestPensionCreditCert` (pension credit), `requestFactCert` (tax payment fact) and `requestTaxClearanceCert` (tax clearance) at a flat 60P per issuance. Every call issues for the authenticated person and requires `year`, `use_purpose`, `submit_to` and `delivery`; `format` (`pdf`, `json` or `both`, default `both`) selects the response. With `json`/`both` the parsed PDF fields arrive in `PDF데이터.필드`, and some fields may be empty depending on the table layout. The values in the result body such as `문서확인번호` and `귀속연도` are authoritative.
321
+
322
+ ```js
323
+ const cert = await client.requestIncomeAmountCert({
324
+ name: 'Hong Gildong', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
325
+ year: '2025', use_purpose: '99', submit_to: '99', delivery: '06', format: 'both'
326
+ });
327
+ const issuedCert = await pollDataResult(id => client.getIncomeAmountCert(id), cert);
328
+ ```
329
+
330
+ The certificate bundles `requestIncomeCertBundle` (income amount and pension credit certificates) and `requestBusinessCertBundle` (business registration, VAT tax base and standard financial statement certificates) issue every included certificate after one approval. They take the same issue inputs as the single certificates, and each certificate has its own result section such as `result.incomeAmountCert`. The first result costs 84P and 126P. The business bundle needs `business_no` and representative consent (`agreed: true` or a `bind_id` from a previous response). With `PARTIAL_SUCCESS` some certificates were not issued and the bundle price still applies, so check for empty sections.
331
+
332
+ ```js
333
+ const incomeDocs = await client.requestIncomeCertBundle({
334
+ name: '홍길동', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
335
+ year: '2025', use_purpose: '99', submit_to: '99', delivery: '06', format: 'json'
336
+ });
337
+ const incomeResult = await pollDataResult(id => client.getIncomeCertBundle(id), incomeDocs);
338
+ console.log(incomeResult.data.result.incomeAmountCert?.문서확인번호, incomeResult.data.result.pensionCreditCert?.문서확인번호);
339
+ ```
340
+
309
341
  ## Skills
310
342
 
311
343
  Search and run reviewed Skills. Each Skill fixes its input format (`input_schema`), output format (`output_schema`) and base amount (`price_points`). A run is charged only when a result in the promised format is returned.
package/docs/guide.ko.md CHANGED
@@ -233,7 +233,7 @@ console.log(result.data.result.fields);
233
233
 
234
234
  ## 간편인증 데이터 조회
235
235
 
236
- 재직·소득·연금·면허·건강검진·현금영수증·국세 신고내역 조회는 본인 간편인증이 필요해 접수(`request*`)와 결과 조회(`get*`)가 나뉩니다.
236
+ 재직·소득·연금·면허·건강검진·현금영수증·국세 신고내역·주민등록표 발급·정부24 통합 조회는 본인 간편인증이 필요해 접수(`request*`)와 결과 조회(`get*`)가 나뉩니다.
237
237
 
238
238
  아래 함수는 7종 모두에 공통으로 사용합니다. 같은 `transactionId`로 순차 조회하며 5→10→20→30초 간격으로 늘린 뒤 30초를 유지합니다. `resultAvailable === true`이면 즉시 결과를 반환합니다. `SUCCESS`는 전체 성공, `PARTIAL_SUCCESS`는 부분 성공이므로 `sources`에서 누락·실패 항목을 확인하세요. `AUTH_REJECTED`·`AUTH_EXPIRED`·`FAILED`는 실패 종료이며, `errorCode: 'RESULT_EXPIRED'`는 결과 보관 기간 만료입니다. 실패·만료 시 자동으로 재접수하지 않습니다.
239
239
 
@@ -309,6 +309,38 @@ try {
309
309
 
310
310
  `authProvider`는 `AUTH_PROVIDERS`(13종: kakao, naver, toss, pass, samsung, kb, shinhan, hana, woori, ibk, nh, kakaobank, banksalad) 중 하나입니다. 접수는 정액 과금, 결과는 최초 반환에서만 과금되며 재조회는 무료입니다. `requestEmployment`는 `insuranceYears`(1~3), `requestPersonalIncome`은 `incomeYears`(1~5), `requestNpsJoinHistory`는 `from`/`to`(`YYYY-MM`) 선택 입력을 받습니다. `requestNpsDeductionCert`는 `years`(1~5), `requestNpsCareerHistory`는 `from`/`to`(`YYYY-MM`) 선택 입력을 받습니다. `requestCashReceiptDeduction`은 `incomeYears`(1~3), `requestTaxReturnHistory`는 `years`(1~10) 선택 입력을 받습니다. 나머지 상품은 `requestDrivingLicense`, `requestHealthCheckup`입니다.
311
311
 
312
+ 주민등록표등본·초본은 `requestResidentRegistration()`·`requestResidentRegistrationCho()`로 발급하며 주민등록 주소지 `sido`·`sigungu`가 필수입니다. 발급 1건은 80P이고 결과의 `발급문서`는 PDF 원본의 base64, `문서해시`는 그 SHA-256입니다. 정부24 통합 조회 `requestGov24Bundle()`은 `products`에 고른 상품만 한 번의 인증으로 조회하며, 과금은 고른 상품 단가의 합입니다. 선택 가능한 13개 키는 `GOV24_BUNDLE_PRODUCTS`로 제공하고 `sido`·`sigungu`는 등본·초본을 고를 때만 필요합니다.
313
+
314
+ ```js
315
+ const bundle = await client.requestGov24Bundle({
316
+ name: '홍길동', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
317
+ products: ['resident_registration', 'resident_registration_cho'],
318
+ sido: '서울특별시', sigungu: '구로구'
319
+ });
320
+ const issued = await pollDataResult(id => client.getGov24Bundle(id), bundle);
321
+ ```
322
+
323
+ 홈택스 민원증명은 `requestIncomeAmountCert`(소득금액증명), `requestPensionCreditCert`(연금보험료등 소득세액 공제확인서), `requestFactCert`(납부내역증명), `requestTaxClearanceCert`(납세증명서)로 발급하며 발급 1건은 60P입니다. 모두 본인명의 발급이고 `year`·`use_purpose`·`submit_to`·`delivery`가 필수이며 `format`(`pdf`·`json`·`both`, 기본 `both`)으로 응답을 고릅니다. `json`·`both` 이면 발급된 PDF를 파싱한 `PDF데이터.필드`가 함께 오고, 표 구조에 따라 일부 필드는 비어 있을 수 있습니다. 결과 본문의 `문서확인번호`·`귀속연도` 같은 값이 정본입니다.
324
+
325
+ ```js
326
+ const cert = await client.requestIncomeAmountCert({
327
+ name: '홍길동', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
328
+ year: '2025', use_purpose: '99', submit_to: '99', delivery: '06', format: 'both'
329
+ });
330
+ const issuedCert = await pollDataResult(id => client.getIncomeAmountCert(id), cert);
331
+ ```
332
+
333
+ 증빙서류 묶음 `requestIncomeCertBundle`(소득금액증명·연금보험료등 소득세액 공제확인서)과 `requestBusinessCertBundle`(사업자등록증명·부가가치세 과세표준증명·표준재무제표증명)은 승인 한 번으로 담긴 증명을 함께 발급합니다. 발급 입력은 단건 증명과 같고 결과는 증명마다 `result.incomeAmountCert`처럼 섹션이 따로 옵니다. 최초 결과는 84P·126P입니다. 사업자 묶음은 `business_no`와 대표자 본인 확인(`agreed: true` 또는 이전 응답의 `bind_id`)이 필요합니다. 일부 증명만 발급되면 `status`가 `PARTIAL_SUCCESS`이며 결과 단가는 그대로 청구되니 섹션이 비었는지 확인하세요.
334
+
335
+ ```js
336
+ const incomeDocs = await client.requestIncomeCertBundle({
337
+ name: '홍길동', birthDate: '19900101', phone: '01011112222', authProvider: 'kakao',
338
+ year: '2025', use_purpose: '99', submit_to: '99', delivery: '06', format: 'json'
339
+ });
340
+ const incomeResult = await pollDataResult(id => client.getIncomeCertBundle(id), incomeDocs);
341
+ console.log(incomeResult.data.result.incomeAmountCert?.문서확인번호, incomeResult.data.result.pensionCreditCert?.문서확인번호);
342
+ ```
343
+
312
344
  ## Skills
313
345
 
314
346
  검수를 거친 Skill 을 검색하고 실행합니다. Skill 마다 입력 형식(`input_schema`)·결과 형식(`output_schema`)·기본 금액(`price_points`)이 정해져 있으며, 결과가 약속한 형식으로 반환된 실행만 차감됩니다.
package/package.json CHANGED
@@ -1,71 +1,71 @@
1
- {
2
- "name": "apick-api",
3
- "version": "4.8.2",
4
- "description": "Official zero-dependency Node.js client for APICK data, AI, and image APIs. 에이픽 데이터·AI·이미지 API 공식 Node.js SDK.",
5
- "type": "module",
6
- "main": "./src/index.cjs",
7
- "module": "./src/index.js",
8
- "types": "./src/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./src/index.d.ts",
12
- "import": "./src/index.js",
13
- "require": "./src/index.cjs"
14
- }
15
- },
16
- "files": [
17
- "src",
18
- "docs",
19
- "examples",
20
- "README.md",
21
- "CHANGELOG.md",
22
- "SECURITY.md",
23
- "LICENSE"
24
- ],
25
- "sideEffects": false,
26
- "engines": {
27
- "node": ">=18"
28
- },
29
- "scripts": {
30
- "test": "node --test && npm run test:types",
31
- "test:types": "tsc -p tsconfig.json",
32
- "test:coverage": "node --test --experimental-test-coverage",
33
- "prepublishOnly": "npm test"
34
- },
35
- "devDependencies": {
36
- "typescript": "^7.0.2"
37
- },
38
- "repository": {
39
- "type": "git",
40
- "url": "git+https://github.com/lead788/apick-api.git"
41
- },
42
- "bugs": {
43
- "url": "https://github.com/lead788/apick-api/issues"
44
- },
45
- "homepage": "https://apick.app/dev_guide",
46
- "license": "MIT",
47
- "author": "APICK",
48
- "publishConfig": {
49
- "access": "public",
50
- "provenance": false
51
- },
52
- "keywords": [
53
- "apick",
54
- "api",
55
- "sdk",
56
- "korea",
57
- "korean-api",
58
- "business-registry",
59
- "parcel-tracking",
60
- "address",
61
- "ocr",
62
- "whois",
63
- "dns",
64
- "google-search",
65
- "pdf",
66
- "excel",
67
- "tts-jobs",
68
- "text-summary",
69
- "image-generation"
70
- ]
71
- }
1
+ {
2
+ "name": "apick-api",
3
+ "version": "4.11.0",
4
+ "description": "Official zero-dependency Node.js client for APICK data, AI, and image APIs. 에이픽 데이터·AI·이미지 API 공식 Node.js SDK.",
5
+ "type": "module",
6
+ "main": "./src/index.cjs",
7
+ "module": "./src/index.js",
8
+ "types": "./src/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/index.d.ts",
12
+ "import": "./src/index.js",
13
+ "require": "./src/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "src",
18
+ "docs",
19
+ "examples",
20
+ "README.md",
21
+ "CHANGELOG.md",
22
+ "SECURITY.md",
23
+ "LICENSE"
24
+ ],
25
+ "sideEffects": false,
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "scripts": {
30
+ "test": "node --test && npm run test:types",
31
+ "test:types": "tsc -p tsconfig.json",
32
+ "test:coverage": "node --test --experimental-test-coverage",
33
+ "prepublishOnly": "npm test"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^7.0.2"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/lead788/apick-api.git"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/lead788/apick-api/issues"
44
+ },
45
+ "homepage": "https://apick.app/dev_guide",
46
+ "license": "MIT",
47
+ "author": "APICK",
48
+ "publishConfig": {
49
+ "access": "public",
50
+ "provenance": false
51
+ },
52
+ "keywords": [
53
+ "apick",
54
+ "api",
55
+ "sdk",
56
+ "korea",
57
+ "korean-api",
58
+ "business-registry",
59
+ "parcel-tracking",
60
+ "address",
61
+ "ocr",
62
+ "whois",
63
+ "dns",
64
+ "google-search",
65
+ "pdf",
66
+ "excel",
67
+ "tts-jobs",
68
+ "text-summary",
69
+ "image-generation"
70
+ ]
71
+ }
package/src/index.cjs CHANGED
@@ -16,6 +16,13 @@ const AUTH_PROVIDERS = Object.freeze([
16
16
  'kakao', 'naver', 'toss', 'pass', 'samsung', 'kb', 'shinhan', 'hana', 'woori', 'ibk', 'nh', 'kakaobank', 'banksalad'
17
17
  ]);
18
18
  const AUTH_PROVIDER_SET = new Set(AUTH_PROVIDERS);
19
+ // 정부24 통합 조회에서 고를 수 있는 상품 키. 서버 공개 목록과 같다.
20
+ const GOV24_BUNDLE_PRODUCTS = Object.freeze([
21
+ 'resident_registration', 'resident_registration_cho', 'driving_license', 'health_checkup',
22
+ 'police_penalty', 'parking_fine_target', 'mortgage_loan', 'housing_refund_balance',
23
+ 'housing_pension_balance', 'housing_loan_stage', 'mortgage_application', 'confirm_verify', 'power_bill'
24
+ ]);
25
+ const GOV24_BUNDLE_PRODUCT_SET = new Set(GOV24_BUNDLE_PRODUCTS);
19
26
 
20
27
  const SERVICE_DEFINITIONS = Object.freeze({
21
28
  businessDetails: { endpoint: '/rest/biz_detail', timeoutMs: 50_000, output: 'json' },
@@ -53,6 +60,8 @@ const SERVICE_DEFINITIONS = Object.freeze({
53
60
  linkedinProfile: { endpoint: '/rest/linkedin_profile', timeoutMs: 110_000, output: 'json' },
54
61
  linkedinCompany: { endpoint: '/rest/linkedin_company', timeoutMs: 110_000, output: 'json' },
55
62
  linkedinJob: { endpoint: '/rest/linkedin_job', timeoutMs: 110_000, output: 'json' },
63
+ courtAuction: { endpoint: '/rest/court_auction', timeoutMs: 45_000, output: 'json' },
64
+ registryDocVerify: { endpoint: '/rest/registry_doc_verify', timeoutMs: 30_000, output: 'json' },
56
65
  screenshot: { endpoint: '/rest/url_screenshot', timeoutMs: 75_000, output: 'binary', filename: 'screenshot.jpeg' },
57
66
  youtubeMetadata: { endpoint: '/rest/youtube_metadata', timeoutMs: 60_000, output: 'json' },
58
67
  youtubeThumbnail: { endpoint: '/rest/youtube_thumbnail', timeoutMs: 60_000, output: 'binary', filename: 'thumbnail.jpg' },
@@ -78,7 +87,20 @@ const SERVICE_DEFINITIONS = Object.freeze({
78
87
  requestDrivingLicense: { endpoint: '/rest/req_driving_license', timeoutMs: 35_000, output: 'json' },
79
88
  requestHealthCheckup: { endpoint: '/rest/req_health_checkup', timeoutMs: 35_000, output: 'json' },
80
89
  requestCashReceiptDeduction: { endpoint: '/rest/req_cash_receipt_deduction', timeoutMs: 35_000, output: 'json' },
81
- requestTaxReturnHistory: { endpoint: '/rest/req_tax_return_history', timeoutMs: 35_000, output: 'json' }
90
+ requestTaxReturnHistory: { endpoint: '/rest/req_tax_return_history', timeoutMs: 35_000, output: 'json' },
91
+ requestIncomeAmountCert: { endpoint: '/rest/req_income_amount_cert', timeoutMs: 60_000, output: 'json' },
92
+ requestPensionCreditCert: { endpoint: '/rest/req_pension_credit_cert', timeoutMs: 60_000, output: 'json' },
93
+ requestFactCert: { endpoint: '/rest/req_fact_cert', timeoutMs: 60_000, output: 'json' },
94
+ requestTaxClearanceCert: { endpoint: '/rest/req_tax_clearance_cert', timeoutMs: 60_000, output: 'json' },
95
+ requestIncomeCertBundle: { endpoint: '/rest/req_income_cert_bundle', timeoutMs: 60_000, output: 'json' },
96
+ requestBusinessCertBundle: { endpoint: '/rest/req_business_cert_bundle', timeoutMs: 60_000, output: 'json' },
97
+ requestBusinessRegistrationCert: { endpoint: '/rest/req_business_registration_cert', timeoutMs: 60_000, output: 'json' },
98
+ requestVatTaxBaseCert: { endpoint: '/rest/req_vat_tax_base_cert', timeoutMs: 60_000, output: 'json' },
99
+ requestFinancialStatementCert: { endpoint: '/rest/req_financial_statement_cert', timeoutMs: 60_000, output: 'json' },
100
+ requestClosureCert: { endpoint: '/rest/req_closure_cert', timeoutMs: 60_000, output: 'json' },
101
+ requestResidentRegistration: { endpoint: '/rest/req_resident_registration', timeoutMs: 35_000, output: 'json' },
102
+ requestResidentRegistrationCho: { endpoint: '/rest/req_resident_registration_cho', timeoutMs: 35_000, output: 'json' },
103
+ requestGov24Bundle: { endpoint: '/rest/req_gov24_bundle', timeoutMs: 35_000, output: 'json' }
82
104
  });
83
105
 
84
106
  const SERVICES = Object.freeze(Object.fromEntries(
@@ -241,6 +263,81 @@ function dataRequestInput(input) {
241
263
  };
242
264
  }
243
265
 
266
+ // 홈택스 민원증명. 발급 조건은 REST 필드명 그대로 보낸다(서버가 최상위 평면 이름을 읽는다).
267
+ // 공통 인증 입력(name·birthDate·phone·authProvider)은 dataRequestInput 이 만든다.
268
+ const INCOME_AMOUNT_CERT_OPTIONS = Object.freeze(['year', 'use_purpose', 'submit_to', 'delivery', 'format', 'engl_yn', 'quantity', 'email', 'fax_no', 'wallet_address']);
269
+ const PENSION_CREDIT_CERT_OPTIONS = Object.freeze(['year', 'use_purpose', 'submit_to', 'delivery', 'format', 'address_open_yn', 'resno_open_yn', 'quantity', 'email', 'fax_no', 'wallet_address']);
270
+ const FACT_CERT_OPTIONS = Object.freeze(['year', 'start_month', 'end_month', 'itrf_cd', 'issuance', 'engl_yn', 'use_purpose', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address']);
271
+ const TAX_CLEARANCE_CERT_OPTIONS = Object.freeze(['cert_type', 'year', 'start_month', 'end_month', 'itrf_cd', 'issuance', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address']);
272
+ const BUSINESS_REGISTRATION_CERT_OPTIONS = Object.freeze(['business_no', 'engl_yn', 'use_purpose', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address']);
273
+ const VAT_TAX_BASE_CERT_OPTIONS = Object.freeze(['business_no', 'year', 'period', 'engl_yn', 'use_purpose', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address']);
274
+ const FINANCIAL_STATEMENT_CERT_OPTIONS = Object.freeze(['business_no', 'year', 'engl_yn', 'use_purpose', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address']);
275
+ const CLOSURE_CERT_OPTIONS = Object.freeze(['business_no', 'engl_yn', 'use_purpose', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address']);
276
+
277
+ // 증빙서류 묶음. 승인 한 번으로 담긴 증명을 함께 발급하며 담긴 증명이 같은 발급 입력을 공유한다.
278
+ const INCOME_CERT_BUNDLE_OPTIONS = Object.freeze(['year', 'use_purpose', 'submit_to', 'delivery', 'format', 'amount_open_yn', 'income_source_open_yn', 'withholding_all_print_yn', 'address_open_yn', 'resno_open_yn', 'quantity', 'email', 'fax_no', 'wallet_address']);
279
+ const BUSINESS_CERT_BUNDLE_OPTIONS = Object.freeze(['year', 'period', 'engl_yn', 'use_purpose', 'submit_to', 'delivery', 'format', 'quantity', 'email', 'fax_no', 'wallet_address', 'bind_id']);
280
+
281
+ function hometaxCertInput(input, keys) {
282
+ const config = input || {};
283
+ const payload = dataRequestInput(config);
284
+ keys.forEach(function (key) {
285
+ const value = config[key];
286
+ if (value === undefined || value === null || value === '') return;
287
+ payload[key] = String(value);
288
+ });
289
+ if (payload.format === undefined) payload.format = 'both';
290
+ return payload;
291
+ }
292
+
293
+ // 사업자 증빙서류 묶음은 대표자 본인 확인을 받는다. bind_id 가 없으면 agreed=true 가 있어야
294
+ // 서버가 접수하므로, 빠진 요청은 서버를 부르기 전에 막는다.
295
+ function businessCertBundleInput(input) {
296
+ const config = input || {};
297
+ const payload = hometaxCertInput(config, BUSINESS_CERT_BUNDLE_OPTIONS);
298
+ payload.business_no = normalizeBusinessNumber(config.business_no);
299
+ if (config.agreed === true) payload.agreed = 'true';
300
+ else if (config.agreed !== undefined && config.agreed !== false) throw new TypeError('agreed must be a boolean.');
301
+ if (!payload.bind_id && payload.agreed !== 'true') {
302
+ throw new TypeError('agreed must be true when bind_id is not provided.');
303
+ }
304
+ return payload;
305
+ }
306
+
307
+ // 주민등록표 발급은 주민등록 주소지(시도·시군구)로 처리기관을 정한다. 서버가 이 값을 필수로 본다.
308
+ function residentAddressInput(config) {
309
+ return {
310
+ sido: requiredString('sido', config.sido, 40),
311
+ sigungu: requiredString('sigungu', config.sigungu, 40)
312
+ };
313
+ }
314
+
315
+ // 등본·초본의 선택 입력. Y/N 은 서버가 그대로 해석하므로 다른 값은 보내지 않는다.
316
+ function residentOptionsInput(config, payload) {
317
+ const purposeCd = optionalText('purposeCd', config.purposeCd, 8);
318
+ if (purposeCd !== undefined) payload.purposeCd = purposeCd;
319
+ const submitTarget = optionalText('submitTarget', config.submitTarget, 100);
320
+ if (submitTarget !== undefined) payload.submitTarget = submitTarget;
321
+ const includeAddressHistory = optionalChoice('includeAddressHistory', config.includeAddressHistory, ['Y', 'N']);
322
+ if (includeAddressHistory !== undefined) payload.includeAddressHistory = includeAddressHistory;
323
+ const includeHousehold = optionalChoice('includeHousehold', config.includeHousehold, ['Y', 'N']);
324
+ if (includeHousehold !== undefined) payload.includeHousehold = includeHousehold;
325
+ return payload;
326
+ }
327
+
328
+ // 통합 조회는 고른 상품 키를 쉼표로 이어 보낸다. 서버는 배열과 쉼표 문자열을 모두 받는다.
329
+ function gov24BundleProductsInput(value) {
330
+ const list = Array.isArray(value) ? value : String(value === undefined || value === null ? '' : value).split(',');
331
+ const keys = list.map(function(item) { return String(item).trim(); }).filter(Boolean);
332
+ if (!keys.length) throw new TypeError('products must select at least one product key.');
333
+ keys.forEach(function(key) {
334
+ if (!GOV24_BUNDLE_PRODUCT_SET.has(key)) {
335
+ throw new RangeError(`products contains an unsupported key: ${key}.`);
336
+ }
337
+ });
338
+ return Array.from(new Set(keys)).join(',');
339
+ }
340
+
244
341
  const SKILL_CATEGORIES = Object.freeze(['data', 'ai', 'dev', 'document', 'marketing', 'finance', 'productivity', 'video', 'etc']);
245
342
  const SKILL_CATEGORY_SET = new Set(SKILL_CATEGORIES);
246
343
  const SKILL_SORTS = Object.freeze(['recommended', 'popular', 'used', 'likes', 'rating', 'new', 'mine', 'liked']);
@@ -715,6 +812,22 @@ class ApickClient {
715
812
  return this._call('linkedinJob', linkedinInput(url));
716
813
  }
717
814
 
815
+ // 법원 경매사건. 사건번호와 법원(이름 또는 법원 코드)이 함께 필요하다.
816
+ courtAuction(caseNo, court) {
817
+ return this._call('courtAuction', {
818
+ case_no: requiredString('caseNo', caseNo, 64),
819
+ court: requiredString('court', court, 64)
820
+ });
821
+ }
822
+
823
+ // 등기사항증명서 등 발급확인. issueNo 는 증명서에 인쇄된 발급확인번호 12자리다.
824
+ registryDocVerify(issueNo, options) {
825
+ const config = options || {};
826
+ const input = { issue_no: requiredString('issueNo', issueNo, 32) };
827
+ if (config.kind !== undefined) input.kind = requiredString('kind', config.kind, 16);
828
+ return this._call('registryDocVerify', input);
829
+ }
830
+
718
831
  screenshot(url) {
719
832
  return this._call('screenshot', { url: normalizeUrl(url) });
720
833
  }
@@ -1125,6 +1238,134 @@ class ApickClient {
1125
1238
  return this._call('requestTaxReturnHistory', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_tax_return_history' });
1126
1239
  }
1127
1240
 
1241
+ // 홈택스 민원증명 발급. 신청인 본인명의이고 발급 1건 60P 정액이다.
1242
+ // 응답은 format(pdf·json·both)으로 고른다. json 이면 발급된 PDF를 파싱한 PDF데이터가 함께 온다.
1243
+ requestIncomeAmountCert(input) {
1244
+ return this._call('requestIncomeAmountCert', hometaxCertInput(input, INCOME_AMOUNT_CERT_OPTIONS));
1245
+ }
1246
+
1247
+ getIncomeAmountCert(transactionId) {
1248
+ return this._call('requestIncomeAmountCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_income_amount_cert' });
1249
+ }
1250
+
1251
+ requestPensionCreditCert(input) {
1252
+ return this._call('requestPensionCreditCert', hometaxCertInput(input, PENSION_CREDIT_CERT_OPTIONS));
1253
+ }
1254
+
1255
+ getPensionCreditCert(transactionId) {
1256
+ return this._call('requestPensionCreditCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_pension_credit_cert' });
1257
+ }
1258
+
1259
+ requestFactCert(input) {
1260
+ return this._call('requestFactCert', hometaxCertInput(input, FACT_CERT_OPTIONS));
1261
+ }
1262
+
1263
+ getFactCert(transactionId) {
1264
+ return this._call('requestFactCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_fact_cert' });
1265
+ }
1266
+
1267
+ requestTaxClearanceCert(input) {
1268
+ return this._call('requestTaxClearanceCert', hometaxCertInput(input, TAX_CLEARANCE_CERT_OPTIONS));
1269
+ }
1270
+
1271
+ getTaxClearanceCert(transactionId) {
1272
+ return this._call('requestTaxClearanceCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_tax_clearance_cert' });
1273
+ }
1274
+
1275
+ // 소득 증빙서류 통합발급. 소득금액증명·연금보험료등 소득세액 공제확인서를 승인 한 번으로 발급한다.
1276
+ // 결과는 result.incomeAmountCert·result.pensionCreditCert 로 나뉘어 온다. 접수 20P, 최초 결과 84P.
1277
+ requestIncomeCertBundle(input) {
1278
+ return this._call('requestIncomeCertBundle', hometaxCertInput(input, INCOME_CERT_BUNDLE_OPTIONS));
1279
+ }
1280
+
1281
+ getIncomeCertBundle(transactionId) {
1282
+ return this._call('requestIncomeCertBundle', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_income_cert_bundle' });
1283
+ }
1284
+
1285
+ // 사업자 증빙서류 통합발급. 사업자등록증명·부가가치세 과세표준증명·표준재무제표증명을 함께 발급한다.
1286
+ // 결과는 result.businessRegistrationCert·vatTaxBaseCert·financialStatementCert 로 나뉜다. 최초 결과 126P.
1287
+ requestBusinessCertBundle(input) {
1288
+ return this._call('requestBusinessCertBundle', businessCertBundleInput(input));
1289
+ }
1290
+
1291
+ getBusinessCertBundle(transactionId) {
1292
+ return this._call('requestBusinessCertBundle', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_business_cert_bundle' });
1293
+ }
1294
+
1295
+ // 사업자 단위 증명. business_no 는 증명 대상 사업자등록번호 10자리다.
1296
+ requestBusinessRegistrationCert(input) {
1297
+ return this._call('requestBusinessRegistrationCert', hometaxCertInput(input, BUSINESS_REGISTRATION_CERT_OPTIONS));
1298
+ }
1299
+
1300
+ getBusinessRegistrationCert(transactionId) {
1301
+ return this._call('requestBusinessRegistrationCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_business_registration_cert' });
1302
+ }
1303
+
1304
+ requestVatTaxBaseCert(input) {
1305
+ return this._call('requestVatTaxBaseCert', hometaxCertInput(input, VAT_TAX_BASE_CERT_OPTIONS));
1306
+ }
1307
+
1308
+ getVatTaxBaseCert(transactionId) {
1309
+ return this._call('requestVatTaxBaseCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_vat_tax_base_cert' });
1310
+ }
1311
+
1312
+ requestFinancialStatementCert(input) {
1313
+ return this._call('requestFinancialStatementCert', hometaxCertInput(input, FINANCIAL_STATEMENT_CERT_OPTIONS));
1314
+ }
1315
+
1316
+ getFinancialStatementCert(transactionId) {
1317
+ return this._call('requestFinancialStatementCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_financial_statement_cert' });
1318
+ }
1319
+
1320
+ requestClosureCert(input) {
1321
+ return this._call('requestClosureCert', hometaxCertInput(input, CLOSURE_CERT_OPTIONS));
1322
+ }
1323
+
1324
+ getClosureCert(transactionId) {
1325
+ return this._call('requestClosureCert', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_closure_cert' });
1326
+ }
1327
+
1328
+ // 주민등록표 등본·초본 발급. 건당 80P 정액이고 결과에 PDF 원본(base64)·해시가 함께 온다.
1329
+ requestResidentRegistration(input) {
1330
+ const config = input || {};
1331
+ const payload = Object.assign(dataRequestInput(config), residentAddressInput(config));
1332
+ residentOptionsInput(config, payload);
1333
+ return this._call('requestResidentRegistration', payload);
1334
+ }
1335
+
1336
+ getResidentRegistration(transactionId) {
1337
+ return this._call('requestResidentRegistration', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_resident_registration' });
1338
+ }
1339
+
1340
+ requestResidentRegistrationCho(input) {
1341
+ const config = input || {};
1342
+ const payload = Object.assign(dataRequestInput(config), residentAddressInput(config));
1343
+ residentOptionsInput(config, payload);
1344
+ return this._call('requestResidentRegistrationCho', payload);
1345
+ }
1346
+
1347
+ getResidentRegistrationCho(transactionId) {
1348
+ return this._call('requestResidentRegistrationCho', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_resident_registration_cho' });
1349
+ }
1350
+
1351
+ // 정부24 통합 조회. 한 번의 인증으로 고른 상품만 조회하고, 단가는 고른 상품의 합으로 정해진다.
1352
+ requestGov24Bundle(input) {
1353
+ const config = input || {};
1354
+ const products = gov24BundleProductsInput(config.products);
1355
+ const payload = dataRequestInput(config);
1356
+ payload.products = products;
1357
+ // 등본·초본을 고를 때만 주민등록 주소지가 필요하다.
1358
+ if (products.split(',').some(function(key) { return key.indexOf('resident_registration') === 0; })) {
1359
+ Object.assign(payload, residentAddressInput(config));
1360
+ residentOptionsInput(config, payload);
1361
+ }
1362
+ return this._call('requestGov24Bundle', payload);
1363
+ }
1364
+
1365
+ getGov24Bundle(transactionId) {
1366
+ return this._call('requestGov24Bundle', { transactionId: normalizeTransactionId(transactionId) }, null, { endpoint: '/rest/get_gov24_bundle' });
1367
+ }
1368
+
1128
1369
  // Skills: 요청·응답이 모두 JSON 이고 data·api 봉투 없이 응답 항목이 최상위에 온다.
1129
1370
  // 오류는 { error: { code, message, details } } 형식이며 code 를 serviceCode 로 돌려준다.
1130
1371
  async _skills(method, path, options) {
@@ -1314,6 +1555,7 @@ module.exports = {
1314
1555
  SERVICES,
1315
1556
  TTS_VOICE_IDS,
1316
1557
  AUTH_PROVIDERS,
1558
+ GOV24_BUNDLE_PRODUCTS,
1317
1559
  SKILL_CATEGORIES,
1318
1560
  SKILL_SORTS,
1319
1561
  DEFAULT_BASE_URL
package/src/index.d.ts CHANGED
@@ -246,6 +246,57 @@ export interface LinkedinCompany {
246
246
  readonly updates: readonly { readonly title: string; readonly link: string; readonly date: string; readonly text: string }[];
247
247
  }
248
248
 
249
+ export interface CourtAuctionItem {
250
+ readonly itemNo: number | null;
251
+ readonly address: string;
252
+ readonly propertyKind: string;
253
+ readonly appraisedPrice: number | null;
254
+ readonly minimumPrice: number | null;
255
+ readonly failedCount: number;
256
+ readonly saleDate: string;
257
+ readonly saleTime: string;
258
+ readonly depositRate: number | null;
259
+ }
260
+
261
+ export interface CourtAuction {
262
+ readonly result: number;
263
+ readonly msg: string;
264
+ readonly success: number;
265
+ readonly case: {
266
+ readonly caseNo: string;
267
+ readonly court: string;
268
+ readonly caseName: string;
269
+ readonly receivedAt: string;
270
+ readonly claimAmount: number | null;
271
+ readonly judgeDept: string;
272
+ readonly judgeDeptTel: string;
273
+ readonly executorTel: string;
274
+ readonly auctionStatus: string;
275
+ readonly completedAt: string;
276
+ readonly suspended: boolean;
277
+ readonly suspensionReason: string;
278
+ };
279
+ readonly items: readonly CourtAuctionItem[];
280
+ readonly saleSchedule: readonly {
281
+ readonly saleDate: string;
282
+ readonly saleTime: string;
283
+ readonly items: readonly { readonly itemNo: number | null; readonly minimumPrice: number | null }[];
284
+ }[];
285
+ readonly claimDeadline: string;
286
+ readonly relatedCases: readonly { readonly caseNo: string; readonly court: string; readonly kind: string }[];
287
+ readonly count: number;
288
+ }
289
+
290
+ export interface RegistryDocVerify {
291
+ readonly verified: boolean;
292
+ readonly status: 'confirmed' | 'not_found' | 'count_exhausted' | 'invalid_format' | 'not_opened' | 'unknown';
293
+ readonly message: string;
294
+ readonly kind: 'realestate' | 'corporate' | 'movable';
295
+ readonly document: string | null;
296
+ readonly issued_date: string | null;
297
+ readonly registry_office: string | null;
298
+ }
299
+
249
300
  export interface LinkedinJob {
250
301
  readonly job_posting_id: string;
251
302
  readonly title: string;
@@ -359,6 +410,12 @@ export interface MaskResidentNumberOptions extends OcrOptions {
359
410
  export const AUTH_PROVIDERS: readonly [
360
411
  'kakao', 'naver', 'toss', 'pass', 'samsung', 'kb', 'shinhan', 'hana', 'woori', 'ibk', 'nh', 'kakaobank', 'banksalad'
361
412
  ];
413
+ /** 정부24 통합 조회에서 고를 수 있는 상품 키. */
414
+ export const GOV24_BUNDLE_PRODUCTS: readonly [
415
+ 'resident_registration', 'resident_registration_cho', 'driving_license', 'health_checkup',
416
+ 'police_penalty', 'parking_fine_target', 'mortgage_loan', 'housing_refund_balance',
417
+ 'housing_pension_balance', 'housing_loan_stage', 'mortgage_application', 'confirm_verify', 'power_bill'
418
+ ];
362
419
  export type AuthProvider = typeof AUTH_PROVIDERS[number];
363
420
 
364
421
  /** 간편인증 기반 조회 상품(재직·소득·연금·면허·건강검진 등)의 공통 입력. */
@@ -377,6 +434,109 @@ export interface RequestDrivingLicenseInput extends DataRequestInput {}
377
434
  export interface RequestHealthCheckupInput extends DataRequestInput {}
378
435
  export interface RequestCashReceiptDeductionInput extends DataRequestInput { incomeYears?: number; }
379
436
  export interface RequestTaxReturnHistoryInput extends DataRequestInput { years?: number; }
437
+ /** 주민등록표 발급 공통 입력. `sido`·`sigungu` 는 주민등록 주소지다. */
438
+ export interface ResidentRegistrationOptions {
439
+ sido: string;
440
+ sigungu: string;
441
+ purposeCd?: string;
442
+ submitTarget?: string;
443
+ includeAddressHistory?: 'Y' | 'N';
444
+ includeHousehold?: 'Y' | 'N';
445
+ }
446
+ export interface RequestResidentRegistrationInput extends DataRequestInput, ResidentRegistrationOptions {}
447
+ export interface RequestResidentRegistrationChoInput extends DataRequestInput, ResidentRegistrationOptions {}
448
+ /**
449
+ * 정부24 통합 조회 입력. `products` 로 조회할 상품 키를 고른다.
450
+ * 등본·초본을 고르면 `sido`·`sigungu` 가 필요하다.
451
+ */
452
+ export interface RequestGov24BundleInput extends DataRequestInput {
453
+ products: string[] | string;
454
+ sido?: string;
455
+ sigungu?: string;
456
+ purposeCd?: string;
457
+ submitTarget?: string;
458
+ includeAddressHistory?: 'Y' | 'N';
459
+ includeHousehold?: 'Y' | 'N';
460
+ }
461
+
462
+ /**
463
+ * 홈택스 민원증명 발급 조건. 신청인 본인명의 발급이고 발급 1건 60P 정액이다.
464
+ * `format` 은 응답 형식이고, `json`·`both` 이면 발급된 PDF를 파싱한 `PDF데이터` 가 함께 온다.
465
+ * 코드 값(`use_purpose`·`submit_to`·`itrf_cd`)은 정부 공통코드다.
466
+ */
467
+ export interface HometaxCertificateOptions extends DataRequestInput {
468
+ year?: string;
469
+ use_purpose?: string;
470
+ submit_to?: string;
471
+ delivery?: '06' | '10' | '04' | '12';
472
+ format?: 'pdf' | 'json' | 'both';
473
+ engl_yn?: 'Y' | 'N';
474
+ quantity?: number;
475
+ email?: string;
476
+ fax_no?: string;
477
+ wallet_address?: string;
478
+ }
479
+ export interface RequestIncomeAmountCertInput extends HometaxCertificateOptions {}
480
+ export interface RequestPensionCreditCertInput extends HometaxCertificateOptions {
481
+ address_open_yn?: 'Y' | 'N';
482
+ resno_open_yn?: 'Y' | 'N';
483
+ }
484
+ export interface RequestFactCertInput extends HometaxCertificateOptions {
485
+ start_month?: string;
486
+ end_month?: string;
487
+ itrf_cd?: string;
488
+ issuance?: '1' | '2';
489
+ }
490
+ /** 소득 증빙서류 통합발급 입력. `year`·`use_purpose`·`submit_to`·`delivery` 가 필수다. */
491
+ export interface RequestIncomeCertBundleInput extends HometaxCertificateOptions {
492
+ year: string;
493
+ use_purpose: string;
494
+ submit_to: string;
495
+ delivery: '06' | '10' | '04' | '12';
496
+ amount_open_yn?: 'Y' | 'N';
497
+ income_source_open_yn?: 'Y' | 'N';
498
+ withholding_all_print_yn?: 'Y' | 'N';
499
+ address_open_yn?: 'Y' | 'N';
500
+ resno_open_yn?: 'Y' | 'N';
501
+ }
502
+ /**
503
+ * 사업자 증빙서류 통합발급 입력. `business_no` 와 발급 입력이 필수이고,
504
+ * `bind_id` 가 없으면 대표자 본인 확인 동의 `agreed: true` 가 있어야 접수된다.
505
+ */
506
+ export interface RequestBusinessCertBundleInput extends HometaxCertificateOptions {
507
+ business_no: string;
508
+ year: string;
509
+ use_purpose: string;
510
+ submit_to: string;
511
+ delivery: '06' | '10' | '04' | '12';
512
+ period?: '1' | '2' | 'all';
513
+ agreed?: boolean;
514
+ bind_id?: string;
515
+ }
516
+ export interface RequestTaxClearanceCertInput extends RequestFactCertInput {
517
+ cert_type?: 'B0006' | 'B0010';
518
+ }
519
+ /** 발급 PDF를 열어 글자를 뽑고 라벨 기준으로 만든 값. 필드는 비어 있을 수 있다. */
520
+ export interface HometaxPdfData {
521
+ 사용가능: boolean;
522
+ 페이지수: number;
523
+ 필드: Record<string, string | number>;
524
+ 텍스트: string;
525
+ 사유?: string;
526
+ }
527
+ /** 홈택스 민원증명 결과. `format` 이 json·both 이면 `발급문서`(base64)와 `PDF데이터` 가 함께 온다. */
528
+ export interface HometaxCertificateResultPayload {
529
+ 문서확인번호: string;
530
+ 귀속연도?: string;
531
+ 소득금액?: string;
532
+ 응답형식?: 'pdf' | 'json' | 'both';
533
+ 발급문서?: string;
534
+ 문서파일명?: string;
535
+ 문서해시?: string;
536
+ 문서크기?: number;
537
+ PDF데이터?: HometaxPdfData;
538
+ [key: string]: unknown;
539
+ }
380
540
 
381
541
  export type DataRequestStatus =
382
542
  | 'AUTH_REQUESTED' | 'AUTH_WAITING' | 'AUTH_COMPLETED' | 'AUTH_REJECTED' | 'AUTH_EXPIRED'
@@ -522,6 +682,36 @@ export interface TaxReturnHistoryInfo {
522
682
  }
523
683
  export interface TaxReturnHistoryResultPayload { taxReturnHistory: TaxReturnHistoryInfo; }
524
684
 
685
+ /** 주민등록표 등본·초본 발급 결과. `발급문서` 는 PDF 원본의 base64 다. */
686
+ export interface ResidentRegistrationInfo {
687
+ 문서확인번호: string;
688
+ 발급일자: string;
689
+ 성명: string;
690
+ 발급문서: string;
691
+ 문서파일명: string;
692
+ 문서해시?: string;
693
+ 문서크기?: number;
694
+ 조회결과?: string;
695
+ }
696
+ export interface ResidentRegistrationResultPayload { residentRegistration: ResidentRegistrationInfo; }
697
+ export interface ResidentRegistrationChoResultPayload { residentRegistrationCho: ResidentRegistrationInfo; }
698
+ /** 통합 조회는 고른 상품의 섹션만 담는다. 섹션 키는 상품 키의 camelCase 다. */
699
+ /** 소득 증빙서류 통합발급 결과. 증명마다 섹션이 따로 오며 일부만 발급되면 status 가 PARTIAL_SUCCESS 다. */
700
+ export type IncomeCertBundleResultPayload = Record<string, unknown> & {
701
+ incomeAmountCert?: HometaxCertificateResultPayload;
702
+ pensionCreditCert?: HometaxCertificateResultPayload;
703
+ };
704
+ /** 사업자 증빙서류 통합발급 결과. 성공 응답에 다음 조회에 쓸 `bind_id` 가 함께 올 수 있다. */
705
+ export type BusinessCertBundleResultPayload = Record<string, unknown> & {
706
+ businessRegistrationCert?: HometaxCertificateResultPayload;
707
+ vatTaxBaseCert?: HometaxCertificateResultPayload;
708
+ financialStatementCert?: HometaxCertificateResultPayload;
709
+ };
710
+ export type Gov24BundleResultPayload = Record<string, unknown> & {
711
+ residentRegistration?: ResidentRegistrationInfo;
712
+ residentRegistrationCho?: ResidentRegistrationInfo;
713
+ };
714
+
525
715
  export interface YoutubeThumbnail { url: string; width: number; height: number; }
526
716
  export interface YoutubeChapter { title: string; start_time: number | null; end_time: number | null; }
527
717
  export interface YoutubeMetadata {
@@ -696,6 +886,8 @@ export class ApickClient {
696
886
  linkedinProfile(url: string): Promise<ApickResult<LinkedinProfile>>;
697
887
  linkedinCompany(url: string): Promise<ApickResult<LinkedinCompany>>;
698
888
  linkedinJob(url: string): Promise<ApickResult<LinkedinJob>>;
889
+ courtAuction(caseNo: string, court: string): Promise<ApickResult<CourtAuction>>;
890
+ registryDocVerify(issueNo: string, options?: { readonly kind?: 'realestate' | 'corporate' | 'movable' }): Promise<ApickResult<RegistryDocVerify>>;
699
891
  screenshot(url: string): Promise<ApickBinaryResult>;
700
892
  youtubeMetadata(url: string): Promise<ApickResult<YoutubeMetadata>>;
701
893
  youtubeThumbnail(url: string): Promise<ApickBinaryResult>;
@@ -752,6 +944,24 @@ export class ApickClient {
752
944
  getCashReceiptDeduction(transactionId: string): Promise<ApickResult<DataRequestResult<CashReceiptDeductionResultPayload>>>;
753
945
  requestTaxReturnHistory(input: RequestTaxReturnHistoryInput): Promise<ApickResult<DataRequestAcceptedData>>;
754
946
  getTaxReturnHistory(transactionId: string): Promise<ApickResult<DataRequestResult<TaxReturnHistoryResultPayload>>>;
947
+ requestIncomeAmountCert(input: RequestIncomeAmountCertInput): Promise<ApickResult<DataRequestAcceptedData>>;
948
+ getIncomeAmountCert(transactionId: string): Promise<ApickResult<DataRequestResult<HometaxCertificateResultPayload>>>;
949
+ requestPensionCreditCert(input: RequestPensionCreditCertInput): Promise<ApickResult<DataRequestAcceptedData>>;
950
+ getPensionCreditCert(transactionId: string): Promise<ApickResult<DataRequestResult<HometaxCertificateResultPayload>>>;
951
+ requestFactCert(input: RequestFactCertInput): Promise<ApickResult<DataRequestAcceptedData>>;
952
+ getFactCert(transactionId: string): Promise<ApickResult<DataRequestResult<HometaxCertificateResultPayload>>>;
953
+ requestTaxClearanceCert(input: RequestTaxClearanceCertInput): Promise<ApickResult<DataRequestAcceptedData>>;
954
+ getTaxClearanceCert(transactionId: string): Promise<ApickResult<DataRequestResult<HometaxCertificateResultPayload>>>;
955
+ requestIncomeCertBundle(input: RequestIncomeCertBundleInput): Promise<ApickResult<DataRequestAcceptedData>>;
956
+ getIncomeCertBundle(transactionId: string): Promise<ApickResult<DataRequestResult<IncomeCertBundleResultPayload>>>;
957
+ requestBusinessCertBundle(input: RequestBusinessCertBundleInput): Promise<ApickResult<DataRequestAcceptedData>>;
958
+ getBusinessCertBundle(transactionId: string): Promise<ApickResult<DataRequestResult<BusinessCertBundleResultPayload>>>;
959
+ requestResidentRegistration(input: RequestResidentRegistrationInput): Promise<ApickResult<DataRequestAcceptedData>>;
960
+ getResidentRegistration(transactionId: string): Promise<ApickResult<DataRequestResult<ResidentRegistrationResultPayload>>>;
961
+ requestResidentRegistrationCho(input: RequestResidentRegistrationChoInput): Promise<ApickResult<DataRequestAcceptedData>>;
962
+ getResidentRegistrationCho(transactionId: string): Promise<ApickResult<DataRequestResult<ResidentRegistrationChoResultPayload>>>;
963
+ requestGov24Bundle(input: RequestGov24BundleInput): Promise<ApickResult<DataRequestAcceptedData>>;
964
+ getGov24Bundle(transactionId: string): Promise<ApickResult<DataRequestResult<Gov24BundleResultPayload>>>;
755
965
  searchSkills(options?: SkillSearchOptions): Promise<ApickResult<SkillPage<SkillSummary>>>;
756
966
  /** Public measured results and methods; model scores are not accuracy guarantees. */
757
967
  getSkillPerformance(): Promise<ApickResult<SkillPerformanceReport>>;