# 운전면허증 텍스트 추출(OCR)



OCR(Optical Character Recognition) 운전면허증 사진에서 주요 정보를 텍스트로 추출합니다.



인증: Authorization: Bearer $APICK_API_KEY

본문 있는 REST 요청: multipart/form-data. GET 본문 및 MCP JSON-RPC 규격은 해당 명세를 따릅니다.

인증키는 서버에 보관하세요. 모든 예제는 정적 자료입니다.



## POST /rest/ocr_identi2 응답 필드

- `data` (object): 요청 처리 결과 묶음입니다. 조회한 값·작업 상태·오류 설명이 이 안에 들어 있으며, 실제 하위 필드 구성은 서비스마다 다릅니다. 값이 없으면 null·빈 배열·필드 생략 중 해당 서비스의 규칙을 따릅니다.

- `data.result` (object): 조회 결과 본문입니다. 서비스가 찾은 실제 데이터가 들어 있으며, 자료가 없거나 조회에 실패하면 null이거나 필드가 생략됩니다.

- `data.result.name` (string): 이름입니다. 찾지 못하면 null입니다. 문자열로 오며, 값이 없으면 빈 문자열이거나 필드가 생략됩니다. 같은 응답의 다른 필드와 함께 해석하세요. null 허용.

- `data.result.birth_y` (string): 신분증에서 읽은 생년월일의 연도(4자리)입니다. 예: 1990. 월·일과 합쳐 실제 생년월일을 구성합니다.

- `data.result.birth_m` (string): 신분증에서 읽은 생년월일의 월(2자리)입니다. 예: 01, 12. 앞자리 0이 유지됩니다.

- `data.result.birth_d` (string): 신분증에서 읽은 생년월일의 일(2자리)입니다. 예: 01, 31. 앞자리 0이 유지됩니다.

- `data.result.rrn1` (string): 주민등록번호 앞 6자리(생년월일)입니다. OCR이 읽은 값을 그대로 반환하며, 문서가 훼손되면 일부가 비어 있을 수 있습니다.

- `data.result.rrn2` (string): 주민등록번호 뒤 7자리입니다. 성별·지역 코드가 포함되며, 마스킹된 문서에서는 일부가 가려져 있을 수 있습니다.

- `data.result.licen_no0` (string): 운전면허번호를 4구획으로 나눈 첫 번째 구획입니다. 보통 지역·연도를 나타내는 2자리 숫자입니다.

- `data.result.licen_no1` (string): 운전면허번호의 두 번째 구획입니다. 면허 종류·발급 연도에 따라 2자리 숫자로 옵니다.

- `data.result.licen_no2` (string): 운전면허번호의 세 번째 구획입니다. 일련번호 중간 6자리이며, 문서 판독 상태에 따라 일부가 비어 있을 수 있습니다.

- `data.result.licen_no3` (string): 운전면허번호의 네 번째 구획입니다. 마지막 2자리 검증 번호로, 앞 구획과 합쳐 전체 면허번호를 구성합니다.

- `data.result.ghost_num` (string): 문서 하단에 인쇄된 식별번호(유령번호)입니다. 위·변조 확인이나 문서 종류 판별에 사용하며, 판독하지 못하면 빈 값입니다.

- `data.raw_text` (string): 이미지에서 읽은 전체 텍스트입니다. 항목이 null일 때 직접 확인하는 용도로 씁니다.

- `data.success` (integer): 업무 처리 결과 코드입니다. 1은 정상 결과, 0은 실패 또는 무료 응답입니다. 서비스에 따라 2·3처럼 추가 코드를 쓰므로 같은 응답의 status·msg·error 필드도 함께 확인하세요.

- `api` (object): API 호출 메타데이터입니다. 이번 요청의 서버 처리 성공 여부(api.success), 실제 차감 포인트(api.cost), 결제 기록 ID(api.pl_id)를 담습니다. 처리 시간(api.ms)은 응답에 포함된 경우에만 제공됩니다. 업무 결과는 data에서 확인합니다.

- `api.success` (boolean): API 서버가 이번 요청을 정상 처리했는지 여부입니다. true여도 업무 결과가 실패일 수 있으므로 data.success·data.status와 함께 판단합니다. 인증 실패·잘못된 입력·서버 오류 응답에서는 false입니다.

- `api.cost` (integer): 이번 호출에서 실제로 차감된 포인트입니다. 유료 성공 응답에서만 단가만큼 차감되며, 실패·무료 조회·같은 요청의 멱등 재전송은 0입니다. 화면의 표시 단가와 실제 차감액이 다를 수 있으므로 정산은 이 값을 기준으로 합니다.

- `api.ms` (integer): 서버가 요청을 받아 응답 본문을 만들기까지 걸린 처리 시간(밀리초)입니다. 네트워크 왕복 시간과 클라이언트 대기 시간은 포함되지 않습니다.

- `api.pl_id` (integer): 포인트 차감 기록 ID입니다. 차감이 발생한 호출에만 값이 있으며, 과금 내역을 문의할 때 이 번호를 사용합니다. 무과금 응답은 -1·null이거나 필드가 생략됩니다.

## API 요청: POST /rest/ocr_identi2



### 입력

- `image` (file, 필수): 분석할 이미지 파일입니다. JPG·PNG·WEBP를 지원하며, 파일 크기·해상도 제한은 요청 표를 확인하세요.



### 응답 명세

```json

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "result": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "이름입니다. 찾지 못하면 null입니다.",
              "nullable": true
            },
            "birth_y": {
              "type": "string",
              "description": "생년월일의 연도(4자리)입니다."
            },
            "birth_m": {
              "type": "string",
              "description": "생년월일의 월(2자리)입니다."
            },
            "birth_d": {
              "type": "string",
              "description": "생년월일의 일(2자리)입니다."
            },
            "rrn1": {
              "type": "string",
              "description": "주민등록번호 앞 6자리입니다."
            },
            "rrn2": {
              "type": "string",
              "description": "주민등록번호 뒤 7자리입니다."
            },
            "licen_no0": {
              "type": "string",
              "description": "면허번호 첫째 묶음(지역 번호 2자리)입니다. 예: 11-23-123456-01이면 11."
            },
            "licen_no1": {
              "type": "string",
              "description": "면허번호 둘째 묶음(2자리)입니다."
            },
            "licen_no2": {
              "type": "string",
              "description": "면허번호 셋째 묶음(6자리)입니다."
            },
            "licen_no3": {
              "type": "string",
              "description": "면허번호 넷째 묶음(2자리)입니다."
            },
            "ghost_num": {
              "type": "string",
              "description": "면허증 사진 아래의 암호일련번호(영문·숫자 6자리 내외)입니다. 운전면허 진위확인에 함께 씁니다."
            }
          }
        },
        "raw_text": {
          "type": "string",
          "description": "이미지에서 읽은 전체 텍스트입니다. 항목이 null일 때 직접 확인하는 용도로 씁니다."
        },
        "success": {
          "type": "integer",
          "description": "1이면 판독 성공(과금)입니다."
        }
      }
    },
    "api": {
      "type": "object",
      "properties": {
        "success": {
          "type": "boolean"
        },
        "cost": {
          "type": "integer",
          "description": "차감된 포인트입니다. 실패하면 0입니다."
        },
        "ms": {
          "type": "integer"
        },
        "pl_id": {
          "type": "integer"
        }
      }
    }
  }
}

```

### 정적 응답 예시

```json

{
  "data": {
    "result": {
      "name": "홍길동",
      "birth_y": "1990",
      "birth_m": "01",
      "birth_d": "01",
      "rrn1": "900101",
      "rrn2": "1234567",
      "licen_no0": "11",
      "licen_no1": "23",
      "licen_no2": "123456",
      "licen_no3": "01",
      "ghost_num": "A1B2C3"
    },
    "raw_text": "자동차운전면허증\n11-23-123456-01\n홍길동\n900101-1234567\n…",
    "success": 1
  },
  "api": {
    "success": true,
    "cost": 12,
    "ms": 729,
    "pl_id": 329
  }
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/ocr_identi2' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form 'image=@./driver_license.jpg'

```

### Node.js (서버 ESM)

```javascript

import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./driver_license.jpg")]), "driver_license.jpg");
const response = await fetch("https://apick.app/rest/ocr_identi2", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const result = await response.json();
console.log(result);

```

### python

```python

import os
import requests
parts = [
    ("image", ("driver_license.jpg", open("./driver_license.jpg", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/ocr_identi2",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    'image' => new CURLFile('./driver_license.jpg'),
];
$curl = curl_init('https://apick.app/rest/ocr_identi2');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
print_r($result);

```

## 사용 예시 1. 운전면허증 정보 자동 입력

렌터카·차량 공유 가입에서 면허번호와 생년월일을 채울 때 씁니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/ocr_identi2' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form 'image=@./driver_license.jpg'

```

- 면허번호는 `licen_no0`~`licen_no3`을 하이픈으로 이어 `11-23-123456-01` 형식으로 만듭니다.

- `data.result.ghost_num`(암호일련번호)은 운전면허 진위확인 요청에 함께 씁니다.

## 사용 예시 2. 판독 결과 검증 후 재촬영 안내

빛 반사나 흔들림으로 일부 항목을 못 읽는 경우를 처리합니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/ocr_identi2' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form 'image=@./driver_license_retry.jpg'

```

- `licen_no2`가 6자리가 아니거나 `null`이면 사용자에게 다시 촬영하도록 안내합니다.

- 판독이 끝난 호출은 일부 항목이 `null`이어도 과금되므로 촬영 화면에서 반사를 줄이도록 안내하세요.

## 코드·오류

### 업무 실패 응답

입력 오류·대상 없음·일시 실패는 data.error(사유)와 data.success=0으로 오며 api.cost는 0(과금 없음)입니다. HTTP 상태는 400·404·408·424 중 하나입니다. 입력 오류는 값을 고쳐 다시 요청하고, 408·424는 잠시 후 한 번 다시 시도하세요.

```json

{
  "data": {
    "error": "입력값을 확인해 주세요.",
    "success": 0
  },
  "api": {
    "success": true,
    "cost": 0,
    "ms": 5
  }
}

```

## 상세 기능·요금

업로드 용량 제한: 50MB 첨부 이미지 합계는 최대 50MB입니다. 서버가 판독 가능한 크기로 최적화하며, 지나치게 큰 해상도는 정확도를 높이지 않고 처리시간만 늘릴 수 있습니다. 제한을 초과하면 HTTP 413과 REQUEST_TOO_LARGE 오류가 반환되며 과금되지 않습니다. 이용 전 확인 운전면허증 사진에서 이름, 생년월일, 주민등록번호, 면허번호, 암호일련번호를 항목별로 뽑아 줍니다. 렌터카·차량 공유 가입 시 면허 정보 입력 자동 채움에 씁니다. 이미지를 판독한 호출 한 건당 12P가 차감됩니다. 파일이 없거나 이미지가 아니거나 판독에 실패하면 data.error로 응답하며 과금되지 않습니다. 항목을 찾지 못하면 그 값은 null입니다. 판독이 끝난 호출은 일부 항목이 null이어도 과금되므로, 사용자에게 운전면허증 전체가 반듯하고 선명하게 나오도록 촬영을 안내하세요. 결과는 사용자가 확인·수정할 수 있게 보여 주는 것을 권장합니다.

## 상세 요청

항목설정 메서드·주소POST https://apick.app/rest/ocr_identi2 인증 헤더Authorization: Bearer — 내 계정의 API 인증키 본문 형식multipart/form-data 요청 예시 form-data 전체 예제 보기

## 상세 응답

필드타입설명 data.result.namestring이름입니다. 찾지 못하면 null입니다. data.result.birth_ystring생년월일의 연도(4자리)입니다. data.result.birth_mstring생년월일의 월(2자리)입니다. data.result.birth_dstring생년월일의 일(2자리)입니다. data.result.rrn1string주민등록번호 앞 6자리입니다. data.result.rrn2string주민등록번호 뒤 7자리입니다. data.result.licen_no0string면허번호 첫째 묶음(지역 번호 2자리)입니다. 예: 11-23-123456-01이면 11. data.result.licen_no1string면허번호 둘째 묶음(2자리)입니다. data.result.licen_no2string면허번호 셋째 묶음(6자리)입니다. data.result.licen_no3string면허번호 넷째 묶음(2자리)입니다. data.result.ghost_numstring면허증 사진 아래의 암호일련번호(영문·숫자 6자리 내외)입니다. 운전면허 진위확인에 함께 씁니다. data.raw_textstring이미지에서 읽은 전체 텍스트입니다. 항목이 null일 때 직접 확인하는 용도로 씁니다. data.successinteger1이면 판독 성공(과금)입니다. api.costinteger차감된 포인트입니다. 실패하면 0입니다. { "data": { "result": { "name": "홍길동", "birth_y": "1990", "birth_m": "01", "birth_d": "01", "rrn1": "900101", "rrn2": "1234567", "licen_no0": "11", "licen_no1": "23", "licen_no2": "123456", "licen_no3": "01", "ghost_num": "A1B2C3" }, "raw_text": "자동차운전면허증\n11-23-123456-01\n홍길동\n900101-1234567\n…", "success": 1 }, "api": { "success": true, "cost": 12, "ms": 729, "pl_id": 329 } }

## 상세 코드·정책

오류 코드 data.error의미대처 첨부파일이 없습니다.image 파일이 없습니다.파일 필드 이름이 image인지 확인합니다. 파일 유형이 맞지 않습니다. 이미지 형식의 파일만 허용됩니다.이미지가 아닌 파일입니다.JPG·PNG 이미지로 보냅니다. 지원되지 않는 이미지 유형입니다. JPG 형태로 변환하여 재시도 해주세요.읽을 수 없는 이미지 형식입니다.JPG로 변환해 다시 보냅니다. 알 수 없는 이유로 실패했습니다.일시적인 실패입니다.잠시 후 다시 요청합니다. 모든 오류는 과금되지 않습니다.

## 상세 예제

호출 예시 같은 요청을 JavaScript와 Python으로 옮긴 예시입니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다. JavaScript 예시 form-data 전체 예제 보기 Python 예시 form-data 전체 예제 보기
