apick-api 4.11.0 → 4.12.1
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 +12 -0
- package/README.md +11 -4
- package/docs/guide.en.md +1 -1
- package/docs/guide.ko.md +1 -1
- package/docs/skill-artifacts.md +2 -2
- package/docs/subagent.md +2 -2
- package/docs/tts.md +2 -2
- package/package.json +1 -1
- package/src/index.cjs +75 -0
- package/src/index.d.ts +136 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# 4.12.1
|
|
2
|
+
|
|
3
|
+
- 요금 안내 문구를 정리했습니다. 모델별 판매 단가, 실제 사용량 기준, 기본요금·소수점 올림, 견적 API처럼 청구되는 결과만 적습니다. 에이전트 상품 응답 타입에서 더 이상 내려오지 않는 요금 필드 하나를 뺐습니다. 요금과 동작은 바뀌지 않습니다.
|
|
4
|
+
|
|
5
|
+
- Billing notes now describe only what you are charged: per-model rates, actual usage, base fees, rounding and the quote API. Removed one billing field from the agent product type that the server no longer returns. Prices and behaviour are unchanged.
|
|
6
|
+
|
|
7
|
+
# 4.12.0
|
|
8
|
+
|
|
9
|
+
- 입찰·부동산 분석 4종을 SDK에 추가했습니다. `bidNotice(options)`·`bidAward(options)` 는 공공기관 입찰공고의 예산구간·발주기관·업종 분포와 마감 임박도, 낙찰률 분포·업체 집중도를 분석합니다. `rtmsTrade(lawdCd, dealYmd, options)` 는 매매 실거래의 ㎡당 중위가·면적/가격/층 분포·시세 이탈 거래를, `rtmsRent(lawdCd, dealYmd, options)` 는 전세 비중·보증금/월세 분포·매매 대비 전세가율을 계산합니다. 응답은 `summary`·`distribution`·`insights` 중심이며 원본 목록(`items`·`totalCount`)은 제공하지 않습니다.
|
|
10
|
+
|
|
11
|
+
- Added four bid and real-estate analytics methods. `bidNotice(options)` and `bidAward(options)` analyse public-sector bid notices (budget, agency and industry distributions, closing urgency) and award results (success-rate bands, winner concentration). `rtmsTrade(lawdCd, dealYmd, options)` covers median price per square metre, area/price/floor bands and price outliers, while `rtmsRent(lawdCd, dealYmd, options)` computes jeonse share, deposit and monthly-rent bands and the jeonse ratio against sale prices. Responses centre on `summary`, `distribution` and `insights`; raw lists (`items`, `totalCount`) are not returned.
|
|
12
|
+
|
|
1
13
|
# 4.11.0
|
|
2
14
|
|
|
3
15
|
- 증빙서류 통합발급 묶음 2종을 추가했습니다. `requestIncomeCertBundle()`·`getIncomeCertBundle()`은 소득금액증명과 연금보험료등 소득세액 공제확인서를, `requestBusinessCertBundle()`·`getBusinessCertBundle()`은 사업자등록증명·부가가치세 과세표준증명·표준재무제표증명을 휴대폰 승인 한 번으로 함께 발급합니다. 접수 20P, 최초 결과는 84P·126P입니다. 사업자 묶음은 `business_no`와 대표자 본인 확인(`agreed: true` 또는 `bind_id`)이 없으면 서버를 부르기 전에 `TypeError`를 던집니다.
|
package/README.md
CHANGED
|
@@ -97,6 +97,10 @@ Leave the allowed-IP list blank for unrestricted access. To restrict access, reg
|
|
|
97
97
|
| `linkedinCompany(url)` | 링크드인 회사 정보 / LinkedIn company | JSON |
|
|
98
98
|
| `linkedinJob(url)` | 링크드인 채용공고 / LinkedIn job posting | JSON |
|
|
99
99
|
| `courtAuction(caseNo, court)` | 법원 경매사건 조회 / Court auction case | JSON |
|
|
100
|
+
| `bidNotice(options)` | 입찰 공고 분석 / Bid notice analytics | JSON |
|
|
101
|
+
| `bidAward(options)` | 낙찰 경쟁 분석 / Bid award analytics | JSON |
|
|
102
|
+
| `rtmsTrade(lawdCd, dealYmd, options)` | 매매 시장 분석 / Sale market analytics | JSON |
|
|
103
|
+
| `rtmsRent(lawdCd, dealYmd, options)` | 전월세 시장 분석 / Rent market analytics | JSON |
|
|
100
104
|
| `registryDocVerify(issueNo, options)` | 등기·증명서 발급확인 / Registry certificate verification | JSON |
|
|
101
105
|
| `createTtsJob(text, options)` | 한국어 내레이션 작업 접수 / Create TTS job | JSON |
|
|
102
106
|
| `getTtsJob(jobId)` | TTS 작업 상태 / TTS job status | JSON |
|
|
@@ -306,9 +310,9 @@ if (job.data.status === 'completed') {
|
|
|
306
310
|
|
|
307
311
|
Submission reserves an upper bound; successful completion settles actual charges. Disconnects do not cancel billing. Explicit cancellation settles work already performed. MP3 and ASS each allow one completed download; interrupted downloads can be retried.
|
|
308
312
|
|
|
309
|
-
정규화는 기본 켜짐이며 발음을 다듬는 스킬 요금이 추가됩니다. `normalize_text: false`(SDK `normalizeText: false`)로 실행과 요금을 끕니다. 스킬 최종가는 기본요금(판매자 금액·기본 수수료) + AI
|
|
313
|
+
정규화는 기본 켜짐이며 발음을 다듬는 스킬 요금이 추가됩니다. `normalize_text: false`(SDK `normalizeText: false`)로 실행과 요금을 끕니다. 스킬 최종가는 기본요금(판매자 금액·기본 수수료) + 실제 AI 사용료입니다. 정규화 실패는 제작을 중단하며, 서버·공급자의 최종 제작 실패는 정규화까지 전액 환불합니다. ASS에는 원문을 표시합니다.
|
|
310
314
|
|
|
311
|
-
Normalization is on by default and adds a skill charge. Set `normalize_text: false` (SDK `normalizeText: false`) to skip execution and billing. The skill price is its base fee (seller amount and base commission) plus actual AI
|
|
315
|
+
Normalization is on by default and adds a skill charge. Set `normalize_text: false` (SDK `normalizeText: false`) to skip execution and billing. The skill price is its base fee (seller amount and base commission) plus the actual AI usage fee. Normalization failure stops synthesis; final server/provider failures refund normalization as well. ASS preserves the original spelling.
|
|
312
316
|
|
|
313
317
|
## 신분증 마스킹 / Identity masking
|
|
314
318
|
|
|
@@ -468,6 +472,9 @@ Court auction lookup is synchronous. A case number belongs to one court, so pass
|
|
|
468
472
|
등기·증명서 발급확인 `registryDocVerify(issueNo, options)` 는 증명서에 인쇄된 발급확인번호 12자리(하이픈·공백 허용)와 문서 종류 `options.kind`(`realestate` 기본, `corporate`, `movable`)를 받습니다. 응답은 `verified`·`status`·`message`·`document`·`issued_date`·`registry_office` 이며 증명서 원문은 포함되지 않습니다. 발급일로부터 3개월 이내 발급분만 확인됩니다.
|
|
469
473
|
`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
474
|
|
|
475
|
+
입찰·부동산 4종은 원본 목록이 아니라 **분석 결과**를 돌려줍니다. `bidNotice(options)`·`bidAward(options)` 는 업무구분·기간·공고번호를 받고 `summary`·`distribution`·`insights` 를, 낙찰은 여기에 `competitors`·`low_rate` 를 더합니다. `rtmsTrade(lawdCd, dealYmd, options)` 는 ㎡당 중위가와 면적·가격·층 분포, 단지별 시세, 직거래·해제 비중, 시세 이탈 거래를, `rtmsRent` 는 전세 비중, 보증금·월세 분포, 보증금 대비 연월세 비율, 갱신 비중과 같은 단지 매매 대비 전세가율을 계산합니다. `items`·`totalCount` 같은 원본 목록은 제공하지 않습니다.
|
|
476
|
+
The four bid and real-estate methods return **analytics**, not raw lists. `bidNotice(options)` and `bidAward(options)` take a business type, period or notice number and return `summary`, `distribution` and `insights`; awards add `competitors` and `low_rate`. `rtmsTrade(lawdCd, dealYmd, options)` returns median price per square metre, area/price/floor bands, per-complex medians, direct-deal and cancellation shares and price outliers, while `rtmsRent` computes jeonse share, deposit and monthly-rent bands, annual rent to deposit ratio, renewal share and the jeonse ratio against same-complex sale prices. Raw lists such as `items` and `totalCount` are not returned.
|
|
477
|
+
|
|
471
478
|
증빙서류 묶음 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
479
|
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
480
|
|
|
@@ -559,9 +566,9 @@ if (status.data.status === "completed") {
|
|
|
559
566
|
|
|
560
567
|
## 서브에이전트 / Subagent
|
|
561
568
|
|
|
562
|
-
설치형 `apick-agent` 상품은 `apick-subagent` 스킬 패키지와 전용 REST·MCP를 사용합니다. 설치비·도입비·구독료 없이
|
|
569
|
+
설치형 `apick-agent` 상품은 `apick-subagent` 스킬 패키지와 전용 REST·MCP를 사용합니다. 설치비·도입비·구독료 없이 성공한 작업만 사용량대로 정산(소수점 올림, 2026-11-06부터 AI 사용 작업 기본 5P), 승인된 동일 결과 캐시 1P, 충전 잔액 외 상품 한도 없음. [연동 가이드](https://apick.app/dev_guide/subagent).
|
|
563
570
|
|
|
564
|
-
The installed `apick-agent` product uses the `apick-subagent` skill package and dedicated REST/MCP interfaces. No installation, setup or subscription fee.
|
|
571
|
+
The installed `apick-agent` product uses the `apick-subagent` skill package and dedicated REST/MCP interfaces. No installation, setup or subscription fee. Successful work is billed by actual usage (fractions rounded up, 5-point base fee for AI jobs from 2026-11-06); approved identical cache reuse costs 1 point, with no product quota beyond prepaid balance. [Integration guide](https://apick.app/dev_guide/subagent).
|
|
565
572
|
|
|
566
573
|
```sh
|
|
567
574
|
npx -y apick-mcp --server subagent
|
package/docs/guide.en.md
CHANGED
|
@@ -116,7 +116,7 @@ await client.ocr(bytes, {
|
|
|
116
116
|
Query `listGeminiTtsVoices()` and `listOpenAiTtsVoices()` for current voices; legacy `TTS_VOICE_IDS` are retired.
|
|
117
117
|
|
|
118
118
|
|
|
119
|
-
Normalization is on by default and adds a skill charge. Set `normalize_text: false` (SDK `normalizeText: false`) to skip execution and billing. The skill price is its base fee (seller amount and base commission) plus actual AI
|
|
119
|
+
Normalization is on by default and adds a skill charge. Set `normalize_text: false` (SDK `normalizeText: false`) to skip execution and billing. The skill price is its base fee (seller amount and base commission) plus the actual AI usage fee. Normalization failure stops synthesis; final server/provider failures refund normalization as well. ASS preserves the original spelling.
|
|
120
120
|
|
|
121
121
|
```js
|
|
122
122
|
const screenshot = await client.screenshot('https://example.com');
|
package/docs/guide.ko.md
CHANGED
|
@@ -116,7 +116,7 @@ await client.ocr(bytes, {
|
|
|
116
116
|
현재 목소리는 `listGeminiTtsVoices()`와 `listOpenAiTtsVoices()`로 조회합니다. 기존 `TTS_VOICE_IDS`는 폐기된 목소리입니다.
|
|
117
117
|
|
|
118
118
|
|
|
119
|
-
정규화는 기본 켜짐이며 발음을 다듬는 스킬 요금이 추가됩니다. `normalize_text: false`(SDK `normalizeText: false`)로 실행과 요금을 끕니다. 스킬 최종가는 기본요금(판매자 금액·기본 수수료) + AI
|
|
119
|
+
정규화는 기본 켜짐이며 발음을 다듬는 스킬 요금이 추가됩니다. `normalize_text: false`(SDK `normalizeText: false`)로 실행과 요금을 끕니다. 스킬 최종가는 기본요금(판매자 금액·기본 수수료) + 실제 AI 사용료입니다. 정규화 실패는 제작을 중단하며, 서버·공급자의 최종 제작 실패는 정규화까지 전액 환불합니다. ASS에는 원문을 표시합니다.
|
|
120
120
|
|
|
121
121
|
```js
|
|
122
122
|
const screenshot = await client.screenshot('https://example.com');
|
package/docs/skill-artifacts.md
CHANGED
|
@@ -19,6 +19,6 @@ const downloaded = await apick.getSkillArtifact(run.data.run_id, file.id);
|
|
|
19
19
|
await downloaded.save('./result.png');
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
파일의 `name`, `mime_type`, `bytes`, `sha256`을 확인하고 실제 형식에 맞는 확장자로 저장하세요. 인증키 소유자의 실행 파일만 내려받을 수 있고, 실행 결과가 만료되면 파일도 만료됩니다. 실패·취소·시간 초과는 예약액을 반환하며, 가변 요금 상품은 성공 시 실제 사용료를 정산합니다.
|
|
22
|
+
파일의 `name`, `mime_type`, `bytes`, `sha256`을 확인하고 실제 형식에 맞는 확장자로 저장하세요. 인증키 소유자의 실행 파일만 내려받을 수 있고, 실행 결과가 만료되면 파일도 만료됩니다. 실패·취소·시간 초과는 예약액을 반환하며, 가변 요금 상품은 성공 시 실제 사용료를 정산합니다.
|
|
23
23
|
|
|
24
|
-
Use `name`, `mime_type`, `bytes`, and `sha256` to identify and verify each file; choose a matching extension. Downloads require the run owner's API key and expire with the result. Failed, cancelled, and timed-out runs release the reservation. Variable-price Skills settle recorded tool usage on success
|
|
24
|
+
Use `name`, `mime_type`, `bytes`, and `sha256` to identify and verify each file; choose a matching extension. Downloads require the run owner's API key and expire with the result. Failed, cancelled, and timed-out runs release the reservation. Variable-price Skills settle recorded tool usage on success.
|
package/docs/subagent.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# 서브에이전트 / Subagent
|
|
2
2
|
|
|
3
|
-
`apick-agent`는 설치형 상품이며 `quoteSkill`·`runSkill` 대신 전용 API를 사용합니다. 설치비·도입비·구독료는 없고,
|
|
3
|
+
`apick-agent`는 설치형 상품이며 `quoteSkill`·`runSkill` 대신 전용 API를 사용합니다. 설치비·도입비·구독료는 없고, 성공한 작업만 사용량대로 정산합니다(소수점 올림, 2026-11-06부터 AI 사용 작업 기본 5P). 승인된 동일 결과 캐시는 1P입니다. 충전 잔액 외 상품 사용량 한도는 없습니다.
|
|
4
4
|
|
|
5
|
-
`apick-agent` is an installed-agent product. Use the dedicated API rather than `quoteSkill` or `runSkill`. There is no installation, setup or subscription fee. Successful work is billed
|
|
5
|
+
`apick-agent` is an installed-agent product. Use the dedicated API rather than `quoteSkill` or `runSkill`. There is no installation, setup or subscription fee. Successful work is billed by actual usage (fractions rounded up, 5-point base fee for AI jobs from 2026-11-06); approved identical-result cache reuse costs 1 point. There are no product usage quotas beyond prepaid balance.
|
|
6
6
|
|
|
7
7
|
```js
|
|
8
8
|
import { ApickClient } from 'apick-api';
|
package/docs/tts.md
CHANGED
|
@@ -25,9 +25,9 @@ Style, emotion, tone, accent, pace, pitch and volume options can be set per requ
|
|
|
25
25
|
|
|
26
26
|
Normalization is enabled by default and costs extra. Disable it with `normalize_text: false` (`normalizeText: false` for the string SDK helper). Input limits are 2,000 characters including utterance separators with normalization, or 8,000 without it. Query a quote, engine-specific voices and supported options before submitting.
|
|
27
27
|
|
|
28
|
-
실제
|
|
28
|
+
실제 사용량에 정규화 요금을 더해 정산합니다. 소수점은 올림하며, 2026-11-06부터 합성 작업 1건의 기본요금 5P를 최소액으로 받습니다. 엔진별 요금이 다르며, 예상 금액은 견적 API(`POST /rest/tts/quote`)로 미리 확인할 수 있습니다.
|
|
29
29
|
|
|
30
|
-
AI usage is charged
|
|
30
|
+
AI usage is charged by actual usage, plus normalization. Fractions are rounded up, and from 2026-11-06 each synthesis job has a 5-point base fee. Rates differ by engine; check the estimate with the quote API (`POST /rest/tts/quote`) first.
|
|
31
31
|
|
|
32
32
|
두 엔진은 같은 작업 조회·취소·MP3·원문 ASS 계약을 사용합니다. `billing`의 예약·해제·확정·환불을 확인하세요. MP3는 24kHz 모노 48kbps, 결과는 완료 후 24시간 보관합니다. MP3와 ASS는 각각 완료된 다운로드 1회만 허용하며 전송 중단은 재시도할 수 있습니다. 접수 응답 유실 시 같은 입력과 멱등 키를 재사용하세요. 서버·공급자 최종 실패는 정규화까지 환불하며, 연결 종료는 작업 취소가 아닙니다. 취소 시 이미 수행된 작업분을 정산합니다.
|
|
33
33
|
|
package/package.json
CHANGED
package/src/index.cjs
CHANGED
|
@@ -61,6 +61,10 @@ const SERVICE_DEFINITIONS = Object.freeze({
|
|
|
61
61
|
linkedinCompany: { endpoint: '/rest/linkedin_company', timeoutMs: 110_000, output: 'json' },
|
|
62
62
|
linkedinJob: { endpoint: '/rest/linkedin_job', timeoutMs: 110_000, output: 'json' },
|
|
63
63
|
courtAuction: { endpoint: '/rest/court_auction', timeoutMs: 45_000, output: 'json' },
|
|
64
|
+
bidNotice: { endpoint: '/rest/bid_notice', timeoutMs: 45_000, output: 'json' },
|
|
65
|
+
bidAward: { endpoint: '/rest/bid_award', timeoutMs: 45_000, output: 'json' },
|
|
66
|
+
rtmsTrade: { endpoint: '/rest/rtms_trade', timeoutMs: 45_000, output: 'json' },
|
|
67
|
+
rtmsRent: { endpoint: '/rest/rtms_rent', timeoutMs: 45_000, output: 'json' },
|
|
64
68
|
registryDocVerify: { endpoint: '/rest/registry_doc_verify', timeoutMs: 30_000, output: 'json' },
|
|
65
69
|
screenshot: { endpoint: '/rest/url_screenshot', timeoutMs: 75_000, output: 'binary', filename: 'screenshot.jpeg' },
|
|
66
70
|
youtubeMetadata: { endpoint: '/rest/youtube_metadata', timeoutMs: 60_000, output: 'json' },
|
|
@@ -173,6 +177,57 @@ function normalizeBusinessNumber(value) {
|
|
|
173
177
|
return normalized;
|
|
174
178
|
}
|
|
175
179
|
|
|
180
|
+
const BID_BIZ_TYPES = ['물품', '공사', '용역', '외자'];
|
|
181
|
+
const RTMS_PROPERTY_TYPES = ['apt', 'rh', 'sh', 'offi'];
|
|
182
|
+
|
|
183
|
+
// 입찰공고·낙찰 조회 입력. bizType·기간·공고번호·업종코드·페이지를 정규화한다.
|
|
184
|
+
function bidQueryInput(options) {
|
|
185
|
+
const config = options || {};
|
|
186
|
+
const input = {};
|
|
187
|
+
if (config.bizType !== undefined) {
|
|
188
|
+
if (!BID_BIZ_TYPES.includes(config.bizType)) {
|
|
189
|
+
throw new TypeError('bizType must be one of 물품, 공사, 용역, 외자.');
|
|
190
|
+
}
|
|
191
|
+
input.bizType = config.bizType;
|
|
192
|
+
}
|
|
193
|
+
for (const key of ['startDate', 'endDate']) {
|
|
194
|
+
if (config[key] === undefined) continue;
|
|
195
|
+
const digits = requiredString(key, config[key], 12).replace(/[^0-9]/g, '');
|
|
196
|
+
if (digits.length !== 8 && digits.length !== 12) {
|
|
197
|
+
throw new TypeError(`${key} must be YYYYMMDD or YYYYMMDDHHMM.`);
|
|
198
|
+
}
|
|
199
|
+
input[key] = digits;
|
|
200
|
+
}
|
|
201
|
+
if (config.bidNtceNo !== undefined) {
|
|
202
|
+
input.bidNtceNo = requiredString('bidNtceNo', config.bidNtceNo, 20).replace(/[^0-9]/g, '');
|
|
203
|
+
}
|
|
204
|
+
if (config.indstrytyCd !== undefined) {
|
|
205
|
+
input.indstrytyCd = requiredString('indstrytyCd', config.indstrytyCd, 10).replace(/[^0-9]/g, '');
|
|
206
|
+
}
|
|
207
|
+
if (config.pageNo !== undefined) input.pageNo = positiveInteger('pageNo', config.pageNo);
|
|
208
|
+
if (config.numOfRows !== undefined) input.numOfRows = positiveInteger('numOfRows', config.numOfRows);
|
|
209
|
+
return input;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// 실거래 분석 입력. 지역코드 5자리와 계약년월 6자리를 요구한다.
|
|
213
|
+
function rtmsQueryInput(lawdCd, dealYmd, options) {
|
|
214
|
+
const code = requiredString('lawdCd', lawdCd, 5).replace(/[^0-9]/g, '');
|
|
215
|
+
if (!/^\d{5}$/.test(code)) throw new TypeError('lawdCd must contain exactly 5 digits.');
|
|
216
|
+
const month = requiredString('dealYmd', dealYmd, 6).replace(/[^0-9]/g, '');
|
|
217
|
+
if (!/^\d{6}$/.test(month)) throw new TypeError('dealYmd must be YYYYMM.');
|
|
218
|
+
const config = options || {};
|
|
219
|
+
const input = { lawdCd: code, dealYmd: month };
|
|
220
|
+
if (config.propertyType !== undefined) {
|
|
221
|
+
if (!RTMS_PROPERTY_TYPES.includes(config.propertyType)) {
|
|
222
|
+
throw new TypeError('propertyType must be one of apt, rh, sh, offi.');
|
|
223
|
+
}
|
|
224
|
+
input.propertyType = config.propertyType;
|
|
225
|
+
}
|
|
226
|
+
if (config.pageNo !== undefined) input.pageNo = positiveInteger('pageNo', config.pageNo);
|
|
227
|
+
if (config.numOfRows !== undefined) input.numOfRows = positiveInteger('numOfRows', config.numOfRows);
|
|
228
|
+
return input;
|
|
229
|
+
}
|
|
230
|
+
|
|
176
231
|
function normalizeUrl(value) {
|
|
177
232
|
const input = requiredString('url', value);
|
|
178
233
|
let parsed;
|
|
@@ -828,6 +883,26 @@ class ApickClient {
|
|
|
828
883
|
return this._call('registryDocVerify', input);
|
|
829
884
|
}
|
|
830
885
|
|
|
886
|
+
// 입찰공고 분석. bizType 미지정 시 용역이며, 기간은 최대 31일이다.
|
|
887
|
+
bidNotice(options) {
|
|
888
|
+
return this._call('bidNotice', bidQueryInput(options));
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
// 낙찰 경쟁 분석. 입력은 bidNotice 와 같다.
|
|
892
|
+
bidAward(options) {
|
|
893
|
+
return this._call('bidAward', bidQueryInput(options));
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
// 매매 실거래 분석. 지역코드 5자리와 계약년월 6자리가 필요하다.
|
|
897
|
+
rtmsTrade(lawdCd, dealYmd, options) {
|
|
898
|
+
return this._call('rtmsTrade', rtmsQueryInput(lawdCd, dealYmd, options));
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
// 전월세 실거래 분석. 같은 단지 매매가로 전세가율을 계산해 돌려준다.
|
|
902
|
+
rtmsRent(lawdCd, dealYmd, options) {
|
|
903
|
+
return this._call('rtmsRent', rtmsQueryInput(lawdCd, dealYmd, options));
|
|
904
|
+
}
|
|
905
|
+
|
|
831
906
|
screenshot(url) {
|
|
832
907
|
return this._call('screenshot', { url: normalizeUrl(url) });
|
|
833
908
|
}
|
package/src/index.d.ts
CHANGED
|
@@ -297,6 +297,137 @@ export interface RegistryDocVerify {
|
|
|
297
297
|
readonly registry_office: string | null;
|
|
298
298
|
}
|
|
299
299
|
|
|
300
|
+
export interface BidQueryOptions {
|
|
301
|
+
readonly bizType?: '물품' | '공사' | '용역' | '외자';
|
|
302
|
+
readonly startDate?: string;
|
|
303
|
+
readonly endDate?: string;
|
|
304
|
+
readonly bidNtceNo?: string;
|
|
305
|
+
readonly indstrytyCd?: string;
|
|
306
|
+
readonly pageNo?: number;
|
|
307
|
+
readonly numOfRows?: number;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export interface RtmsQueryOptions {
|
|
311
|
+
readonly propertyType?: 'apt' | 'rh' | 'sh' | 'offi';
|
|
312
|
+
readonly pageNo?: number;
|
|
313
|
+
readonly numOfRows?: number;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export interface DistributionEntry {
|
|
317
|
+
readonly name?: string;
|
|
318
|
+
readonly band?: string;
|
|
319
|
+
readonly count: number;
|
|
320
|
+
readonly share_pct: number;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export interface BidSummary {
|
|
324
|
+
readonly total: number;
|
|
325
|
+
readonly agency_count: number;
|
|
326
|
+
readonly industry_count: number;
|
|
327
|
+
readonly budget_total: number | null;
|
|
328
|
+
readonly budget_median: number | null;
|
|
329
|
+
readonly closing_within_3d: number;
|
|
330
|
+
readonly closed: number;
|
|
331
|
+
readonly first_close_at: string | null;
|
|
332
|
+
readonly last_close_at: string | null;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export interface BidPosting {
|
|
336
|
+
readonly bid_no: string;
|
|
337
|
+
readonly bid_name: string;
|
|
338
|
+
readonly agency: string;
|
|
339
|
+
readonly notice_at: string | null;
|
|
340
|
+
readonly close_at: string | null;
|
|
341
|
+
readonly days_left: number | null;
|
|
342
|
+
readonly urgency: string;
|
|
343
|
+
readonly budget: number | null;
|
|
344
|
+
readonly budget_band: string;
|
|
345
|
+
readonly industry: string;
|
|
346
|
+
readonly method: string;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
export interface BidNotice {
|
|
350
|
+
readonly summary: BidSummary;
|
|
351
|
+
readonly distribution: {
|
|
352
|
+
readonly by_agency: readonly DistributionEntry[];
|
|
353
|
+
readonly by_industry: readonly DistributionEntry[];
|
|
354
|
+
readonly by_method: readonly DistributionEntry[];
|
|
355
|
+
readonly by_budget_band: readonly DistributionEntry[];
|
|
356
|
+
readonly by_urgency: readonly DistributionEntry[];
|
|
357
|
+
};
|
|
358
|
+
readonly deadlines: readonly BidPosting[];
|
|
359
|
+
readonly largest: readonly BidPosting[];
|
|
360
|
+
readonly insights: readonly string[];
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export interface BidAward {
|
|
364
|
+
readonly summary: {
|
|
365
|
+
readonly total: number;
|
|
366
|
+
readonly winner_count: number;
|
|
367
|
+
readonly avg_success_rate: number | null;
|
|
368
|
+
readonly median_success_rate: number | null;
|
|
369
|
+
readonly success_rate_stdev: number | null;
|
|
370
|
+
readonly avg_participants: number | null;
|
|
371
|
+
readonly rate_sample: number;
|
|
372
|
+
readonly winner_concentration_hhi: number | null;
|
|
373
|
+
readonly success_amount_total: number | null;
|
|
374
|
+
};
|
|
375
|
+
readonly distribution: {
|
|
376
|
+
readonly by_winner: readonly DistributionEntry[];
|
|
377
|
+
readonly by_agency: readonly DistributionEntry[];
|
|
378
|
+
readonly by_rate_band: readonly DistributionEntry[];
|
|
379
|
+
};
|
|
380
|
+
readonly competitors: readonly { readonly name: string; readonly wins: number; readonly share_pct: number; readonly amount_total: number | null }[];
|
|
381
|
+
readonly low_rate: readonly BidPosting[];
|
|
382
|
+
readonly insights: readonly string[];
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export interface RtmsTrade {
|
|
386
|
+
readonly summary: {
|
|
387
|
+
readonly total: number;
|
|
388
|
+
readonly complex_count: number;
|
|
389
|
+
readonly median_amount: number | null;
|
|
390
|
+
readonly median_price_per_sqm: number | null;
|
|
391
|
+
readonly avg_price_per_sqm: number | null;
|
|
392
|
+
readonly direct_deal_share_pct: number | null;
|
|
393
|
+
readonly canceled_count: number;
|
|
394
|
+
readonly median_area: number | null;
|
|
395
|
+
readonly median_build_year: number | null;
|
|
396
|
+
};
|
|
397
|
+
readonly distribution: {
|
|
398
|
+
readonly by_complex: readonly DistributionEntry[];
|
|
399
|
+
readonly by_area_band: readonly DistributionEntry[];
|
|
400
|
+
readonly by_amount_band: readonly DistributionEntry[];
|
|
401
|
+
readonly by_floor: readonly DistributionEntry[];
|
|
402
|
+
};
|
|
403
|
+
readonly complexes: readonly Readonly<Record<string, unknown>>[];
|
|
404
|
+
readonly anomalies: readonly Readonly<Record<string, unknown>>[];
|
|
405
|
+
readonly insights: readonly string[];
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export interface RtmsRent {
|
|
409
|
+
readonly summary: {
|
|
410
|
+
readonly total: number;
|
|
411
|
+
readonly complex_count: number;
|
|
412
|
+
readonly jeonse_count: number;
|
|
413
|
+
readonly jeonse_share_pct: number | null;
|
|
414
|
+
readonly median_deposit: number | null;
|
|
415
|
+
readonly median_monthly_rent: number | null;
|
|
416
|
+
readonly median_deposit_per_sqm: number | null;
|
|
417
|
+
readonly avg_annual_rent_to_deposit_pct: number | null;
|
|
418
|
+
readonly renewal_share_pct: number | null;
|
|
419
|
+
};
|
|
420
|
+
readonly distribution: {
|
|
421
|
+
readonly by_complex: readonly DistributionEntry[];
|
|
422
|
+
readonly by_deposit_band: readonly DistributionEntry[];
|
|
423
|
+
readonly by_monthly_band: readonly DistributionEntry[];
|
|
424
|
+
readonly by_contract_type: readonly DistributionEntry[];
|
|
425
|
+
};
|
|
426
|
+
readonly complexes: readonly Readonly<Record<string, unknown>>[];
|
|
427
|
+
readonly jeonse_ratio: Readonly<Record<string, unknown>> | null;
|
|
428
|
+
readonly insights: readonly string[];
|
|
429
|
+
}
|
|
430
|
+
|
|
300
431
|
export interface LinkedinJob {
|
|
301
432
|
readonly job_posting_id: string;
|
|
302
433
|
readonly title: string;
|
|
@@ -888,6 +1019,10 @@ export class ApickClient {
|
|
|
888
1019
|
linkedinJob(url: string): Promise<ApickResult<LinkedinJob>>;
|
|
889
1020
|
courtAuction(caseNo: string, court: string): Promise<ApickResult<CourtAuction>>;
|
|
890
1021
|
registryDocVerify(issueNo: string, options?: { readonly kind?: 'realestate' | 'corporate' | 'movable' }): Promise<ApickResult<RegistryDocVerify>>;
|
|
1022
|
+
bidNotice(options: BidQueryOptions): Promise<ApickResult<BidNotice>>;
|
|
1023
|
+
bidAward(options: BidQueryOptions): Promise<ApickResult<BidAward>>;
|
|
1024
|
+
rtmsTrade(lawdCd: string, dealYmd: string, options?: RtmsQueryOptions): Promise<ApickResult<RtmsTrade>>;
|
|
1025
|
+
rtmsRent(lawdCd: string, dealYmd: string, options?: RtmsQueryOptions): Promise<ApickResult<RtmsRent>>;
|
|
891
1026
|
screenshot(url: string): Promise<ApickBinaryResult>;
|
|
892
1027
|
youtubeMetadata(url: string): Promise<ApickResult<YoutubeMetadata>>;
|
|
893
1028
|
youtubeThumbnail(url: string): Promise<ApickBinaryResult>;
|
|
@@ -1074,7 +1209,7 @@ export interface SkillSummary {
|
|
|
1074
1209
|
export interface SkillDetail extends SkillSummary {
|
|
1075
1210
|
description: string; billing_rule: 'validated_result' | 'subagent_usage'; limits: SkillLimits | null;
|
|
1076
1211
|
delivery?: 'installed_agent'; installation?: {package:string;command:string;api_key_env:string;guide:string;usage:string};
|
|
1077
|
-
billing?: {
|
|
1212
|
+
billing?: {installation_points:number;base_points:number;complete_cache_points:number;quota:null};
|
|
1078
1213
|
input_schema: Record<string, unknown>; output_schema: Record<string, unknown>;
|
|
1079
1214
|
examples: unknown[]; stats: Record<string, unknown> | null; published_at: string | null;
|
|
1080
1215
|
}
|