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

그대로 믿지 않아도 되는 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의 출력을, 검증된 채로 보기

아래 어느 항목이든 마우스를 올려 보세요 — 영수증 위의 박스는 그 값이 페이지에서 실제로 발견된 자리이지, 모델이 주장한 자리가 아닙니다. 여기 있는 값·박스·검증 표시는 모두 실제 파싱 결과에서 읽어온 것으로, 목업이 아닙니다.

Receipts with extracted-field bounding boxes
Verified fields
KINSHO · 合計 2,045
ライフ · 合計 4,286

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/fields`), 레이아웃을 살린 마크다운으로(`POST /ocr/markdown`), 읽기순서를 바로잡은 원문 텍스트로(`POST /ocr/text`) 받을 수 있습니다. 셋 다 `data.values`·`data.cells`·`data.review`·`data.image`라는 같은 봉투로 돌아오므로 검토 화면 하나면 충분합니다. 마크다운은 요소를 기본으로 싣고, `/ocr/text`에서 블록 단위 cells를 받으려면 `includeBlocks: true`를 지정합니다.
좌표는 모델이 만들지 않습니다
값은 모델이 돌려주고, 좌표는 OCR 단계와 그에 대한 문자 대조가 만듭니다. 어느 기전이 박스를 정했는지는 `evidence.source`에 남고, `/ocr/fields`에서는 `evidence.printed_text`가 그 좌표에 인쇄돼 있던 글자를 그대로 돌려주므로 값과의 대조를 직접 할 수 있습니다.
모든 값을 경로로 지정
`data.cells`의 키(`total`, `items[0].amount` 등)는 `data.review.flagged`와 같은 경로 문법입니다. `box`는 0–1000 정규화 격자의 축 정렬 사각형, `quad`는 페이지 기울기를 따라가는 네 점이며, 픽셀 환산의 기준면은 `data.image`의 너비와 높이입니다.
필드를 선언하거나, 모델에 제안시키거나
`name`·`type`·`children`을 갖춘 `fields`를 넘기거나, `autoFields`를 켜서 모델이 구조를 제안하게 합니다. `required`·`pattern`·`min`/`max`·`enum`·`near` 같은 선언은 모델에 전달되지 않고 추출 후에 대조되므로, 위반은 값을 고치는 대신 `review` 사유로 드러납니다. 스칼라 타입을 선언하면 결정론적으로 파싱한 값이 `data.normalized` 층에 따로 붙습니다.
감사 추적: 원본과 수정본
추출은 모델을 지나므로 실행마다 완전히 같지는 않습니다. 기록으로 남길 가치가 있는 것은 응답 JSON입니다. 앱에서 셀을 고치면 그 수정은 원본 OCR 값을 덮어쓰지 않고 옆에 저장되어, 모델이 무엇을 읽었고 사람이 무엇을 바꿨는지 둘 다 남습니다.
품목은 행 단위로 대조
`array` 필드에서는 행마다 경로가 붙고(`items[0].amount`) 행 자체에도 통합 박스가 생깁니다. 같은 값이 반복되는 열은 모델의 토큰 힌트가 가장 덜 미더운 자리라, 엔진은 열 정합과 행 일관성에 기대고 `ambiguous_occurrence` 같은 사유를 세웁니다.
언어 설정 없음
일본어·한국어·중국어·영어를 한 엔진에서, 혼합 표기까지 처리합니다. 공개 API에 언어 파라미터가 없고 문서마다 설정할 것도 없습니다.

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는 래스터 이미지를 직접 받습니다.

필드를 선언하면, 값마다 위치와 검토가 붙어 돌아옵니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 실행 방법

  1. 문서 보내기
    이미지를 /ocr/fields로 보냅니다(imageType은 url 또는 base64). 앱에서는 PDF를 끌어다 놓을 수 있고 각 페이지가 먼저 이미지화됩니다. 공개 API는 래스터 이미지를 받습니다.
  2. 스키마 선언하기
    name·type·children을 갖춘 fields를 넘기거나, autoFields를 켜서 모델이 구조를 제안하게 합니다. 규칙이 필요한 자리에는 required·pattern·min·max·enum·near를 덧붙입니다.
  3. 검증된 결과 읽기
    업무 데이터는 data.values, box·quad·verified·review·evidence는 data.cells[path], 선언한 스칼라 타입의 파싱값은 data.normalized, 픽셀 환산 기준면은 data.image에 있습니다.
  4. 검토 큐 처리하기
    data.review.flagged를 순회하며 reasons[0]을 대표 사유로 쓰고, 그 셀의 box 또는 quad를 사진 위에 겹쳐 값의 출처를 확인할 수 있게 합니다.
  5. 저장하고 조회하기
    POST /create와 POST /upload로 결과를 시트에 남기고, GET /view의 where·sort·select·limit으로 읽어 옵니다. 이 조회는 과금되지 않고 OCR을 다시 돌리지도 않습니다.

단순하고 예측 가능한 가격

1크레딧은 1페이지 처리이고 ₩100(부가세 포함)입니다. 매월 100크레딧은 무료이며 신용카드가 필요 없습니다. 실패는 과금하지 않습니다. 저장된 데이터를 읽는 GET /space·GET /view·GET /jobs는 무료입니다. 정액 플랜은 월 크레딧 수·시트·저장공간을 추가합니다.

Free
₩0
  • 100 크레딧/월
  • 3 시트
  • 1 GB 저장공간
무료 — 카드 불필요
Starter
₩39,800/월
  • 500 크레딧/월
  • 15 시트
  • 10 GB 저장공간
무료로 시작
가장 인기
Pro
₩69,800/월
  • 1,100 크레딧/월
  • 시트 무제한
  • 100 GB 저장공간
무료로 시작
JSON만 돌려주는 모델과 이 AI OCR은 무엇이 다른가요?
구조화는 모델이 하지만 최종 판단은 맡기지 않습니다. 업무 데이터는 data.values로 돌아오고, data.cells[path]에는 그 값이 발견된 box와 quad, 판정 verified, review 사유, 뒷받침하는 evidence가 담깁니다. 사람이 볼 경로는 data.review.flagged에 정리되므로, 모델의 출력을 그대로 받는 대신 검토할 수 있습니다.
좌표는 AI가 돌려주나요?
아니요. 모델이 돌려주는 것은 값뿐입니다. 좌표는 페이지를 읽는 OCR 단계와, 그 검출 문자에 대한 한 자씩의 대조에서 나옵니다. 어느 기전이 박스를 정했는지는 evidence.source에 남고, /ocr/fields에서는 evidence.printed_text가 그 좌표에 인쇄돼 있던 글자를 돌려줍니다.
어떤 값을 믿어도 되는지 어떻게 판단하나요?
고정 점수 대신 data.review.flagged를 읽습니다. 항목마다 path와, 대표 사유가 앞에 오는 reasons 배열이 있고 검토 건수는 flagged.length 그 자체입니다. 그 경로로 data.cells[path]를 열면 판정·좌표·evidence를 볼 수 있습니다. evidence.match_ratio는 문자 커버리지를 알려 주는 보조 증거이지 합격 여부를 정하는 기준이 아닙니다.
AI가 필드를 제안하게 할 수 있나요?
네. autoFields를 켜면 모델이 문서의 스키마를 제안하고, 직접 fields를 선언할 수도 있습니다. 품목에는 children이 있는 array 필드를 씁니다. required·pattern·min·max·enum·near 같은 선언은 모델에 전달되지 않고 추출 후에 대조되므로, 추출값을 바꾸는 대신 검토 사유와 좌표 앵커를 더합니다.
AI의 출력을 고치면 원본 값은 어떻게 되나요?
앱에서의 수정은 원본 OCR 값을 덮어쓰지 않고 그 옆에 저장되어, 모델의 판독과 사람의 수정이 둘 다 기록에 남습니다. 추출은 모델을 지나므로 실행마다 같지 않고, 감사를 위해 남길 가치가 있는 것은 응답 JSON입니다. 결정론적인 부분은 좌표 대조와 normalized 파싱입니다.
비용은 얼마인가요?
1크레딧은 1페이지 처리이고 ₩100(부가세 포함)이며, 매월 100크레딧 무료에 신용카드가 필요 없습니다. 실패는 과금하지 않고, GET /space·GET /view·GET /jobs로 저장된 데이터를 읽는 것도 무료입니다. Starter와 Pro는 월 크레딧 수·시트·저장공간을 추가합니다 — 위 요금표를 참고하세요.

AI를 문서에 쓰되, 그대로 믿지는 않기

무료 플랜 — 월 100크레딧, 신용카드 불필요. 모든 값이 좌표와 검토 판정, 그리고 그 근거와 함께 돌아옵니다.

관련