apick-api 4.8.1 → 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/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 {
@@ -648,7 +838,9 @@ export const SERVICES: Readonly<Record<string, Readonly<{
648
838
  /** Brand, model name, model year and trim — all optional. With no `model` the call returns the brand/model list and is free. */
649
839
  export interface VehicleModelInfoOptions {
650
840
  maker?: string;
841
+ /** 차명과 등급·연식·좌석을 함께 입력할 수 있습니다. Free text, e.g. PANAMERA GTS 19년. */
651
842
  model?: string;
843
+ /** 2자리 또는 4자리 연식. Two or four digits; must agree with the year in model. */
652
844
  modelYear?: string;
653
845
  trim?: string;
654
846
  }
@@ -694,6 +886,8 @@ export class ApickClient {
694
886
  linkedinProfile(url: string): Promise<ApickResult<LinkedinProfile>>;
695
887
  linkedinCompany(url: string): Promise<ApickResult<LinkedinCompany>>;
696
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>>;
697
891
  screenshot(url: string): Promise<ApickBinaryResult>;
698
892
  youtubeMetadata(url: string): Promise<ApickResult<YoutubeMetadata>>;
699
893
  youtubeThumbnail(url: string): Promise<ApickBinaryResult>;
@@ -750,6 +944,24 @@ export class ApickClient {
750
944
  getCashReceiptDeduction(transactionId: string): Promise<ApickResult<DataRequestResult<CashReceiptDeductionResultPayload>>>;
751
945
  requestTaxReturnHistory(input: RequestTaxReturnHistoryInput): Promise<ApickResult<DataRequestAcceptedData>>;
752
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>>>;
753
965
  searchSkills(options?: SkillSearchOptions): Promise<ApickResult<SkillPage<SkillSummary>>>;
754
966
  /** Public measured results and methods; model scores are not accuracy guarantees. */
755
967
  getSkillPerformance(): Promise<ApickResult<SkillPerformanceReport>>;