# 상품 최저가 조회



검색어로 상품 등록 정보를 찾아 판매처와 가격을 한 번에 받고, 그중 최저가 상품을 lowest로 함께 확인합니다. 목록·검색 조회 한 건에 한 번만 과금되는 동기 API입니다.



인증: Authorization: Bearer $APICK_API_KEY

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

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



## POST /rest/shop_price 응답 필드

- `data` (object): 아래 하위 항목을 확인하세요.

- `data.total` (integer): 아래 하위 항목을 확인하세요.

- `data.start` (integer): 아래 하위 항목을 확인하세요.

- `data.display` (integer): 아래 하위 항목을 확인하세요.

- `data.items` (array): 아래 하위 항목을 확인하세요.

- `data.lowest` (object): 아래 하위 항목을 확인하세요.

- `data.lowest.lprice` (integer): 아래 하위 항목을 확인하세요.

- `data.lowest.mallName` (string): 아래 하위 항목을 확인하세요.

- `data.lowest.link` (string): 아래 하위 항목을 확인하세요.

- `data.lowest.title` (string): 아래 하위 항목을 확인하세요.

- `api` (object): 아래 하위 항목을 확인하세요.

- `api.cost` (integer): 아래 하위 항목을 확인하세요.

- `api.success` (boolean): 아래 하위 항목을 확인하세요.

- `api.ms` (integer): 아래 하위 항목을 확인하세요.

## API 요청: POST /rest/shop_price



### 입력

- `query` (string, 필수): 검색어 (최대 100자)

- `display` (integer, 선택): 결과 수 (기본 10, 최대 100)

- `start` (integer, 선택): 시작 위치 (기본 1, 최대 1000)

- `sort` (string, 선택): 정렬 (기본 sim) 허용값: sim, date, asc, dsc



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer"
        },
        "start": {
          "type": "integer"
        },
        "display": {
          "type": "integer"
        },
        "items": {
          "type": "array",
          "items": {}
        },
        "lowest": {
          "type": "object",
          "properties": {
            "lprice": {
              "type": "integer"
            },
            "mallName": {
              "type": "string"
            },
            "link": {
              "type": "string"
            },
            "title": {
              "type": "string"
            }
          }
        }
      }
    },
    "api": {
      "type": "object",
      "properties": {
        "cost": {
          "type": "integer"
        },
        "success": {
          "type": "boolean"
        },
        "ms": {
          "type": "integer"
        }
      }
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "total": 1200,
    "start": 1,
    "display": 20,
    "items": [],
    "lowest": {
      "lprice": 12900,
      "mallName": "판매처",
      "link": "https://apick.app",
      "title": "무선 이어폰"
    }
  },
  "api": {
    "cost": 100,
    "success": true,
    "ms": 210
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/shop_price' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string 'query=무선 이어폰' \
  --form-string 'display=20' \
  --form-string 'sort=asc'

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("query", "무선 이어폰");
form.append("display", "20");
form.append("sort", "asc");
const response = await fetch("https://apick.app/rest/shop_price", {
  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 = [
    ("query", (None, "무선 이어폰")),
    ("display", (None, "20")),
    ("sort", (None, "asc")),
]
response = requests.request("POST", "https://apick.app/rest/shop_price",
    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 = [
    'query' => '무선 이어폰',
    'display' => '20',
    'sort' => 'asc',
];
$curl = curl_init('https://apick.app/rest/shop_price');
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);

```

## 코드·오류

## 상세 기능·요금

이용 전 확인 성공한 조회 한 건당 100P가 차감됩니다. 검색 결과가 0건이어도 조회가 성공하면 같은 요금이 적용됩니다. 실제 차감액은 응답의 api.cost에서 확인하세요. 가격은 조회 시점의 판매처 등록값입니다. 배송비·옵션 추가금·쿠폰·회원 등급이 반영되지 않으므로 실제 결제 금액과 다를 수 있습니다. 최저가 비교의 참고값으로 사용하세요. 인증키는 서버 환경변수에 보관하고 공개 저장소·웹페이지에 넣지 마세요.

## 상세 요청

항목설정 메서드·주소POST https://apick.app/rest/shop_price 인증 헤더Authorization: Bearer — 내 계정의 API 인증키 본문 형식multipart/form-data 필수 항목query — 검색어. 최대 100자 선택 항목display 결과 수(기본 10, 최대 100), start 시작 위치(기본 1, 최대 1000), sort 정렬(sim 정확도·date 최신·asc 낮은 가격·dsc 높은 가격) 요청 예시 낮은 가격 순으로 20건을 받는 예입니다. 성공 시 과금되는 실제 요청입니다. form-data 전체 예제 보기

## 상세 코드·정책

응답과 오류 복구 필드타입설명 data.totalinteger검색된 전체 상품 수입니다. 요청한 결과 수보다 클 수 있습니다. data.startinteger이번 응답이 시작한 위치입니다. data.displayinteger이번 응답에 담긴 상품 수입니다. data.items[]array상품 목록입니다. data.items[].titlestring상품명입니다. 검색어 강조 태그는 제거된 평문입니다. data.items[].linkstring상품 주소입니다. data.items[].mallNamestring판매처 이름입니다. data.items[].lpriceinteger최저가(원). 값이 없으면 0입니다. data.items[].hpriceinteger최고가(원). 값이 없으면 0입니다. data.lowestobject가격이 있는 상품 중 최저가 상품입니다. 해당 상품이 없으면 null입니다. api.costinteger차감된 포인트입니다. 실패한 응답은 0입니다. api.msinteger처리 시간(밀리초)입니다. { "data": { "total": 1200, "start": 1, "display": 20, "items": [], "lowest": { "lprice": 12900, "mallName": "판매처", "link": "https://apick.app", "title": "무선 이어폰" } }, "api": { "cost": 100, "success": true, "ms": 210 } } 검색어가 비어 있거나 100자를 넘거나 정렬 값이 잘못되면 조회 전에 data.error로 실패합니다. 상품 가격을 가져오지 못하면 공개 안내 문구가 오고 api.cost는 0입니다. 같은 검색을 반복하면 매번 과금되므로 다음 페이지는 start를 올려 한 번에 받으세요.
