그대로 믿지 않아도 되는 AI OCR
space-ocr는 모델로 문서를 구조화한 뒤 값마다 페이지의 OCR 검출 문자와 대조합니다. data.cells[path]에 box·quad·verified·review가 담기고, 검토 대상은 data.review.flagged에 정리됩니다.
AI OCR은 지저분한 문서에 대한 답처럼 들립니다. 영수증이나 세금계산서를 모델에 건네면 깔끔한 구조화 필드가 돌아온다는 거죠. 문제는 모델이 틀렸을 때입니다. 언어 모델은 실제로 페이지에서 읽었든 아니든 자신 있고 잘 정돈된 값을 돌려주고, 대부분의 도구는 그 차이를 가려낼 방법 없이 그 값을 그대로 건네줍니다.
space-ocr는 역할을 나눕니다. 구조화는 멀티모달 모델이 맡지만 모델은 좌표를 만들지 않습니다. 좌표의 출처는 페이지를 읽는 OCR 단계 하나뿐입니다. 추출된 값은 그 OCR이 검출한 문자와 한 자씩 대조됩니다. 응답도 같은 방식으로 나뉩니다. 업무 데이터는 선언한 스키마 그대로 data.values에, 같은 경로의 box·quad·판정 verified·review 사유·뒷받침하는 evidence는 data.cells[path]에 담깁니다. 내부에서 어떤 OCR·모델 구현이 도는지는 바뀔 수 있는 구현 세부이고, 고정해 두는 것은 응답 구조입니다.
AI의 출력을, 검증된 채로 보기
아래 어느 항목이든 마우스를 올려 보세요 — 영수증 위의 박스는 그 값이 페이지에서 실제로 발견된 자리이지, 모델이 주장한 자리가 아닙니다. 여기 있는 값·박스·검증 표시는 모두 실제 파싱 결과에서 읽어온 것으로, 목업이 아닙니다.

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.
space-ocr의 AI OCR 작동 방식
POST /ocr/fields에 이미지를 보냅니다(imageType은 url 또는 base64). 먼저 OCR 단계가 페이지를 읽고, 이 단계가 좌표의 유일한 출처입니다. 멀티모달 모델은 선언한 스키마에 맞춰 문서를 읽고 값만 돌려줍니다. 그 값을 검출된 문자와 한 자씩 대조한 결과가 data.cells[path]의 box·quad·evidence입니다.
verified는 문자 점수가 아니라 판정입니다. 사유의 종류를 가리지 않고 review가 서면 false, 대조가 돌고 아무것도 서지 않으면 true, 대조할 대상이 없으면 null이 됩니다. 문자 일치 자체는 evidence.text_match에 있습니다. 그래서 verified: false와 text_match: true가 함께 서는 것은 모순이 아니라 "글자는 맞았지만 선언한 규칙이 잡았다"는 정상 조합입니다.
이렇게 조용히 지나갈 뻔한 불일치가 드러나지만, 모든 오류를 잡는다고 약속하지는 않습니다. 모델과 OCR 단계가 독립적이어도 같은 오독에 합의할 수 있습니다. 좌표는 값이 어디서 왔는지에 대한 증거이지 값이 옳다는 증명이 아니므로, 업무 규칙 검증은 뒤단에 그대로 두시기 바랍니다.
스키마를 쓸 필요는 없습니다. fields를 선언하거나, autoFields를 켜서 모델이 구조를 제안하게 하세요. 웹 앱은 PDF를 페이지 단위로 이미지화한 뒤 읽고, 공개 API는 래스터 이미지를 직접 받습니다.
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/receipt.jpg",
"imageType": "url",
"fields": [
{ "name": "store_name", "type": "string", "required": true },
{ "name": "date", "type": "date", "required": true },
{ "name": "total", "type": "number", "required": true, "min": 0 },
{
"name": "items",
"type": "array",
"children": [
{ "name": "name", "type": "string" },
{ "name": "amount", "type": "number" }
]
}
]
}'검증할 수 있는 AI OCR 실행 방법
- 문서 보내기이미지를 /ocr/fields로 보냅니다(imageType은 url 또는 base64). 앱에서는 PDF를 끌어다 놓을 수 있고 각 페이지가 먼저 이미지화됩니다. 공개 API는 래스터 이미지를 받습니다.
- 스키마 선언하기name·type·children을 갖춘 fields를 넘기거나, autoFields를 켜서 모델이 구조를 제안하게 합니다. 규칙이 필요한 자리에는 required·pattern·min·max·enum·near를 덧붙입니다.
- 검증된 결과 읽기업무 데이터는 data.values, box·quad·verified·review·evidence는 data.cells[path], 선언한 스칼라 타입의 파싱값은 data.normalized, 픽셀 환산 기준면은 data.image에 있습니다.
- 검토 큐 처리하기data.review.flagged를 순회하며 reasons[0]을 대표 사유로 쓰고, 그 셀의 box 또는 quad를 사진 위에 겹쳐 값의 출처를 확인할 수 있게 합니다.
- 저장하고 조회하기POST /create와 POST /upload로 결과를 시트에 남기고, GET /view의 where·sort·select·limit으로 읽어 옵니다. 이 조회는 과금되지 않고 OCR을 다시 돌리지도 않습니다.
단순하고 예측 가능한 가격
1크레딧은 1페이지 처리이고 ₩100(부가세 포함)입니다. 매월 100크레딧은 무료이며 신용카드가 필요 없습니다. 실패는 과금하지 않습니다. 저장된 데이터를 읽는 GET /space·GET /view·GET /jobs는 무료입니다. 정액 플랜은 월 크레딧 수·시트·저장공간을 추가합니다.
JSON만 돌려주는 모델과 이 AI OCR은 무엇이 다른가요?
좌표는 AI가 돌려주나요?
어떤 값을 믿어도 되는지 어떻게 판단하나요?
AI가 필드를 제안하게 할 수 있나요?
AI의 출력을 고치면 원본 값은 어떻게 되나요?
비용은 얼마인가요?
AI를 문서에 쓰되, 그대로 믿지는 않기
무료 플랜 — 월 100크레딧, 신용카드 불필요. 모든 값이 좌표와 검토 판정, 그리고 그 근거와 함께 돌아옵니다.