개요

API 키로 문서·이미지 처리 API를 호출하거나, 계정의 잔액·사용 내역·적용 단가를 조회할 수 있습니다. 문서·이미지 처리 API의 요청 형식은 좌측 API 레퍼런스에서 확인하세요.

시작하기

  1. 회원가입 후 로그인합니다.
  2. 대시보드 → API 키에서 키(pk_live_…)를 발급합니다. 키 원문은 발급 시 한 번만 표시됩니다.
  3. 아래 요청 예시의 YOUR_API_KEY를 발급한 키로 바꿔 호출합니다.

인증

모든 요청의 x-api-key 헤더에 API 키를 넣습니다. 조회할 계정은 이 키로 자동 확인하므로 사용자 ID를 따로 보내지 않습니다.

x-api-key: YOUR_API_KEY

키가 없거나 유효하지 않으면 401 invalid_key가 반환됩니다. 폐기된 키와 이용 정지 계정의 키도 사용할 수 없습니다.

과금

  • 문서·이미지 처리 API는 계정별 무료 제공량을 먼저 사용하고, 소진 후에는 충전 잔액에서 사용 금액을 차감합니다.
  • 처리 실패로 환불되는 경우에는 차감한 금액을 잔액으로 돌려드립니다.
  • 단가와 사용 금액은 원화이며 부가세 별도입니다. 실제 과금에는 호출 시점의 단가가 적용됩니다.
  • 아래 잔액 조회·사용 내역 조회·API별 단가 조회는 무료이며, 충전 잔액과 무료 제공량을 소모하지 않습니다.

충전 잔액 조회

API 사용에 쓸 수 있는 현재 충전 잔액을 확인합니다. 같은 계정에서 발급한 키는 모두 같은 잔액을 조회합니다.

GET /api/v1/balance

요청

curl "https://marketapi.nadoo.ai/api/v1/balance" \
  -H "x-api-key: YOUR_API_KEY"

응답 예시

{
  "balanceKrw": 49800,
  "lowBalanceThresholdKrw": 5000,
  "updatedAt": "2026-08-06T02:31:00.000Z"
}
필드타입설명
balanceKrwnumber현재 잔액. 예시에서는 49,800원을 사용할 수 있습니다.
lowBalanceThresholdKrwnumber | null설정한 저잔액 이메일 알림 기준 금액. null이면 알림을 사용하지 않습니다.
updatedAtstring | null잔액이 마지막으로 변경된 시각(UTC). 충전·차감 이력이 없으면 null입니다.

사용 내역 조회

대시보드의 사용량 화면에 표시되는 API 사용 내역(차감)과 그 사용 건에 대한 환불을 최신순으로 가져옵니다. 무료로 사용한 내역도 포함됩니다. type으로 차감 또는 환불만 골라 볼 수 있습니다. 잔액 충전은 사용 내역이 아니므로 포함하지 않습니다.

조회에 사용한 키의 호출만이 아니라, 같은 계정의 모든 API 키로 사용한 내역을 반환합니다.

GET /api/v1/usage

1. 첫 페이지 요청

아래 예시는 한 페이지에 최대 20건을 요청합니다.

curl "https://marketapi.nadoo.ai/api/v1/usage?page=1&pageSize=20" \
  -H "x-api-key: YOUR_API_KEY"
파라미터기본값설명
page1가져올 페이지 번호. 1부터 시작합니다.
pageSize100한 페이지에 받을 최대 건수. 1~100 사이의 정수입니다.
type(전체)내역 유형 필터. CHARGE(사용 차감) 또는 REFUND(환불). 생략하면 둘 다 반환합니다.

2. 응답 읽기

아래는 내역이 2건 있는 계정의 응답 예시입니다. 20건을 요청해도 남은 내역이 2건이면 2건만 반환됩니다.

{
  "items": [{
    "id": "usage_example_1",
    "type": "CHARGE",
    "deltaKrw": -200,
    "createdAt": "2026-08-06T02:31:00.000Z",
    "productSlug": "hira-detect",
    "productName": "멀티 제약사 라벨링",
    "unitPriceKrw": 200,
    "free": false,
    "requestId": "request_example_1"
  }, {
    "id": "usage_example_0",
    "type": "REFUND",
    "deltaKrw": 200,
    "createdAt": "2026-08-05T01:00:00.000Z",
    "productSlug": "hira-detect",
    "productName": "멀티 제약사 라벨링",
    "unitPriceKrw": 200,
    "free": false,
    "requestId": "request_example_0:refund"
  }],
  "page": 1,
  "pageSize": 20,
  "hasMore": false
}

첫 번째는 멀티 제약사 라벨링 API를 사용해 200원이 차감된 내역이고, 두 번째는 이전 사용 건이 처리 실패로 200원 환불된 내역입니다. hasMore: false이므로 추가 페이지를 요청할 필요가 없습니다.

필드타입설명
itemsarray이 페이지의 사용 내역. 내역이 없으면 빈 배열([])입니다.
items[].idstring각 내역을 구분하는 고유 ID입니다.
items[].typestring내역 유형. CHARGE(API 사용 차감) 또는 REFUND(환불)입니다.
items[].deltaKrwnumber이 내역으로 잔액이 변한 금액(원). 차감은 음수, 환불은 양수, 무료 사용은 0입니다.
items[].createdAtstring발생 시각(UTC). 예시의 02:31 UTC는 한국 시각 11:31입니다.
items[].productSlugstring | null사용한 API의 식별자. 예: hira-detect. API 정보를 찾을 수 없으면 null입니다.
items[].productNamestring | null사용한 API의 표시 이름. API 정보를 찾을 수 없으면 null입니다.
items[].unitPriceKrwnumber이 건에 기록된 단가(원, 부가세 별도). 차감은 차감 금액, 환불은 돌려준 금액이며 무료 사용은 0입니다.
items[].freeboolean사용 차감(CHARGE) 건의 차감 금액이 0이면 true. 유료 사용과 환불은 false입니다.
items[].requestIdstring | null이 내역에 연결된 API 요청의 ID. 기록이 없으면 null입니다.
pagenumber요청한 페이지 번호입니다.
pageSizenumber요청한 페이지당 최대 건수입니다. 실제 반환 건수는 items.length로 확인합니다.
hasMorebooleantrue이면 다음 페이지가 있고, false이면 마지막 페이지입니다.

3. 다음 페이지 요청

응답의 hasMore가 true일 때만 page를 1 늘려 다시 호출합니다. pageSize는 같은 값으로 유지하세요.

curl "https://marketapi.nadoo.ai/api/v1/usage?page=2&pageSize=20" \
  -H "x-api-key: YOUR_API_KEY"

조회 시 알아둘 점

  • 전체 건수·전체 페이지 수·금액 합계는 제공하지 않습니다. 다음 페이지가 필요한지는 hasMore로 판단합니다.
  • 내역이 없는 페이지를 요청하면 items: [], hasMore: false를 반환합니다.
  • 사용 금액만 보려면 type=CHARGE로 조회하세요. 이 경우 unitPriceKrw 합이 사용액(부가세 별도)입니다. 나중에 환불된 사용 건도 최초 차감 금액으로 남고 환불은 별도 REFUND 행으로 기록됩니다.
  • 충전 내역은 포함하지 않습니다. 이 목록의 금액을 더해 현재 잔액을 계산하면 안 됩니다. 현재 잔액은 잔액 조회 API를 사용하세요.
  • 여러 페이지를 가져오는 도중 새 사용 내역이 생기면 항목이 다음 페이지로 밀려 중복될 수 있습니다. 목록을 합칠 때는 id로 중복을 제거하세요.
페이지 요청 오류 (400 invalid_pagination)

page와 pageSize는 양의 정수로 각각 한 번만 지정해야 합니다. 0·음수·소수·빈 값 또는 pageSize가 100을 넘는 요청은 거절됩니다.

매우 큰 페이지 번호도 거절될 수 있습니다. 요청 범위는 (page - 1) × pageSize ≤ 2147483647입니다.

유형 필터 오류 (400 invalid_type)

type은 CHARGE 또는 REFUND(대문자)를 한 번만 지정해야 합니다. 그 외 값(TOPUP 포함)이나 빈 값, 중복 지정은 거절됩니다.

API별 단가 조회

내 계정에 적용되는 API별 현재 단가를 가져옵니다. 고객 서비스에서 API 가격을 표시하거나, 사용 전 단가를 확인할 때 사용하세요.

GET /api/v1/catalog

요청

조회 조건은 필요하지 않습니다. API 키만 보내면 됩니다.

curl "https://marketapi.nadoo.ai/api/v1/catalog" \
  -H "x-api-key: YOUR_API_KEY"

응답 예시

{
  "currency": "KRW",
  "vatIncluded": false,
  "items": [{
    "slug": "hira-detect",
    "name": "멀티 제약사 라벨링",
    "billingUnit": "CALL",
    "priceKrw": 200
  }]
}

이 예시는 내 계정에서 멀티 제약사 라벨링 API의 1건당 단가가 200원(부가세 별도)이라는 뜻입니다. 무료 제공량이 남아 있으면 실제 호출 시에는 무료 제공량을 먼저 사용합니다.

필드타입설명
currencystring금액의 통화. 항상 KRW(원화)입니다.
vatIncludedboolean항상 false입니다. 응답의 단가는 부가세를 포함하지 않습니다.
itemsarray제공 중인 API 목록. 베타 API도 포함하며, 서비스가 종료된 API는 제외합니다.
items[].slugstringAPI 식별자. 사용 내역의 productSlug와 같은 값입니다.
items[].namestring화면에 표시할 API 이름입니다.
items[].billingUnitstring단가 적용 단위. CALL은 1건, IMAGE는 이미지 1장, PAGE는 문서 1페이지입니다.
items[].priceKrwnumber | null내 계정에 적용되는 단가(원). 0이면 0원이며, null이면 단가가 아직 정해지지 않은 상태입니다.

단가를 사용할 때

  • 계정에 별도로 설정된 단가가 있으면 그 금액을 반환합니다. 별도 설정이 없으면 기본 단가를 반환하므로, 고객 서비스에서 할인 계산을 할 필요가 없습니다.
  • priceKrw: null은 무료가 아닙니다. 화면에는 “가격 문의” 등으로 표시하고, 단가 설정 후 이용하세요.
  • 조회 후 단가가 변경될 수 있습니다. 실제 차감에는 API를 호출하는 시점의 단가가 적용되며, 이미 사용한 금액은 사용 내역 조회에서 확인합니다.

공통 에러

에러 응답 본문: { "error": "<code>", "message"?: "..." }

HTTPerror의미
400invalid_pagination사용 내역 조회의 페이지 값이 잘못되었거나 같은 파라미터를 여러 번 지정했습니다.
400invalid_type사용 내역 조회의 type이 CHARGE·REFUND가 아니거나 여러 번 지정되었습니다.
401invalid_keyAPI 키가 없거나 유효하지 않습니다. 키가 폐기되었거나 계정이 이용 정지된 경우도 포함합니다.
403not_entitled해당 API 사용 권한 없음
402insufficient_credit무료 소진 + 잔액 부족 (applyUrl 포함)
404product_not_found존재하지 않거나 종료된 API
400invalid_image이미지가 아닌 본문(형식 오류·잘못된 Content-Type·image에 URL 등). 과금 전에 거절하므로 과금 없음. receivedBytes·contentType·hint로 원인을 확인하세요.
413image_too_large / image_url_too_large해상도가 6천만 화소를 넘거나(아이폰 48MP 사진은 가능) imageUrl 파일이 25MB 를 넘음. 해상도를 줄여 보내 주세요.
422multi_page여러 페이지 TIFF — 첫 페이지만 처리되어 누락되므로 거절. 페이지를 나눠 한 장씩 보내 주세요.
422image_url_timeout / image_url_fetch_failed / image_url_not_imageimageUrl 을 20초 안에 받지 못했거나, 접속·HTTP 오류(서명 URL 만료 포함), 이미지가 아닌 응답(HTML 등). 과금됐다면 자동 환불.
415unsupported_image_format알아볼 수는 있지만 처리할 수 없는 형식(HEIC·BMP·PDF 등). 지원 형식: JPG·PNG·WEBP·GIF·TIFF·AVIF(서류 추출은 HEIC·PDF도 지원). 본문으로 보내면 과금 전 거절, URL 로 보내 처리 중 판명되면 자동 환불.
422idempotency_key_reuse같은 Idempotency-Key로 다른 본문을 보냄. 본문을 바꿨다면 새 키를 쓰세요.
429rate_limitedAPI 키별 요청 한도(초당·동시 처리) 초과. 과금 없음. Retry-After초 뒤 재시도.
502processor_error처리 실패 (해당 호출 자동 환불)
503server_busy / upstream_busy / db_unavailable일시적으로 처리할 수 없음. 과금됐다면 자동 환불. Retry-After초 뒤 같은 키·같은 본문으로 재시도.

요청 한도와 재시도

  • 요청 한도는 API 키 단위로 적용됩니다. 한도는 처리 상황에 따라 달라질 수 있으니 고정값에 맞추지 말고 응답 헤더 RateLimit-Limit·RateLimit-Remaining·RateLimit-Reset(초)으로 남은 한도를 확인할 수 있습니다.
  • 429·503 응답에는 Retry-After(초) 헤더가 있습니다. 그 시간만큼 기다린 뒤, 반복 실패 시 지수 백오프(+무작위 지연)로 간격을 늘려 재시도하세요.
  • 재시도할 때는 같은 Idempotency-Key와 같은 본문을 보내세요. 이미 처리된 요청이면 재처리·재과금 없이 최초 결과가 돌아옵니다. 본문을 바꾸면 새 키를 써야 합니다(422).
  • 400·402·413·415·422는 재시도해도 결과가 같습니다. 요청을 고친 뒤 다시 보내세요.
  • 성공 응답에 warnings가 있으면 결과를 확인해 주세요. 예: image_truncated — 파일이 잘렸거나 손상된 것으로 보여 일부 내용이 누락됐을 수 있습니다.
  • 여러 장을 처리할 때는 단건 API를 동시에 많이 호출하지 말고 배치 API(detect-batch, *-batch-async)를 사용하세요.