space ocr
가이드아티클요금문서
OCR API

검증할 수 있는 데이터를 돌려주는 OCR API

REST 호출 한 번으로, 값마다 box·quad·검증 판정이 붙은 구조화 JSON이 돌아옵니다. Bearer 인증, fields 선언 또는 autoFields, 비동기 작업, 서명 웹훅.

대부분의 OCR API는 페이지 전체 텍스트 덩어리와 신뢰도 점수 하나를 돌려줄 뿐입니다. 세금계산서 합계를 찾고, 파싱하고, 제자리에 들어갔기를 바라는 일은 결국 여러분 몫으로 남습니다. space-ocr의 OCR API는 그 구조화까지 해줍니다. 이미지와 원하는 필드 선언을 한 번 POST하면(스키마를 API가 제안하게 하려면 autoFields), 이름 붙인 값이 JSON으로 돌아옵니다.

프로덕션에서 진짜 중요한 건 각 값에 무엇이 따라오느냐입니다. data.cells 는 선언한 스키마와 같은 경로로 조회되고, 값을 읽어낸 박스, 그 박스의 네 꼭짓점, verified 판정, 그리고 그 판정의 근거가 된 사유가 들어 있습니다. 그래서 파이프라인은 모델의 말을 믿을 필요 없이 각 값을 문서 위 실제 위치와 대조하고, 어긋난 값은 data.review.flagged 목록으로 처리할 수 있습니다.

직접 살펴볼 수 있는 실제 응답

아래 어느 필드든 마우스를 올려 보세요 — 세금계산서 위의 박스가 그 값을 읽어낸 지점입니다. 이것은 실제 파싱 결과입니다. 청구처명 ソジュハンザン海物語様, 청구 금액 ¥84,263, 합계 ¥46,752, 각 품목 — 모두 자기 박스와 대조 근거와 함께 돌아옵니다. 목업이 아닙니다.

Invoice with extracted-field bounding boxes
Verified fields
Invoice

Each value with a box carries a verified on-page location — in data.cells[path], that is box + 4-point quad + evidence.match_ratio — on a 0–1000 normalized grid (0,0 top-left → 1000,1000 bottom-right), the same shape the live API returns. Hover a field to trace it back to the pixels it came from.

세 가지 형태, 같은 계약
같은 한 장을 이름 붙은 필드로, 레이아웃을 살린 마크다운으로(POST /ocr/markdown), 또는 읽기순서를 바로잡은 원문 텍스트로(POST /ocr/text) 받을 수 있습니다. 무엇을 고르든 응답은 values / cells / review / image 라는 같은 형태이고, 단위마다 읽어 온 좌표와 검증 판정이 함께 옵니다.
한 번의 호출, 박스가 붙은 JSON
POST /ocr/fields에 이미지 한 장을 보내면 이름 붙인 값이 돌아옵니다. data.cells 의 각 경로가 박스를 가지므로 위치를 찾는 두 번째 패스가 필요 없습니다.
box·quad·review
각 셀이 0–1000 그리드의 xmin/ymin/xmax/ymax, 페이지 기울기를 따르는 4점 quad, verified 판정, 그리고 뒷받침이 담긴 evidence 를 반환합니다.
필드는 직접 선언
fields 에 값마다 이름과 타입을 적고, 규칙이 필요한 자리에 required·pattern·min/max·enum·label·near 를 붙여 보냅니다. 품목은 children 을 가진 array 필드입니다. 스키마를 API가 제안하게 하려면 autoFields 를 켭니다.
비동기 작업 + 서명 웹훅
POST /upload로 이미지를 큐에 넣고 파일마다 작업을 받습니다. 완료는 HMAC-SHA256 서명 웹훅으로 통지 — 또는 GET /jobs/{jobId}로 폴링.
CSV·JSON 내보내기
REST의 JSON에 더해, 저장된 시트를 UTF-8 BOM CSV(Excel·한중일 안전, 품목 펼침)로 내보낼 수 있습니다.
언어는 자동
일본어·한국어·중국어·영어를 한 엔진에서 — 언어 힌트 설정 없이, 혼합 스크립트와 전각 문자도 처리합니다.

space-ocr의 OCR API 작동 방식

Bearer 토큰으로 인증합니다 — 키는 spocr_로 시작하고, 베이스 URL은 https://api.space-ocr.com입니다. 래스터 이미지 한 장을 URL이나 base64로 POST /ocr/fields에 보냅니다(공개 API는 이미지 — JPEG·PNG·GIF·BMP·TIFF·WebP — 를 받으므로 PDF라면 페이지 이미지를 보냅니다). 직접 만든 fields를 선언하거나 autoFields를 켜면 { status: 'success', data: { values, cells, review, image } }가 돌아옵니다.

좌표는 모델이 지어낸 것이 아닙니다. 도형 정보의 출처는 OCR 패스 하나뿐이고, 모델은 값을 반환하며, 그다음 문자 매처가 각 값을 페이지에서 실제로 검출된 심볼과 대조합니다. 그 결과가 data.cells[path]에 담깁니다 — 위치를 가리키는 box·quad, 판정인 verified, 어긋났을 때의 사유를 담은 review, 그리고 text_match·match_ratio·printed_text 같은 evidence 입니다. 좌표는 값이 어디서 왔는지에 대한 근거이지 값이 옳다는 증명은 아닙니다. 두 엔진이 같은 오독에 합의할 수도 있으니 업무 규칙 검산은 그대로 두십시오. 모든 좌표는 0–1000으로 정규화돼 있고, 픽셀 환산은 data.image의 width·height로 합니다. 모든 응답에 X-Request-Id 헤더가 붙고, 오류는 { error: { code, message, requestId } }로 돌아옵니다.

이미지에서 필드 추출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
curl -s https://api.space-ocr.com/ocr/fields \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "https://example.com/invoice.png",
    "imageType": "url",
    "fields": [
      { "name": "vendor", "type": "string", "required": true },
      { "name": "invoice_date", "type": "date", "required": true },
      { "name": "total", "type": "number", "required": true, "min": 0 },
      { "name": "items", "type": "array", "children": [
        { "name": "description", "type": "string" },
        { "name": "amount", "type": "number" }
      ] }
    ]
  }'
같은 호출을 Python으로
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os, requests

resp = requests.post(
    "https://api.space-ocr.com/ocr/fields",
    headers={"Authorization": f"Bearer {os.environ['SPACE_OCR_API_KEY']}"},
    json={
        "image": "https://example.com/invoice.png",
        "imageType": "url",
        "fields": [
            {"name": "vendor", "type": "string", "required": True},
            {"name": "invoice_date", "type": "date", "required": True},
            {"name": "total", "type": "number", "required": True, "min": 0},
        ],
    },
    timeout=60,
)
resp.raise_for_status()
data = resp.json()["data"]

print(data["values"])              # business data, in the schema you declared
print(data.get("normalized"))      # deterministic parse of the declared date and number

for item in data["review"]["flagged"]:
    cell = data["cells"].get(item["path"])   # a missing or nobox flag has no cell
    print(item["path"], item["reasons"], cell["box"] if cell else None)

OCR API를 호출하는 방법

  1. API 키 받기
    로그인해 키를 만듭니다 — spocr_로 시작합니다. https://api.space-ocr.com 으로의 모든 요청에 Authorization: Bearer <key>로 보냅니다.
  2. 이미지 보내기
    POST /ocr/fields에 image(URL 또는 순수 base64)와 imageType을 보냅니다. PDF는 페이지 이미지를 보내세요 — API는 래스터 형식(JPEG·PNG·GIF·BMP·TIFF·WebP)을 받습니다.
  3. 필드 선언
    fields 에 값마다 이름과 타입을 적고, 규칙이 필요한 곳에 required·pattern·min/max·enum·label·near 를 덧붙입니다. 품목 표에는 children 이 있는 array 필드를 씁니다. 스키마를 API가 제안하게 하려면 대신 autoFields 를 켭니다.
  4. 구조화 결과 읽기
    { status: 'success', data: { values, cells, review, image } } 가 반환됩니다. values 에 업무 데이터, cells[path] 에 그 값의 box·quad·verified 판정과 evidence, review.flagged 에 사유가 붙은 확인 대상 경로 목록이 담깁니다.
  5. 확장과 조회
    POST /upload로 많은 이미지를 큐에 넣고(파일마다 작업, 서명 웹훅 또는 GET /jobs/{jobId}), 저장된 시트를 GET /view로 where·sort·select를 써서 읽습니다 — OCR 재실행도 추가 비용도 없습니다.

단순하고 예측 가능한 가격

이미지당 ₩100(¥10 / $0.05), 신용카드 없이 월 100크레딧 무료 플랜 포함. 저장된 시트를 GET /view로 다시 읽는 것은 OCR 재실행이 아니라 무과금입니다. 정액 플랜은 월 크레딧 수·시트·저장공간을 추가합니다.

Free
₩0
  • 100 크레딧/월
  • 3 시트
  • 1 GB 저장공간
무료 — 카드 불필요
Starter
₩39,800/월
  • 500 크레딧/월
  • 15 시트
  • 10 GB 저장공간
무료로 시작
가장 인기
Pro
₩69,800/월
  • 1,100 크레딧/월
  • 시트 무제한
  • 100 GB 저장공간
무료로 시작
OCR API 인증은 어떻게 하나요?
요청마다 HTTP Bearer 토큰을 보냅니다 — Authorization: Bearer <key>. 키는 spocr_로 시작합니다. 베이스 URL은 https://api.space-ocr.com 이며 버전 경로는 없습니다. 헤더 누락이나 무효한 키는 401, 그 키의 범위 밖 리소스 요청은 403, 모든 응답에 지원 추적용 X-Request-Id 헤더가 붙습니다.
OCR API는 각 필드에 무엇을 반환하나요?
값은 선언한 스키마 그대로 data.values 에 담깁니다. data.cells 는 같은 경로로 조회되며 box(0–1000 정규화 그리드의 xmin/ymin/xmax/ymax, 픽셀이 아닙니다), 문서 기울기를 따르는 4점 quad, verified(판정 — 지적이 하나라도 서면 false, 대조가 돌고 아무것도 서지 않으면 true, 대조할 대상이 없으면 null), 사유를 담은 review, 그리고 text_match·match_ratio·printed_text 같은 evidence 를 반환합니다. 픽셀 환산 기준은 data.image 입니다.
OCR API로 PDF를 읽을 수 있나요?
공개 API는 래스터 이미지 — JPEG·PNG·GIF·BMP·TIFF·WebP — 를 받으므로, PDF는 페이지 이미지를 보냅니다. 웹 앱은 PDF를 직접 받아 각 페이지를 이미지로 렌더링한 뒤 OCR합니다. 어느 쪽이든 구조화 결과는 같습니다.
OCR API는 대량·배치 작업을 처리하나요?
네. POST /upload는 요청 한 번에 이미지를 최대 20장까지 받아 파일마다 status 'pending'인 작업을 반환합니다. 완료는 HMAC-SHA256 서명 웹훅(X-Spaceocr-Signature)으로 도착하거나 GET /jobs/{jobId}로 폴링할 수 있습니다. POST /ocr/fields는 한 장에 대한 동기 처리로 유지됩니다.
레이트 리밋과 에러 코드가 있나요?
한도는 키당 분당 60회, 계정당 분당 600회입니다. 초과하면 429와 code 'rate_limited'가 반환되고, 대기 초는 Retry-After 헤더로 옵니다(같은 값이 본문 details.retryAfterSec 에도 병기됩니다). 모든 오류는 400·401·402·403·404·413·429·500·502·504에 걸쳐 { error: { code, message, requestId } } 봉투를 공유합니다.
OCR API 비용은 얼마인가요?
이미지당 $0.05(¥10 / ₩100)이며, 신용카드 없이 월 100크레딧 무료 플랜이 있습니다. POST /ocr/fields와 POST /upload의 각 이미지는 1크레딧, GET /space·/view·/amount는 무과금입니다. 정액 플랜(Starter·Pro)은 월 크레딧 수·시트·저장공간을 추가합니다 — 위 요금표를 참고하세요.

확인 가능한 데이터를 돌려주는 OCR 구현

무료 플랜 — 월 100크레딧, 신용카드 불필요. 모든 필드가 박스와 일치 점수와 함께 돌아옵니다.

관련