특화 모델 엔진을 사용하여 의료비영수증의 입력 정보(key-value)를 인식하고 추출합니다.
요청
요청 형식을 설명합니다. 요청 형식은 다음과 같습니다.
| 메서드 | URI | 설명 |
|---|---|---|
| POST | /medical-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.fin-ntruss.com/custom/v1/{DomainId}/{InvokeKey}/document/medical-receipt' \
--header 'Content-Type: application/json' \
--header 'X-OCR-SECRET: {앱 등록 시 발급받은 Secret Key}' \
--data '{
"version": "V2",
"requestId": "string",
"timestamp": 0,
"images": [
{
"format": "png",
"name": "medical_receipt_test",
"data":"{Base64 인코딩된 이미지 데이터}"
}
]
}'
Content-Type: multipart/form-data인 경우
요청 헤더 Content-Type이 multipart/form-data인 경우의 요청 예시는 다음과 같습니다.
curl --location --request POST 'https://cbgrx5natw.apigw.fin-ntruss.com/custom/v1/{DomainId}/{InvokeKey}/document/medical-receipt' \
--header 'Content-Type: application/json' \
--header 'X-OCR-SECRET: {앱 등록 시 발급받은 Secret Key}' \
--form 'message="{\"version\": \"V2\", \"requestId\": \"1234\", \"timestamp\": 0, \"images\": [{\"format\": \"png\", \"name\": \"medical_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 | - | 유효성 검사 결과 세부 메시지
|
medicalReceipt |
Object | - | 의료비영수증 세부 정보 |
medicalReceipt.result |
Object | - | 의료비영수증 OCR 인식 결과 |
medicalReceipt.checksum |
Object | - | 의료비영수증 OCR 금액 인식 결과 |
result
result에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
id |
Integer | - | 셀 ID |
keyTexts |
String | - | “|“ 로 나눠지거나 단일 텍스트로 이루어진 키 값 |
valueText |
String | - | 셀에서 인식된 텍스트 |
confidence |
Float | - | 인식된 텍스트의 신뢰도 |
keyCells |
Array | - | keyCell 상세 정보 |
valueCell |
Array | - | valueCell 상세 정보 |
checksum
checksum에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
sumPaidByPatient |
Checksum | - | 본인부담금 합계 상세 정보 |
sumPaidByInsurer |
Checksum | - | 공단부담금 합계 상세 정보 |
sumPaidByPatientFull |
Checksum | - | 전액본인부담금 합계 상세 정보 |
sumTreatmentCost |
Checksum | - | 선택진료비 합계 상세 정보 |
sumTreatmentCostEtc |
Checksum | - | 선택진료비 외 합계 상세 정보 |
totalAmount |
Checksum | - | 총액 상세 정보 |
totalPaid |
Checksum | - | 환자부담액 상세 정보 |
keyCell
keyCell에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
boundingPoly |
Array | - | boundingPoly 세부 정보 |
depth |
String | - | 키 셀의 뎁스 |
formatted |
String | - | 키 셀의 그라운딩 텍스트 |
group |
String | - | 키 셀의 열/행 구분자 |
value |
String | - | 키 셀의 그라운딩되지 않은 텍스트 |
valueCell
valueCell에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
boundingPoly |
Array | - | boundingPoly 세부 정보 |
confidence |
Float | - | value 셀의 신뢰도 |
value |
String | - | value 셀의 텍스트 |
boundingPoly
boundingPoly에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
vertices |
Array | - | vertices 세부 정보 |
boundingPolyVertices
boundingPolyVertices에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
x |
Float | - | X축 좌표 값 |
y |
Float | - | Y축 좌표 값 |
found
found에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
found |
Boolean | - | Checksum 상세 정보 보유 여부
|
foundValueIds |
Int | - | 발견된 value 셀의 ID 목록 |
foundValueSum |
String | - | 발견된 value 셀의 합계 |
foundTotalIds |
Int | - | 발견된 전체 셀의 ID 목록 |
foundTotalSum |
Int | - | 발견된 전체 값의 합계 |
difference |
Float | - | 값과 전체 셀의 차액 |
응답 예시
응답 예시는 다음과 같습니다.
성공
호출이 성공한 경우의 응답 예시는 다음과 같습니다.
{
"version": "V2",
"requestId": "1234",
"timestamp": 1747728974248,
"images": [
{
"uid": "{uid}",
"name": "medical_receipt_test",
"inferResult": "SUCCESS",
"message": "SUCCESS",
"validationResult": {
"result": "NO_REQUESTED"
},
"medicalReceipt": {
"result": [
{
"id": 60,
"keyTexts": "선택항목|비급여|계",
"valueText": "53435",
"confidence": 0.9542916,
"keyCells": [
{
"boundingPoly": {
"vertices": [
{
"x": 303,
"y": 16
},
{
"x": 596,
"y": 16
},
{
"x": 596,
"y": 33
},
{
"x": 303,
"y": 33
}
]
},
"depth": 1,
"formatted": "선택항목",
"group": "column",
"value": "선택항목"
},
{
"boundingPoly": {
"vertices": [
{
"x": 513,
"y": 34
},
{
"x": 598,
"y": 34
},
{
"x": 598,
"y": 50
},
{
"x": 513,
"y": 50
}
]
},
"depth": 2,
"formatted": "비급여",
"group": "column",
"value": "비급여"
}
],
"valueCell": {
"boundingPoly": {
"vertices": [
{
"x": 513,
"y": 195
},
{
"x": 597,
"y": 195
},
{
"x": 597,
"y": 212
},
{
"x": 513,
"y": 212
}
]
},
"confidence": 0.9542916,
"value": "53435"
}
}
],
"checksum": {
"sumPaidByPatient": {
"found": false,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [],
"foundTotalSum": 0,
"difference": 0
},
"sumPaidByInsurer": {
"found": false,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [],
"foundTotalSum": 0,
"difference": 0
},
"sumPaidByPatientFull": {
"found": false,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [],
"foundTotalSum": 0,
"difference": 0
},
"sumTreatmentCost": {
"found": false,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [],
"foundTotalSum": 0,
"difference": 0
},
"sumTreatmentCostEtc": {
"found": false,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [],
"foundTotalSum": 0,
"difference": 0
},
"totalAmount": {
"found": true,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [
40
],
"foundTotalSum": 1541717,
"difference": 1541717
},
"totalPaid": {
"found": true,
"foundValueIds": [],
"foundValueSum": 0,
"foundTotalIds": [
84
],
"foundTotalSum": 102130,
"difference": 102130
}
}
}
}
]
}
실패
호출이 실패한 경우의 응답 예시는 다음과 같습니다.
{
"version": "V2",
"requestId": "1234",
"timestamp": 1725235840459,
"images": [
{
"uid": "{uid}",
"name": "medical_receipt_test",
"inferResult": "ERROR",
"message": "Read page:0 error.",
"validationResult": {
"result": "NO_REQUESTED"
}
}
]
}