- 인쇄
- PDF
영수증
- 인쇄
- PDF
Classic/VPC 환경에서 이용 가능합니다.
특화 모델 엔진을 사용하여 영수증의 입력 정보(key-value)를 인식하고 추출합니다.
요청
요청 형식을 설명합니다. 요청 형식은 다음과 같습니다.
메서드 | URI |
---|---|
POST | /receipt |
요청 헤더
CLOVA OCR API에서 공통으로 사용하는 헤더에 대한 정보는 CLOVA OCR 요청 헤더를 참조해 주십시오.
요청 바디
요청 바디에 대한 설명은 다음과 같습니다.
Content-Type: application/json
인 경우
요청 헤더 Content-Type
이 application/json
인 경우의 요청 바디에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
version | String | - | 버전 정보
|
requestId | String | Required | 임의의 API 호출 UUID |
timestamp | Integer | Required | 임의의 API 호출 시각(Timestamp) |
images | Array | Required | images 세부 정보 |
Content-Type: multipart/form-data
인 경우
요청 헤더 Content-Type
이 multipart/form-data
인 경우의 요청 바디에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
message | Object | Required | 요청 데이터 정보 |
message.version | String | Required | 버전 정보
|
message.requestId | String | Required | 임의의 API 호출 UUID |
message.timestamp | Integer | Required | 임의의 API 호출 시각(Timestamp) |
message.images | Array | Required | images 세부 정보 |
file | File | Required | OCR 인식 이미지 파일 |
images
images
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
format | String | Required | 이미지 형식
|
name | String | Required | 임의의 이미지 이름
|
data | String | Required | Base64 인코딩된 이미지 데이터
|
요청 예시
요청 예시는 다음과 같습니다.
Content-Type: application/json
인 경우
요청 헤더 Content-Type
이 application/json
인 경우의 요청 예시는 다음과 같습니다.
curl --location --request POST ''https://cbgrx5natw.apigw.ntruss.com/custom/v1/{DomainId}/{InvokeKey}/document/receipt' \
--header 'Content-Type: application/json' \
--header 'X-OCR-SECRET: {앱 등록 시 발급받은 Secret Key}' \
--data '{
"version": "V2",
"requestId": "4567",
"timestamp": "0",
"images": [
{
"format": "png",
"data": "{Base64 인코딩된 이미지 데이터}",
"name": "receipt_test2"
}]
}'
Content-Type: multipart/form-data
인 경우
요청 헤더 Content-Type
이 multipart/form-data
인 경우의 요청 예시는 다음과 같습니다.
curl --location --request POST ''https://cbgrx5natw.apigw.ntruss.com/custom/v1/{DomainId}/{InvokeKey}/document/receipt' \
--header 'X-OCR-SECRET: {앱 등록 시 발급받은 Secret Key}' \
--header 'Content-Type: multipart/form-data' \
--form 'message="{\"version\": \"V2\", \"requestId\": \"1234\", \"timestamp\": 1724832750462, \"images\": [{\"format\": \"jpg\", \"name\": \"receipt_test\"}]}"' \
--form 'file={file}"'
응답
응답 형식을 설명합니다.
응답 바디
응답 바디에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
version | String | - | 버전 정보
|
requestId | String | - | API 호출 UUID |
timestamp | Integer | - | API 호출 시각(Timestamp) |
images | Array | - | images 세부 정보 |
images
images
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
uid | String | - | 영수증 이미지 UID
|
name | String | - | 영수증 이미지 이름
|
inferResult | String | - | 영수증 이미지 인식 결과
|
message | String | - | 결과 메시지 |
validationResult | Object | - | 유효성 검사 결과 정보 |
validationResult.result | String | - | 유효성 검사 결과 코드
|
validationResult.message | String | - | 유효성 검사 결과 세부 메시지
|
convertedImageInfo | Object | - | 변환 이미지 정보
|
convertedImageInfo.width | Integer | - | 변환 이미지 가로 길이 |
convertedImageInfo.height | Integer | - | 변환 이미지 세로 길이 |
convertedImageInfo.pageIndex | Integer | - | 변환 이미지 페이지 인덱스 |
receipt | Object | - | 영수증 세부 정보 |
receipt.meta | Object | - | 메타 정보 |
receipt.meta.estimatedLanguage | String | - | OCR 추정 언어
|
receipt.result | Object | - | 영수증 OCR 인식 결과 |
result
receipt.result
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
storeInfo | Object | - | 점포 정보 |
storeInfo.name | Object | - | 점포 이름 상세 정보
|
storeInfo.subName | Object | - | 지점 이름 상세 정보
|
storeInfo.bizNum | Object | - | 점포 사업자등록번호 상세 정보
|
storeInfo.movieName | Object | - | 영화표 상세 정보
|
storeInfo.addresses | Array | - | 점포 주소 상세 정보 |
storeInfo.tel | Array | - | 점포 전화번호 상세 정보 |
paymentInfo | Object | - | 결제 정보 |
paymentInfo.date | Object | - | 결제 일자 상세 정보 |
paymentInfo.time | Object | - | 결제 시간 상세 정보 |
paymentInfo.cardInfo | Object | - | 결제 카드 정보 |
paymentInfo.cardInfo.company | Object | - | 카드사 상세 정보
|
paymentInfo.cardInfo.number | Object | - | 카드 번호 상세 정보
|
paymentInfo.confirmNum | Object | - | 승인 번호 상세 정보
|
subResults | Array | - | 상품 그룹 정보 |
totalPrice | Object | - | 총 금액 정보 |
totalPrice.price | Object | - | 총 금액 상세 정보
|
subTotal | Array | - | 총 합계 상세 정보 |
addresses
receipt.result.storeInfo.addresses
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.value | String | - | 인식된 텍스트 값 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
tel
receipt.result.storeInfo.tel
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.value | String | - | 인식된 텍스트 값 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
subResults
receipt.result.subResults
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
items | Array | - | 인식된 상품 상세 정보 |
items
receipt.result.subResults.items
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
name | Object | - | 항목 이름 상세 정보
|
code | Object | - | 항목 코드 상세 정보
|
count | Object | - | 항목 수량 상세 정보
|
price | Object | - | 항목 가격 정보 |
price.price | Object | - | 항목 가격 상세 정보
|
price.unitPrice | Object | - | 항목 단가 상세 정보 |
subTotal
receipt.result.subTotal
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
taxPrice | Array | - | 부과세 상세 정보 |
discountPrice | Array | - | 할인 금액 상세 정보 |
taxPrice
receipt.result.subTotal.taxPrice
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.value | String | - | 인식된 텍스트 값 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
discountPrice
receipt.result.subTotal.discountPrice
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.value | String | - | 인식된 텍스트 값 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
공통 객체 정보
공통 객체에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.value | String | - | 인식된 텍스트 값 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
Base 객체 정보
Base 객체 정보
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
일자 객체 정보
일자 객체에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.year | String | - | 인식된 날짜의 연도(yyyy) |
formatted.month | String | - | 인식된 날짜의 월(MM) |
formatted.day | String | - | 인식된 날짜의 일(dd) |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
시간 객체 정보
시간 객체에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.hour | String | - | 인식된 시간의 시(HH) |
formatted.minute | String | - | 인식된 시간의 분(MM) |
formatted.second | String | - | 인식된 시간의 초(ss) |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
maskingPolys | Array | - | maskingPoly 세부 정보 |
단가 객체 정보
단가 객체에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
text | String | - | 인식된 텍스트 |
formatted | Object | - | 인식된 텍스트 정보 |
formatted.value | String | - | 인식된 텍스트 값 |
keyText | String | - | 인식된 텍스트의 키 값 |
confidenceScore | Float | - | 인식된 텍스트 신뢰도
|
boundingPolys | Array | - | boundingPoly 세부 정보 |
boundingPolys
boundingPolys
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
vertices | Array | - | vertices 세부 정보 |
maskingPolys
maskingPolys
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
vertices | Array | - | vertices 세부 정보 |
boundingPolyVertices
boundingPolyVertices
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
x | Float | - | X축 좌표 값 |
y | Float | - | Y축 좌표 값 |
응답 상태 코드
CLOVA OCR API에서 공통으로 사용하는 응답 상태 코드에 대한 정보는 CLOVA OCR 공통 응답 상태 코드를 참조해 주십시오.
응답 예시
응답 예시는 다음과 같습니다.
성공
호출이 성공한 경우의 응답 예시는 다음과 같습니다.
{
"version": "V2",
"requestId": "1234",
"timestamp": 1724976333747,
"images": [
{
"uid": "{uid}",
"name": "receipt_test",
"inferResult": "SUCCESS",
"message": "SUCCESS",
"validationResult": {
"result": "NO_REQUESTED"
},
"receipt": {
"meta": {
"estimatedLanguage": "ko"
},
"result": {
"storeInfo": {
"name": {
"text": "**마트",
"formatted": {
"value": "**마트"
},
"keyText": "",
"confidenceScore": 0.95703,
"boundingPolys": [
{
"vertices": [
{
"x": 32.0,
"y": 196.0
},
{
"x": 164.0,
"y": 196.0
},
{
"x": 164.0,
"y": 232.0
},
{
"x": 32.0,
"y": 232.0
}
]
}
],
"maskingPolys": []
},
"subName": {
"text": "**점",
"keyText": "",
"confidenceScore": 0.85623,
"boundingPolys": [
{
"vertices": [
{
"x": 164.0,
"y": 196.0
},
{
"x": 263.0,
"y": 196.0
},
{
"x": 263.0,
"y": 232.0
},
{
"x": 164.0,
"y": 232.0
}
]
}
],
"maskingPolys": []
},
"bizNum": {
"text": "***-**-*****",
"formatted": {
"value": "***-**-*****"
},
"keyText": "",
"confidenceScore": 0.93726,
"boundingPolys": [
{
"vertices": [
{
"x": 30.0,
"y": 237.0
},
{
"x": 233.0,
"y": 237.0
},
{
"x": 233.0,
"y": 270.0
},
{
"x": 30.0,
"y": 270.0
}
]
}
],
"maskingPolys": []
},
"addresses": [
{
"text": "서울특별시 ***",
"formatted": {
"value": "경상북도 ***"
},
"keyText": "",
"confidenceScore": 0.94554,
"boundingPolys": [
{
"vertices": [
{
"x": 33.0,
"y": 272.0
},
{
"x": 168.0,
"y": 274.0
},
{
"x": 167.0,
"y": 311.0
},
{
"x": 33.0,
"y": 309.0
}
]
},
],
"maskingPolys": []
}
],
"tel": [
{
"text": "***)***-****",
"formatted": {
"value": "**********"
},
"keyText": "TEL:",
"confidenceScore": 0.90208,
"boundingPolys": [
{
"vertices": [
{
"x": 320.0,
"y": 238.0
},
{
"x": 525.0,
"y": 238.0
},
{
"x": 525.0,
"y": 271.0
},
{
"x": 320.0,
"y": 271.0
}
]
}
]
}
]
},
"paymentInfo": {
"date": {
"text": "2014-01-21 (화)",
"formatted": {
"year": "2014",
"month": "01",
"day": "21"
},
"keyText": "",
"confidenceScore": 0.46487,
"boundingPolys": [
{
"vertices": [
{
"x": 30.0,
"y": 394.0
},
{
"x": 200.0,
"y": 394.0
},
{
"x": 200.0,
"y": 428.0
},
{
"x": 30.0,
"y": 428.0
}
]
},
{
"vertices": [
{
"x": 304.0,
"y": 394.0
},
{
"x": 360.0,
"y": 394.0
},
{
"x": 360.0,
"y": 429.0
},
{
"x": 304.0,
"y": 429.0
}
]
}
],
"maskingPolys": []
},
"time": {
"text": "16:53",
"formatted": {
"hour": "16",
"minute": "53",
"second": "00"
},
"keyText": "",
"confidenceScore": 0.92913,
"boundingPolys": [
{
"vertices": [
{
"x": 210.0,
"y": 394.0
},
{
"x": 304.0,
"y": 394.0
},
{
"x": 304.0,
"y": 429.0
},
{
"x": 210.0,
"y": 429.0
}
]
}
]
},
"cardInfo": {
"company": {
"text": "**카드",
"formatted": {
"value": "**카드"
},
"keyText": "[카드사명]",
"confidenceScore": 0.92768,
"boundingPolys": [
{
"vertices": [
{
"x": 252.0,
"y": 1104.0
},
{
"x": 391.0,
"y": 1104.0
},
{
"x": 391.0,
"y": 1141.0
},
{
"x": 252.0,
"y": 1141.0
}
]
}
],
"maskingPolys": []
},
"number": {
"text": "37L 80-****-",
"formatted": {
"value": "37L 80-****-"
},
"keyText": "[카드번호]",
"confidenceScore": 0.35504,
"boundingPolys": [
{
"vertices": [
{
"x": 227.0,
"y": 1025.0
},
{
"x": 311.0,
"y": 1025.0
},
{
"x": 311.0,
"y": 1063.0
},
{
"x": 227.0,
"y": 1063.0
}
]
},
{
"vertices": [
{
"x": 368.0,
"y": 1030.0
},
{
"x": 491.0,
"y": 1030.0
},
{
"x": 491.0,
"y": 1057.0
},
{
"x": 368.0,
"y": 1057.0
}
]
}
],
"maskingPolys": []
}
},
"confirmNum": {
"text": "2881****",
"keyText": "[승인번호]",
"confidenceScore": 0.97677,
"boundingPolys": [
{
"vertices": [
{
"x": 254.0,
"y": 1224.0
},
{
"x": 394.0,
"y": 1224.0
},
{
"x": 394.0,
"y": 1257.0
},
{
"x": 254.0,
"y": 1257.0
}
]
}
]
}
},
"subResults": [
{
"items": [
{
"name": {
"text": "***)*라면(순한맛",
"formatted": {
"value": "***)*라면(순한맛"
},
"keyText": "",
"confidenceScore": 0.84299,
"boundingPolys": [
{
"vertices": [
{
"x": 32.0,
"y": 470.0
},
{
"x": 360.0,
"y": 470.0
},
{
"x": 360.0,
"y": 508.0
},
{
"x": 32.0,
"y": 508.0
}
]
}
],
"maskingPolys": []
},
"count": {
"text": "2개",
"formatted": {
"value": "2"
},
"keyText": "",
"confidenceScore": 0.94584,
"boundingPolys": [
{
"vertices": [
{
"x": 268.0,
"y": 511.0
},
{
"x": 328.0,
"y": 511.0
},
{
"x": 328.0,
"y": 547.0
},
{
"x": 268.0,
"y": 547.0
}
]
}
]
},
"price": {
"price": {
"text": "1,600",
"formatted": {
"value": "1600"
},
"keyText": "",
"confidenceScore": 0.95924,
"boundingPolys": [
{
"vertices": [
{
"x": 596.0,
"y": 514.0
},
{
"x": 685.0,
"y": 514.0
},
{
"x": 685.0,
"y": 549.0
},
{
"x": 596.0,
"y": 549.0
}
]
}
]
},
"unitPrice": {
"text": "800",
"formatted": {
"value": "800"
},
"keyText": "",
"confidenceScore": 0.78166,
"boundingPolys": [
{
"vertices": [
{
"x": 27.0,
"y": 513.0
},
{
"x": 90.0,
"y": 513.0
},
{
"x": 90.0,
"y": 547.0
},
{
"x": 27.0,
"y": 547.0
}
]
}
]
}
}
}
]
}
],
"totalPrice": {
"price": {
"text": "1,600",
"formatted": {
"value": "1600"
},
"keyText": "받을금액:",
"confidenceScore": 0.89884,
"boundingPolys": [
{
"vertices": [
{
"x": 521.0,
"y": 751.0
},
{
"x": 678.0,
"y": 751.0
},
{
"x": 678.0,
"y": 786.0
},
{
"x": 521.0,
"y": 786.0
}
]
}
]
}
},
"subTotal": [
{
"taxPrice": [
{
"text": "145",
"formatted": {
"value": "145"
},
"keyText": "부 가 세:",
"confidenceScore": 0.93311,
"boundingPolys": [
{
"vertices": [
{
"x": 626.0,
"y": 631.0
},
{
"x": 683.0,
"y": 631.0
},
{
"x": 683.0,
"y": 667.0
},
{
"x": 626.0,
"y": 667.0
}
]
}
]
}
]
}
]
}
}
}
]
}
실패
호출이 실패한 경우의 응답 예시는 다음과 같습니다.
{
"version": "V2",
"requestId": "4567",
"timestamp": 1725003278037,
"images": [
{
"uid": "{uid}",
"name": "receipt_test2",
"inferResult": "ERROR",
"message": "Read page:0 error.",
"validationResult": {
"result": "NO_REQUESTED"
}
}
]
}