API 요청
/rest/ocr_identi1요청 파라미터 1개 · 필수 1
image응답 필드 13개
datadata.resultdata.result.namedata.result.rrn1data.result.rrn2data.result.datedata.raw_textdata.successapiapi.successapi.costapi.msapi.pl_idOCR(Optical Character Recognition) 주민등록증 사진에서 주요 정보를 텍스트로 추출합니다.
https://apick.app/rest/ocr_identi1왜 주민등록증 텍스트 추출(OCR)인가
가입 화면에서 고객이 주민등록증을 보며 칸마다 직접 입력하다 지치면 그대로 떠납니다. 사진 한 장에서 주요 정보를 텍스트로 꺼내 입력란을 자동으로 채워 가입 단계를 짧게 만듭니다.
REQUEST_TOO_LARGE 오류가 반환되며 과금되지 않습니다.
주민등록증 사진에서 이름, 주민등록번호, 발급일자를 항목별로 뽑아 줍니다. 회원가입·계좌개설 화면의 입력 자동 채움에 씁니다.
이미지를 판독한 호출 한 건당 12P가 차감됩니다. 파일이 없거나 이미지가 아니거나 판독에 실패하면 data.error로 응답하며 과금되지 않습니다.
항목을 찾지 못하면 그 값은 null입니다. 판독이 끝난 호출은 일부 항목이 null이어도 과금되므로, 사용자에게 신분증 전체가 반듯하고 선명하게 나오도록 촬영을 안내하세요. 결과는 사용자가 확인·수정할 수 있게 보여 주는 것을 권장합니다.
/rest/ocr_identi1imagedatadata.resultdata.result.namedata.result.rrn1data.result.rrn2data.result.datedata.raw_textdata.successapiapi.successapi.costapi.msapi.pl_idPOST https://apick.app/rest/ocr_identi1Authorization: Bearer — 내 계정의 API 인증키multipart/form-data상황별로 보내는 값과 응답에서 확인할 값을 모았습니다. 언어 탭에서 그대로 복사해 쓸 수 있습니다.
가입 화면에서 사용자가 촬영한 주민등록증으로 이름·주민등록번호를 채울 때 씁니다.
/rest/ocr_identi1curl --fail-with-body --request POST 'https://apick.app/rest/ocr_identi1' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'image=@./id_card.jpg'import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./id_card.jpg")]), "id_card.jpg");
const response = await fetch("https://apick.app/rest/ocr_identi1", {
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);import os
import requests
parts = [
("image", ("id_card.jpg", open("./id_card.jpg", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/ocr_identi1",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'image' => new CURLFile('./id_card.jpg'),
];
$curl = curl_init('https://apick.app/rest/ocr_identi1');
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);data.result.name·rrn1·rrn2·date를 입력칸에 채우고 사용자가 확인하게 합니다.null인 항목은 data.raw_text를 참고하거나 다시 촬영하도록 안내합니다.스캔본이나 화면 캡처처럼 PNG로 받은 이미지를 그대로 보낼 수 있습니다.
/rest/ocr_identi1curl --fail-with-body --request POST 'https://apick.app/rest/ocr_identi1' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'image=@./id_card_scan.png'import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("image", new Blob([await readFile("./id_card_scan.png")]), "id_card_scan.png");
const response = await fetch("https://apick.app/rest/ocr_identi1", {
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);import os
import requests
parts = [
("image", ("id_card_scan.png", open("./id_card_scan.png", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/ocr_identi1",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120))
response.raise_for_status()
result = response.json()
print(result)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'image' => new CURLFile('./id_card_scan.png'),
];
$curl = curl_init('https://apick.app/rest/ocr_identi1');
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);data.error가 "지원되지 않는 이미지 유형"이면 JPG로 변환해 다시 보냅니다(과금 없음).HTTP 성공과 업무 결과를 구분하세요. 경로별 응답 필드와 예시는 위 요청과 응답에 함께 있습니다.
응답 형식 이 경로는 문자열 data.error로 실패를 전달하며 별도 data.code를 보장하지 않습니다. 파일 형식 오류는 HTTP 400, 첨부 누락·문서 처리 실패는 HTTP 424입니다.
{
"data": {
"result": {
"name": "홍길동",
"rrn1": "900101",
"rrn2": "1234567",
"date": "20230101"
},
"raw_text": "주민등록증\n홍길동(洪吉洞)\n900101-1234567\n서울특별시 중구 세종대로 110\n2023.1.1.\n서울특별시 중구청장",
"success": 1
},
"api": { "success": true, "cost": 12, "ms": 568, "pl_id": 328 }
}
null입니다.YYYYMMDD입니다.null일 때 직접 확인하는 용도로 씁니다.응답을 아래 순서로 확인하세요. 결과 유무와 과금 여부는 서로 다릅니다.
data.error(사유 문구)와 data.success=0을 돌려줍니다. HTTP 상태는 사유에 따라 400·404·408·424 중 하나입니다.api.cost는 0이며 과금되지 않습니다. data.error 문구를 그대로 기록하고 사용자에게 보여 주세요.{
"data": {
"error": "입력값을 확인해 주세요.",
"success": 0
},
"api": {
"success": true,
"cost": 0,
"ms": 5
}
}image 파일이 없습니다.image인지 확인합니다.모든 오류는 과금되지 않습니다.
FORM_DATA_INVALIDFORM_DATA_FIELD_CONFLICTMULTIPART_LIMIT_OR_PARSE_ERROR실제 차감 금액은 응답의 api.cost로 확인하세요. 상세 요금은 요금정책에서 볼 수 있습니다.
같은 요청을 JavaScript와 Python으로 옮긴 예시입니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다.