완성된 화면을 그대로 쓰기
저희가 만든 웹 화면 주소를 받아 쓰시는 방법입니다. 담당자분이 브라우저에서 사진을 올리면 결과가 나오고, 내려받아 쓰시면 됩니다.
- 이럴 때 맞습니다
- 당장 몇 명이 쓰면 되는 경우 · 기존 시스템을 건드릴 수 없는 경우
- 준비하실 것
- 인터넷이 되는 PC 한 대
증명사진 생성과 자동 양식 인식을 외부 서비스에서 그대로 부를 수 있습니다. 개발자가 있는 경우의 명세와, 개발 인력이 없는 경우의 대안을 함께 담았습니다.
https://moriahai.com/api/public/v1모리아AI 파트너 API는 증명사진 생성과 자동 양식 인식을 외부 서비스·기관 시스템에서 직접 부를 수 있게 연 통로입니다. 현장 키오스크가 쓰는 것과 같은 코드를 쓰므로 결과물이 갈라지지 않습니다.
화면을 새로 만들지 않아도 됩니다. 이미 쓰고 계신 시스템에서 사진이나 서류를 보내면, 결과를 받아 그대로 띄우거나 저장하시면 됩니다.
답에 따라 준비할 것이 완전히 달라집니다. 해당하는 쪽만 읽으시면 됩니다.
평범한 REST 호출입니다. 별도 SDK 없이 HTTP 요청을 보낼 수 있는 언어면 무엇이든 됩니다. 키 하나를 헤더에 넣으면 인증이 끝나고, 결과가 나올 때까지 기다리는 방식이라 콜백·웹훅 설정이 없습니다.
→ 인증부터 보기그래도 쓰실 수 있습니다. API 를 직접 부르지 않고 쓰는 길이 세 가지 있습니다. 어느 쪽이 맞는지는 지금 쓰고 계신 시스템에 따라 달라 상담에서 함께 정합니다.
→ 세 가지 방법 보기어느 쪽을 고르시든 순서는 같습니다. 다른 것은 3단계를 누가 하느냐입니다.
API 를 직접 부르지 않고도 같은 기능을 쓰실 수 있습니다. 세 가지 중 지금 환경에 맞는 쪽을 상담에서 함께 고릅니다.
저희가 만든 웹 화면 주소를 받아 쓰시는 방법입니다. 담당자분이 브라우저에서 사진을 올리면 결과가 나오고, 내려받아 쓰시면 됩니다.
이미 운영 중인 홈페이지나 내부 시스템에 버튼 하나를 넣는 방식입니다. 그 시스템을 만든 업체나 저희가 작업합니다.
메일이나 폼으로 들어온 파일을 자동으로 보내 결과를 받는 방식입니다. 코드를 쓰지 않고 화면에서 블록을 잇는 도구를 씁니다.
발급받은 키를 헤더에 넣습니다. 두 가지 형태 중 편한 쪽을 쓰시면 되고, 둘 다 같게 동작합니다.
x-api-key: mrai_xxxxxxxxxxxx_xxxxxxxx...
# 또는
Authorization: Bearer mrai_xxxxxxxxxxxx_xxxxxxxx...키마다 쓸 수 있는 기능이 정해져 있습니다. 열어 주지 않은 기능을 부르면 403 SCOPE_NOT_GRANTED 로 막힙니다.
| 엔드포인트 | 하는 일 | 필요 권한 |
|---|---|---|
GET/health | 연결 점검 키 상태·사용 가능한 기능·남은 횟수를 확인합니다. 횟수가 줄지 않습니다. | 권한 무관 |
POST/id-photo | 증명사진 생성 사진 한 장을 규격 증명사진(600×800)으로 만듭니다. | id-photo |
GET/id-photo/backgrounds | 배경 목록 고를 수 있는 배경 이름과 색을 내려줍니다. | id-photo |
POST/smart-form | 자동 양식 인식 서류 사진에서 항목과 표를 구조 그대로 읽어 냅니다. | smart-form |
기능을 붙이기 전에 이 호출로 키와 통신을 확인하세요. 아무것도 실행하지 않아 사용 횟수가 줄지 않습니다. 남은 횟수도 여기서 볼 수 있습니다.
curl -H "x-api-key: $MORIAH_API_KEY" \
https://moriahai.com/api/public/v1/health{
"ok": true,
"partner": { "id": "acme", "name": "에이스" },
"scopes": ["id-photo", "smart-form"],
"quota": { "unlimited": false, "limit": 5000,
"used": 873, "remaining": 4127 }
}파일을 그대로 올리거나(multipart) base64 로 넣어(JSON) 보냅니다. 사진은 10MB 이하, jpeg·png·webp·heic 를 받습니다.
curl -X POST https://moriahai.com/api/public/v1/id-photo \
-H "x-api-key: $MORIAH_API_KEY" \
-F "image=@photo.jpg" \
-F "background=white" \
-F "gender=auto" \
-F "retouch=light"{
"ok": true,
"requestId": "3f2b1c...",
"image": { "base64": "...", "mimeType": "image/jpeg",
"width": 600, "height": 800, "byteLength": 148213 },
"meta": { "gender": "auto", "retouch": "light",
"cropped": true, "latencyMs": 21458 }
}image | 사진 파일 또는 base64. 필수. |
background | 배경 이름. 목록은 /id-photo/backgrounds 에서 받습니다. |
backgroundColor | #RRGGBB 로 색을 직접 지정. background 대신 씁니다. |
gender | auto · male · female. 복장을 정합니다. 기본 auto. |
retouch | light · medium · strong. 보정 정도. 기본 light. |
crop | 규격(600×800)으로 자를지. 기본 true. |
format | binary 를 주면 JSON 대신 이미지 바이트가 그대로 옵니다. |
meta.cropped 를 false 로 둡니다. 규격이 꼭 필요하시면 이 값을 확인하고 직접 3:4 로 자르시면 됩니다.서류 사진에서 제목·기본 정보·표를 구조 그대로 뽑아냅니다. 이력서·신청서처럼 칸이 정해진 문서에 맞습니다.
curl -X POST https://moriahai.com/api/public/v1/smart-form \
-H "x-api-key: $MORIAH_API_KEY" \
-F "image=@document.jpg"{
"ok": true,
"document": {
"title": "이력서",
"basicInfo": { "name": "홍길동", "birthDate": "1990-01-01",
"phone": "010-0000-0000", "email": "...",
"address": "...", "gender": "..." },
"blocks": [
{ "type": "fields", ... },
{ "type": "table", ... },
{ "type": "paragraph", ... }
],
"warnings": []
},
"meta": { "blockCount": 6, "latencyMs": 8342 }
}blocks 는 문서에 나온 순서 그대로입니다. 화면에 그대로 그리거나 필요한 값만 골라 쓰시면 됩니다.
오류는 모두 같은 모양입니다. HTTP 상태가 아니라 code 로 갈라 처리하세요.
{ "ok": false, "requestId": "3f2b1c...",
"code": "IMAGE_TOO_LARGE", "message": "..." }| HTTP | code | 뜻 |
|---|---|---|
| 401 | API_KEY_REQUIRED | 키 헤더가 없습니다 |
| 401 | API_KEY_INVALID | 키가 없거나 틀렸습니다 |
| 401 | API_KEY_EXPIRED | 만료된 키입니다 |
| 401 | API_KEY_REVOKED | 폐기된 키입니다. 되살릴 수 없습니다 |
| 403 | API_KEY_PAUSED | 일시 중지된 키입니다. 문의하시면 재개됩니다 |
| 403 | SCOPE_NOT_GRANTED | 이 키에 해당 기능 권한이 없습니다 |
| 400 | IMAGE_REQUIRED | 이미지가 비어 있습니다 |
| 400 | IMAGE_TOO_LARGE | 10MB를 넘었습니다 |
| 400 | UNSUPPORTED_IMAGE_TYPE | jpeg·png·webp·heic 가 아닙니다 |
| 400 | UNKNOWN_BACKGROUND | background 이름이 목록에 없습니다 |
| 400 | INVALID_BACKGROUND_COLOR | #RRGGBB 형식이 아닙니다 |
| 400 | INVALID_GENDER | auto·male·female 이 아닙니다 |
| 429 | RATE_LIMITED | 시간당 한도 초과. Retry-After 초 뒤 재시도 |
| 429 | QUOTA_EXCEEDED | 사용 횟수 소진. 충전해야 열립니다 |
| 502 | GENERATION_FAILED | 모델이 이미지를 내주지 못했습니다 |
| 502 | RECOGNITION_FAILED | 문서를 읽지 못했습니다. 다시 촬영이 필요합니다 |
| 502 | DOCUMENT_TOO_LONG | 내용이 많아 결과가 잘렸습니다. 페이지를 나눠 보내세요 |
| 503 | UPSTREAM_BUSY | 처리량이 몰렸습니다. 잠시 후 재시도 |
RATE_LIMITED 는 Retry-After 초 뒤 재시도. QUOTA_EXCEEDED 는 기다려도 풀리지 않고 충전해야 합니다.API_KEY_INVALID 는 「그런 키가 없다」와 「키는 있는데 값이 틀렸다」를 구분하지 않습니다. 구분해 주면 키를 추측하는 쪽에 힌트가 되기 때문입니다.
계약으로 정한 총 사용 횟수가 있습니다. 성공한 호출만 차감하며, 모델이 실패한 건은 횟수를 쓰지 않습니다.
X-Quota-Limit: 5000
X-Quota-Remaining: 4127
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58QUOTA_EXCEEDED 로 기능 호출이 막힙니다.X-Quota-* 헤더가 붙지 않습니다.X-Quota-* 헤더를 읽을 수 없습니다. 대신 연결 점검 응답의 quota 를 쓰세요 — 횟수가 줄지 않습니다.결과가 나올 때까지 기다리는 방식이라 타임아웃을 넉넉히 잡아야 합니다. 증명사진은 200초를 권합니다.
const form = new FormData();
form.append("image", new Blob([buffer], { type: "image/jpeg" }), "photo.jpg");
form.append("background", "white");
const response = await fetch("https://moriahai.com/api/public/v1/id-photo", {
method: "POST",
headers: { "x-api-key": process.env.MORIAH_API_KEY },
body: form,
signal: AbortSignal.timeout(200_000),
});
const result = await response.json();
if (!result.ok) throw new Error(`${result.code}: ${result.message}`);
const image = Buffer.from(result.image.base64, "base64");입력 사진과 결과물을 저장하지 않습니다. 요청을 처리하는 동안만 메모리에 두고, 응답을 보낸 뒤 버립니다. 결과가 필요하시면 받는 쪽에서 보관하셔야 합니다.
남기는 것은 정산과 장애 확인에 필요한 호출 기록(시각·기능·성공 여부·처리 시간)뿐이며, 사진이나 인식된 개인정보는 포함하지 않습니다.
기관·기업 도입 시 개인정보 처리위탁 계약이 필요하면 상담에서 함께 준비합니다.
남기지 않습니다. 요청을 처리하는 동안만 메모리에 두고 응답 뒤 버립니다. 결과 이미지도 저장하지 않으므로 받는 쪽에서 보관하셔야 합니다.
증명사진 15~40초, 양식 인식 5~15초입니다. 요청을 받은 자리에서 끝까지 처리해 돌려주는 방식이라 부르는 쪽 타임아웃을 넉넉히 잡아야 합니다.
가능하지만 권하지 않습니다. 브라우저에 키를 두면 페이지를 열어 본 누구나 그 키로 호출할 수 있습니다. 꼭 필요하면 발급 때 허용 도메인을 등록해 드립니다.
네. 소량 회선을 먼저 열어 드립니다. 연결 점검은 횟수를 쓰지 않으니 붙이기 전에 통신부터 확인하세요.
기능 호출이 429로 막힙니다. 연결 점검과 충전은 그대로 열려 있어서 남은 횟수를 확인하고 채우는 길은 막히지 않습니다.
파트너가 체감하는 변화만 적습니다. 현재 버전은 v1 이며, 지금까지 기존 연동을 깨는 변경은 없었습니다.
v2)을 따로 열어 기존 통로를 그대로 둡니다. 어느 날 갑자기 응답 모양이 바뀌는 일은 없습니다.