특화 모델 엔진을 사용하여 의료비영수증의 입력 정보(key-value)를 인식하고 추출합니다.
요청
요청 형식을 설명합니다. 요청 형식은 다음과 같습니다.
| 메서드 | URI | 설명 |
|---|---|---|
| POST | /medical-receipt | 의료비영수증 |
요청 헤더
CLOVA OCR API에서 공통으로 사용하는 헤더에 대한 정보는 CLOVA OCR 요청 헤더를 참조해 주십시오.
요청 바디
요청 바디에 대한 설명은 다음과 같습니다.
Content-Type: application/json인 경우
요청 헤더 Content-Type이 application/json인 경우의 요청 바디에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
version |
String | Required | 버전 정보
|
requestId |
String | Required | 임의의 API 호출 UUID |
timestamp |
Integer | Required | 임의의 API 호출 시각(밀리초)
|
images |
Array | Required | images 세부 정보: 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 호출 시각(밀리초)
|
message.images |
Array | Required | images 세부 정보: 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 호출 시각(밀리초)
|
images |
Array | - | images 세부 정보: images |
images
images에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
uid |
String | - | 의료비영수증 이미지 UID
|
name |
String | - | 의료비영수증 이미지 이름
|
inferResult |
String | - | 의료비영수증 이미지 인식 결과
|
message |
String | - | 결과 메시지 |
validationResult |
Object | - | 유효성 검사 결과 정보 |
validationResult.result |
String | - | 유효성 검사 결과 코드
|
validationResult.message |
String | - | 유효성 검사 결과 세부 메시지
|
medicalReceipt |
Object | - | 의료비영수증 세부 정보 |
medicalReceipt.result |
Array | - | 의료비영수증 OCR 인식 결과: result |
medicalReceipt.checksum |
Object | - | 의료비영수증 OCR 금액 인식 결과 |
medicalReceipt.checksum.sumPaidByPatient |
Object | - | 본인부담금 합계 상세 정보
|
medicalReceipt.checksum.sumPaidByInsurer |
Object | - | 공단부담금 합계 상세 정보
|
medicalReceipt.checksum.sumPaidByPatientFull |
Object | - | 전액본인부담금 합계 상세 정보
|
medicalReceipt.checksum.sumTreatmentCost |
Object | - | 선택진료비 합계 상세 정보
|
medicalReceipt.checksum.sumTreatmentCostEtc |
Object | - | 선택진료비 외 합계 상세 정보
|
medicalReceipt.checksum.totalAmount |
Object | - | 총액 상세 정보
|
medicalReceipt.checksum.totalPaid |
Object | - | 환자부담액 상세 정보
|
result
result에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
id |
Integer | - | 셀 ID |
keyTexts |
String | - | “|“ 로 나눠지거나 단일 텍스트로 이루어진 키 값 |
valueText |
String | - | 셀에서 인식된 텍스트 |
confidence |
Float | - | 인식된 텍스트의 신뢰도 |
keyCells |
Array | - | keyCell 상세 정보: keyCells |
valueCell |
Array | - | valueCell 상세 정보: valueCell |
keyCells
keyCells에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
boundingPoly |
Array | - | boundingPoly 세부 정보: boundingPoly |
depth |
String | - | 키 셀의 뎁스 |
formatted |
String | - | 키 셀의 그라운딩 텍스트 |
group |
String | - | 키 셀의 열/행 구분자 |
value |
String | - | 키 셀의 그라운딩되지 않은 텍스트 |
valueCell
valueCell에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
boundingPoly |
Array | - | boundingPoly 세부 정보: boundingPoly |
confidence |
Float | - | value 셀의 신뢰도 |
value |
String | - | value 셀의 텍스트 |
boundingPoly
boundingPoly에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
vertices |
Array | - | vertices 세부 정보: vertices |
vertices
vertices에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
x |
Float | - | X축 좌표 값 |
y |
Float | - | Y축 좌표 값 |
found
found에 대한 설명은 다음과 같습니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
found |
Boolean | - | Checksum 상세 정보 보유 여부
|
foundValueIds |
Integer | - | 발견된 value 셀의 ID 목록 |
foundValueSum |
String | - | 발견된 value 셀의 합계 |
foundTotalIds |
Integer | - | 발견된 전체 셀의 ID 목록 |
foundTotalSum |
Integer | - | 발견된 전체 값의 합계 |
difference |
Float | - | 값과 전체 셀의 차액 |
응답 상태 코드
CLOVA OCR API에서 공통으로 사용하는 응답 상태 코드에 대한 정보는 CLOVA OCR 공통 응답 상태 코드를 참조해 주십시오.
응답 예시
응답 예시는 다음과 같습니다.
성공
호출이 성공한 경우의 응답 예시는 다음과 같습니다.
{
"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"
}
}
]
}