# 프로젝트별 연동 지시문







인증: Authorization: Bearer $APICK_API_KEY

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

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



## GET /rest/subagent/v1/status 응답 필드

## 상태·목록 조회: GET /rest/subagent/v1/status



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

curl --fail-with-body --request GET 'https://apick.app/rest/subagent/v1/status' \
  --header "Authorization: Bearer $APICK_API_KEY"

```

### Node.js (서버 ESM)

```javascript

const response = await fetch("https://apick.app/rest/subagent/v1/status", {
  method: "GET",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
response = requests.request("GET", "https://apick.app/rest/subagent/v1/status",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

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

```

## POST /rest/subagent/v1/jobs 응답 필드

## 작업 접수: POST /rest/subagent/v1/jobs



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/subagent/v1/jobs' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'kind=compare' \
  --form-string 'goal=문서 두 개의 차이와 충돌을 비교하세요' \
  --form-string 'file_ids[0]=업로드 완료한 파일 ID' \
  --form-string 'acceptance[0]=모든 주장에 원문 근거' \
  --form-string 'retention=seven_days'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("kind", "compare");
form.append("goal", "문서 두 개의 차이와 충돌을 비교하세요");
form.append("file_ids[0]", "업로드 완료한 파일 ID");
form.append("acceptance[0]", "모든 주장에 원문 근거");
form.append("retention", "seven_days");
const response = await fetch("https://apick.app/rest/subagent/v1/jobs", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("kind", (None, "compare")),
    ("goal", (None, "문서 두 개의 차이와 충돌을 비교하세요")),
    ("file_ids[0]", (None, "업로드 완료한 파일 ID")),
    ("acceptance[0]", (None, "모든 주장에 원문 근거")),
    ("retention", (None, "seven_days")),
]
response = requests.request("POST", "https://apick.app/rest/subagent/v1/jobs",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'kind' => 'compare',
    'goal' => '문서 두 개의 차이와 충돌을 비교하세요',
    'file_ids[0]' => '업로드 완료한 파일 ID',
    'acceptance[0]' => '모든 주장에 원문 근거',
    'retention' => 'seven_days',
];
$curl = curl_init('https://apick.app/rest/subagent/v1/jobs');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/subagent/v1/files 응답 필드

## API 요청: POST /rest/subagent/v1/files



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

printf '%s\r\n' '--apick-empty--' | curl --fail-with-body --request POST 'https://apick.app/rest/subagent/v1/files' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --header 'Content-Type: multipart/form-data; boundary=apick-empty' \
  --data-binary @-

```

### Node.js (서버 ESM)

```javascript

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

```

### python

```python

import os
import requests
response = requests.request("POST", "https://apick.app/rest/subagent/v1/files",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"], "Content-Type": "multipart/form-data; boundary=apick-empty"},
    data=b"--apick-empty--\r\n",
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$headers[] = "Content-Type: multipart/form-data; boundary=apick-empty";
$form = "--apick-empty--\r\n";
$curl = curl_init('https://apick.app/rest/subagent/v1/files');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/subagent/v1/files/:file_id/parts 응답 필드

## API 요청: POST /rest/subagent/v1/files/:file_id/parts



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

printf '%s\r\n' '--apick-empty--' | curl --fail-with-body --request POST "https://apick.app/rest/subagent/v1/files/${APICK_FILE_ID}/parts" \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --header 'Content-Type: multipart/form-data; boundary=apick-empty' \
  --data-binary @-

```

### Node.js (서버 ESM)

```javascript

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

```

### python

```python

import os
import requests
from urllib.parse import quote
response = requests.request("POST", "https://apick.app" + "/rest/subagent/v1/files/{file_id}/parts".format(file_id=quote(os.environ["APICK_FILE_ID"], safe="")),
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"], "Content-Type": "multipart/form-data; boundary=apick-empty"},
    data=b"--apick-empty--\r\n",
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$headers[] = "Content-Type: multipart/form-data; boundary=apick-empty";
$form = "--apick-empty--\r\n";
$curl = curl_init('https://apick.app/rest/subagent/v1/files/' . rawurlencode(getenv('APICK_FILE_ID')) . '/parts');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/subagent/v1/files/:file_id/complete 응답 필드

## API 요청: POST /rest/subagent/v1/files/:file_id/complete



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

printf '%s\r\n' '--apick-empty--' | curl --fail-with-body --request POST "https://apick.app/rest/subagent/v1/files/${APICK_FILE_ID}/complete" \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --header 'Content-Type: multipart/form-data; boundary=apick-empty' \
  --data-binary @-

```

### Node.js (서버 ESM)

```javascript

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

```

### python

```python

import os
import requests
from urllib.parse import quote
response = requests.request("POST", "https://apick.app" + "/rest/subagent/v1/files/{file_id}/complete".format(file_id=quote(os.environ["APICK_FILE_ID"], safe="")),
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"], "Content-Type": "multipart/form-data; boundary=apick-empty"},
    data=b"--apick-empty--\r\n",
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$headers[] = "Content-Type: multipart/form-data; boundary=apick-empty";
$form = "--apick-empty--\r\n";
$curl = curl_init('https://apick.app/rest/subagent/v1/files/' . rawurlencode(getenv('APICK_FILE_ID')) . '/complete');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## GET /rest/subagent/v1/jobs/:job_id 응답 필드

## 상태·목록 조회: GET /rest/subagent/v1/jobs/:job_id



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

curl --fail-with-body --request GET "https://apick.app/rest/subagent/v1/jobs/${APICK_JOB_ID}" \
  --header "Authorization: Bearer $APICK_API_KEY"

```

### Node.js (서버 ESM)

```javascript

const response = await fetch(`https://apick.app/rest/subagent/v1/jobs/${encodeURIComponent(process.env.APICK_JOB_ID)}`, {
  method: "GET",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
from urllib.parse import quote
response = requests.request("GET", "https://apick.app" + "/rest/subagent/v1/jobs/{job_id}".format(job_id=quote(os.environ["APICK_JOB_ID"], safe="")),
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

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

```

## POST /rest/subagent/v1/jobs/:job_id/evidence 응답 필드

## API 요청: POST /rest/subagent/v1/jobs/:job_id/evidence



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

printf '%s\r\n' '--apick-empty--' | curl --fail-with-body --request POST "https://apick.app/rest/subagent/v1/jobs/${APICK_JOB_ID}/evidence" \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --header 'Content-Type: multipart/form-data; boundary=apick-empty' \
  --data-binary @-

```

### Node.js (서버 ESM)

```javascript

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

```

### python

```python

import os
import requests
from urllib.parse import quote
response = requests.request("POST", "https://apick.app" + "/rest/subagent/v1/jobs/{job_id}/evidence".format(job_id=quote(os.environ["APICK_JOB_ID"], safe="")),
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"], "Content-Type": "multipart/form-data; boundary=apick-empty"},
    data=b"--apick-empty--\r\n",
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$headers[] = "Content-Type: multipart/form-data; boundary=apick-empty";
$form = "--apick-empty--\r\n";
$curl = curl_init('https://apick.app/rest/subagent/v1/jobs/' . rawurlencode(getenv('APICK_JOB_ID')) . '/evidence');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/subagent/v1/jobs/:job_id/review 응답 필드

## API 요청: POST /rest/subagent/v1/jobs/:job_id/review



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

printf '%s\r\n' '--apick-empty--' | curl --fail-with-body --request POST "https://apick.app/rest/subagent/v1/jobs/${APICK_JOB_ID}/review" \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --header 'Content-Type: multipart/form-data; boundary=apick-empty' \
  --data-binary @-

```

### Node.js (서버 ESM)

```javascript

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

```

### python

```python

import os
import requests
from urllib.parse import quote
response = requests.request("POST", "https://apick.app" + "/rest/subagent/v1/jobs/{job_id}/review".format(job_id=quote(os.environ["APICK_JOB_ID"], safe="")),
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"], "Content-Type": "multipart/form-data; boundary=apick-empty"},
    data=b"--apick-empty--\r\n",
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$headers[] = "Content-Type: multipart/form-data; boundary=apick-empty";
$form = "--apick-empty--\r\n";
$curl = curl_init('https://apick.app/rest/subagent/v1/jobs/' . rawurlencode(getenv('APICK_JOB_ID')) . '/review');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## POST /rest/subagent/v1/jobs/:job_id/cancel 응답 필드

## 작업 취소: POST /rest/subagent/v1/jobs/:job_id/cancel



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

printf '%s\r\n' '--apick-empty--' | curl --fail-with-body --request POST "https://apick.app/rest/subagent/v1/jobs/${APICK_JOB_ID}/cancel" \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --header 'Content-Type: multipart/form-data; boundary=apick-empty' \
  --data-binary @-

```

### Node.js (서버 ESM)

```javascript

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

```

### python

```python

import os
import requests
from urllib.parse import quote
response = requests.request("POST", "https://apick.app" + "/rest/subagent/v1/jobs/{job_id}/cancel".format(job_id=quote(os.environ["APICK_JOB_ID"], safe="")),
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"], "Content-Type": "multipart/form-data; boundary=apick-empty"},
    data=b"--apick-empty--\r\n",
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$headers[] = "Content-Type: multipart/form-data; boundary=apick-empty";
$form = "--apick-empty--\r\n";
$curl = curl_init('https://apick.app/rest/subagent/v1/jobs/' . rawurlencode(getenv('APICK_JOB_ID')) . '/cancel');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## GET /rest/subagent/v1/usage 응답 필드

## 상태·목록 조회: GET /rest/subagent/v1/usage



### 입력



### 응답 명세

```json

{
  "type": "object",
  "properties": {}
}

```

### curl

```curl

curl --fail-with-body --request GET 'https://apick.app/rest/subagent/v1/usage' \
  --header "Authorization: Bearer $APICK_API_KEY"

```

### Node.js (서버 ESM)

```javascript

const response = await fetch("https://apick.app/rest/subagent/v1/usage", {
  method: "GET",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
response = requests.request("GET", "https://apick.app/rest/subagent/v1/usage",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

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

```

## 코드·오류

## 상세 기능·요금

에이픽 서브에이전트조사·추출·요약·비교를 위임하고, 원문 인용과 해시로 검수합니다. 각 프로젝트에 전달할 연동 지침에서 복사해 사용하는 지시문, Windows·macOS·Linux API 키 설정, 첫 무료 확인, 프로젝트별 파일 범위, 실제 위임·근거 검수와 오류 대응을 확인하세요. 지침 파일 내려받기 Node.js 22.17 이상에서 설치합니다. Codex·Claude Code 설정의 기존 항목은 보존합니다. npm install -g apick-subagent apick-subagent install # APICK_API_KEY 환경변수에 apick.app API 키를 설정한 뒤 클라이언트 재시작 apick-subagent doctor 프로젝트 폴더를 열고 “이 자료의 비교를 apick-subagent에 위임하고 핵심 근거를 검수해 줘”라고 요청하세요. 설치만으로 모든 요청의 위임이 강제되지는 않습니다. 작업에 맞는 위임 여부는 주 에이전트가 판단합니다. 배포 파일로 직접 설치할 수도 있습니다: npm install -g https://apick.app/downloads/apick-subagent-1.0.1.tgz 모든 요청에 Authorization: Bearer API_KEY가 필요합니다. 접수에는 Idempotency-Key를 보내세요. 같은 키와 같은 내용은 기존 작업을 반환하며, 다른 내용은 409 오류입니다. 연결 종료는 작업 취소가 아닙니다. 메서드경로설명 GET/rest/subagent/v1/status접수 상태·잔액·지원 작업 POST/rest/subagent/v1/files상대경로 path, bytes, sha256, retention으로 업로드 시작 POST/rest/subagent/v1/files/{file_id}/partspart_no(0부터), base64 data를 반환된 part_bytes 크기로 순서대로 업로드 POST/rest/subagent/v1/files/{file_id}/complete전체 크기·해시·텍스트 검증 후 파일 준비 DELETE/rest/subagent/v1/files/{file_id}원문·관련 결과·캐시 즉시 삭제, 처리 중 작업 취소 POST/rest/subagent/v1/jobskind, goal, file_ids, focus, acceptance, retention으로 접수 GET/rest/subagent/v1/jobs/{job_id}상태·결과·결과 해시, cursor로 다음 결과 조회 POST/rest/subagent/v1/jobs/{job_id}/evidenceevidence_ids로 원문 인용·줄 번호·해시 조회 POST/rest/subagent/v1/jobs/{job_id}/reviewresult_hash와 decision(accepted 또는 rejected) 기록 POST/rest/subagent/v1/jobs/{job_id}/cancel작업 취소. 원가 미확정이면 정산 확인을 기다립니다. DELETE/rest/subagent/v1/jobs/{job_id}결과·근거·캐시 삭제 GET/rest/subagent/v1/usage호출·토큰·캐시·과금·최근 작업 curl https://apick.app/rest/subagent/v1/status \ -H "Authorization: Bearer $APICK_API_KEY" curl -X POST https://apick.app/rest/subagent/v1/jobs \ -H "Authorization: Bearer $APICK_API_KEY" \ -H "Idempotency-Key: project-review-20261004-001" \ -H "Content-Type: application/json" \ -d '{"kind":"compare","goal":"문서 두 개의 차이와 충돌을 비교하세요","file_ids":["업로드 완료한 파일 ID"],"focus":[],"acceptance":["모든 주장에 원문 근거"],"retention":"seven_days"}' kind는 inventory, extract, summarize, compare 중 하나입니다. 큰 자료는 자동 분할합니다. 파일 수·토큰·누적 사용액의 상품 한도는 없으며, 전송 조각과 응답 페이지 크기는 안정적인 처리를 위한 단위입니다. 원격 주소는 https://apick.app/mcp/subagent입니다. Bearer 인증을 지원하는 Streamable HTTP 클라이언트에서 연결하세요. 원격 MCP는 이미 업로드한 자료를 처리합니다. 로컬 파일 직접 수집은 설치 패키지의 브리지가 담당합니다. 도구기능apick_status상태·잔액 확인apick_dispatch멱등 작업 접수apick_collect짧은 결과와 다음 페이지 확인apick_evidence근거 조회apick_review결과 해시에 검수 기록apick_cancel작업 취소apick_usage내 사용 통계 성공한 작업의 확인된 사용 원가에 40%를 가산합니다. 소수 포인트는 누적하며, 승인된 동일 결과 캐시 재사용은 0P입니다. 접수 시 예상 최대 비용을 예약하고 차액을 해제합니다. 실패·취소·자동 검증 실패는 청구하지 않습니다. 비용 미확정이 24시간 지속되면 예약을 해제합니다. 자료는 7일 후 만료됩니다. retention을 none으로 보내면 검수 완료 후 삭제하며, 임시 보관은 최대 1시간입니다. 즉시 삭제도 가능합니다. 주 모델 실제 비용 미연동은 0원이나 확정 절감률로 표시하지 않습니다. 코드대응AUTH_REQUIRED키·계정·허용 IP 확인INSUFFICIENT_POINTS포인트 충전 후 다시 접수IDEMPOTENCY_CONFLICT기존 요청 내용 확인. 응답 유실에는 같은 키·같은 내용을 유지INTEGRITY_FAILED자료·근거 검증 실패. 청구하지 않으며 상태 확인 후 내용 검토UNAVAILABLE기존 작업 ID로 상태 확인. 새 키로 무작정 재접수하지 않음EXPIRED자료 보관 기간 종료. 필요한 자료를 다시 업로드 사용량·비용 확인 · 제품 소개와 검증 사례 요약은 목표와 관련된 원문 인용을 출처별로 묶습니다. 비교는 동일 문구와 자료별 고유 문구를 구분합니다. 자동 근거 검증은 인용·행·해시 일치 검사이며 의미 판단과 최종 결론은 주 에이전트가 검수합니다.
