API 문서

증명사진 생성과 자동 양식 인식을 외부 서비스에서 그대로 부를 수 있습니다. 개발자가 있는 경우의 명세와, 개발 인력이 없는 경우의 대안을 함께 담았습니다.

base url
https://moriahai.com/api/public/v1

개요

모리아AI 파트너 API는 증명사진 생성자동 양식 인식을 외부 서비스·기관 시스템에서 직접 부를 수 있게 연 통로입니다. 현장 키오스크가 쓰는 것과 같은 코드를 쓰므로 결과물이 갈라지지 않습니다.

화면을 새로 만들지 않아도 됩니다. 이미 쓰고 계신 시스템에서 사진이나 서류를 보내면, 결과를 받아 그대로 띄우거나 저장하시면 됩니다.

증명사진
규격 600×800, 배경·복장·보정 지정
15~40초
자동 양식 인식
제목·기본정보·표를 구조 그대로
5~15초

어떻게 붙이나

답에 따라 준비할 것이 완전히 달라집니다. 해당하는 쪽만 읽으시면 됩니다.

개발자가 있습니다

평범한 REST 호출입니다. 별도 SDK 없이 HTTP 요청을 보낼 수 있는 언어면 무엇이든 됩니다. 키 하나를 헤더에 넣으면 인증이 끝나고, 결과가 나올 때까지 기다리는 방식이라 콜백·웹훅 설정이 없습니다.

→ 인증부터 보기
개발 인력이 없습니다

그래도 쓰실 수 있습니다. API 를 직접 부르지 않고 쓰는 길이 세 가지 있습니다. 어느 쪽이 맞는지는 지금 쓰고 계신 시스템에 따라 달라 상담에서 함께 정합니다.

→ 세 가지 방법 보기

연동 절차

어느 쪽을 고르시든 순서는 같습니다. 다른 것은 3단계를 누가 하느냐입니다.

  1. 1
    문의
    쓰실 기능과 예상 사용량을 알려주세요.
  2. 2
    키 발급
    기능 권한·허용 도메인·횟수를 정해 열어 드립니다.
  3. 3
    연결
    연결 점검으로 통신을 확인하고 실제 화면에 붙입니다.
  4. 4
    운영
    남은 횟수와 오류를 보며 필요할 때 충전합니다.
키는 발급하는 순간에만 보여 드리고 저희 쪽에도 원본을 남기지 않습니다. 분실하시면 폐기하고 새로 발급하는 것이 유일한 방법이니, 받으신 즉시 안전한 곳에 보관해 주세요.

개발 인력이 없을 때

API 를 직접 부르지 않고도 같은 기능을 쓰실 수 있습니다. 세 가지 중 지금 환경에 맞는 쪽을 상담에서 함께 고릅니다.

가장 빠름

완성된 화면을 그대로 쓰기

저희가 만든 웹 화면 주소를 받아 쓰시는 방법입니다. 담당자분이 브라우저에서 사진을 올리면 결과가 나오고, 내려받아 쓰시면 됩니다.

이럴 때 맞습니다
당장 몇 명이 쓰면 되는 경우 · 기존 시스템을 건드릴 수 없는 경우
준비하실 것
인터넷이 되는 PC 한 대
가장 매끄러움

쓰시는 시스템에 붙이기

이미 운영 중인 홈페이지나 내부 시스템에 버튼 하나를 넣는 방식입니다. 그 시스템을 만든 업체나 저희가 작업합니다.

이럴 때 맞습니다
직원이 매일 쓰는 화면 안에서 끝나야 하는 경우
준비하실 것
지금 시스템을 만든 곳의 연락처 또는 관리 권한
직접 해볼 수 있음

업무 자동화 도구로 연결하기

메일이나 폼으로 들어온 파일을 자동으로 보내 결과를 받는 방식입니다. 코드를 쓰지 않고 화면에서 블록을 잇는 도구를 씁니다.

이럴 때 맞습니다
접수가 메일·구글폼처럼 한 곳으로 모이는 경우
준비하실 것
쓰고 계신 자동화 도구 계정(없으면 함께 검토합니다)
작업 범위와 일정은 지금 쓰고 계신 시스템에 따라 달라집니다. 여기에 기간이나 금액을 미리 적어 두지 않는 이유입니다 — 상담에서 환경을 보고 정확히 말씀드립니다.

인증

발급받은 키를 헤더에 넣습니다. 두 가지 형태 중 편한 쪽을 쓰시면 되고, 둘 다 같게 동작합니다.

header
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
curl -H "x-api-key: $MORIAH_API_KEY" \
  https://moriahai.com/api/public/v1/health
response
{
  "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
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"
response
{
  "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 대신 씁니다.
genderauto · male · female. 복장을 정합니다. 기본 auto.
retouchlight · medium · strong. 보정 정도. 기본 light.
crop규격(600×800)으로 자를지. 기본 true.
formatbinary 를 주면 JSON 대신 이미지 바이트가 그대로 옵니다.
드물게 규격 맞추기에 실패하면 실패로 처리하지 않고 모델 출력을 그대로 내려보내면서 meta.croppedfalse 로 둡니다. 규격이 꼭 필요하시면 이 값을 확인하고 직접 3:4 로 자르시면 됩니다.

자동 양식 인식

서류 사진에서 제목·기본 정보·표를 구조 그대로 뽑아냅니다. 이력서·신청서처럼 칸이 정해진 문서에 맞습니다.

curl
curl -X POST https://moriahai.com/api/public/v1/smart-form \
  -H "x-api-key: $MORIAH_API_KEY" \
  -F "image=@document.jpg"
response
{
  "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 로 갈라 처리하세요.

error
{ "ok": false, "requestId": "3f2b1c...",
  "code": "IMAGE_TOO_LARGE", "message": "..." }
HTTPcode
401API_KEY_REQUIRED키 헤더가 없습니다
401API_KEY_INVALID키가 없거나 틀렸습니다
401API_KEY_EXPIRED만료된 키입니다
401API_KEY_REVOKED폐기된 키입니다. 되살릴 수 없습니다
403API_KEY_PAUSED일시 중지된 키입니다. 문의하시면 재개됩니다
403SCOPE_NOT_GRANTED이 키에 해당 기능 권한이 없습니다
400IMAGE_REQUIRED이미지가 비어 있습니다
400IMAGE_TOO_LARGE10MB를 넘었습니다
400UNSUPPORTED_IMAGE_TYPEjpeg·png·webp·heic 가 아닙니다
400UNKNOWN_BACKGROUNDbackground 이름이 목록에 없습니다
400INVALID_BACKGROUND_COLOR#RRGGBB 형식이 아닙니다
400INVALID_GENDERauto·male·female 이 아닙니다
429RATE_LIMITED시간당 한도 초과. Retry-After 초 뒤 재시도
429QUOTA_EXCEEDED사용 횟수 소진. 충전해야 열립니다
502GENERATION_FAILED모델이 이미지를 내주지 못했습니다
502RECOGNITION_FAILED문서를 읽지 못했습니다. 다시 촬영이 필요합니다
502DOCUMENT_TOO_LONG내용이 많아 결과가 잘렸습니다. 페이지를 나눠 보내세요
503UPSTREAM_BUSY처리량이 몰렸습니다. 잠시 후 재시도

재시도 기준

  • 4xx — 요청을 고쳐야 합니다. 다시 보내도 결과가 같습니다.
  • 429RATE_LIMITEDRetry-After 초 뒤 재시도. QUOTA_EXCEEDED 는 기다려도 풀리지 않고 충전해야 합니다.
  • 502 — 한 번쯤 재시도할 만합니다. 같은 사진에서 계속 실패하면 사진 문제입니다.
  • 503 — 처리량이 몰렸습니다. 잠시 후 재시도하세요.

API_KEY_INVALID 는 「그런 키가 없다」와 「키는 있는데 값이 틀렸다」를 구분하지 않습니다. 구분해 주면 키를 추측하는 쪽에 힌트가 되기 때문입니다.

사용 횟수

계약으로 정한 총 사용 횟수가 있습니다. 성공한 호출만 차감하며, 모델이 실패한 건은 횟수를 쓰지 않습니다.

response headers
X-Quota-Limit: 5000
X-Quota-Remaining: 4127
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
  • 다 쓰면 429 QUOTA_EXCEEDED 로 기능 호출이 막힙니다.
  • 막힌 뒤에도 연결 점검은 열려 있습니다. 남은 횟수를 확인하는 길까지 막지 않습니다.
  • 충전 방식은 매달 다시 채워지는 월 자동 갱신과 담당자가 채우는 수동 충전 두 가지입니다.
  • 한도가 없는 회선에는 위 X-Quota-* 헤더가 붙지 않습니다.
브라우저에서 부르는 경우에는 X-Quota-* 헤더를 읽을 수 없습니다. 대신 연결 점검 응답의 quota 를 쓰세요 — 횟수가 줄지 않습니다.

예제 (Node.js)

결과가 나올 때까지 기다리는 방식이라 타임아웃을 넉넉히 잡아야 합니다. 증명사진은 200초를 권합니다.

node.js
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");

키 관리와 보안

키는 서버에만 두세요. 브라우저 코드에 넣으면 페이지를 열어 본 누구나 그 키로 호출할 수 있습니다. 브라우저에서 직접 불러야 한다면 발급 때 허용 도메인을 등록해 드리니 미리 알려주세요.
  • 키는 환경변수나 비밀 저장소에 두고, 저장소(Git)에 커밋하지 마세요.
  • 유출이 의심되면 알려 주세요. 즉시 폐기하고 새 키를 발급합니다.
  • 일시 중지는 되돌릴 수 있지만 폐기는 되돌릴 수 없습니다.

개인정보

입력 사진과 결과물을 저장하지 않습니다. 요청을 처리하는 동안만 메모리에 두고, 응답을 보낸 뒤 버립니다. 결과가 필요하시면 받는 쪽에서 보관하셔야 합니다.

남기는 것은 정산과 장애 확인에 필요한 호출 기록(시각·기능·성공 여부·처리 시간)뿐이며, 사진이나 인식된 개인정보는 포함하지 않습니다.

기관·기업 도입 시 개인정보 처리위탁 계약이 필요하면 상담에서 함께 준비합니다.

자주 묻는 것

사진이나 문서가 서버에 남나요?

남기지 않습니다. 요청을 처리하는 동안만 메모리에 두고 응답 뒤 버립니다. 결과 이미지도 저장하지 않으므로 받는 쪽에서 보관하셔야 합니다.

얼마나 걸리나요?

증명사진 15~40초, 양식 인식 5~15초입니다. 요청을 받은 자리에서 끝까지 처리해 돌려주는 방식이라 부르는 쪽 타임아웃을 넉넉히 잡아야 합니다.

브라우저에서 바로 부를 수 있나요?

가능하지만 권하지 않습니다. 브라우저에 키를 두면 페이지를 열어 본 누구나 그 키로 호출할 수 있습니다. 꼭 필요하면 발급 때 허용 도메인을 등록해 드립니다.

테스트만 먼저 해볼 수 있나요?

네. 소량 회선을 먼저 열어 드립니다. 연결 점검은 횟수를 쓰지 않으니 붙이기 전에 통신부터 확인하세요.

횟수를 다 쓰면 어떻게 되나요?

기능 호출이 429로 막힙니다. 연결 점검과 충전은 그대로 열려 있어서 남은 횟수를 확인하고 채우는 길은 막히지 않습니다.

변경 이력

파트너가 체감하는 변화만 적습니다. 현재 버전은 v1 이며, 지금까지 기존 연동을 깨는 변경은 없었습니다.

2026.08.04
  • 사용 횟수(쿼터) 도입. 응답에 X-Quota-Limit · X-Quota-Remaining 헤더가 붙고, 다 쓰면 429 QUOTA_EXCEEDED 로 막힙니다.
  • 횟수를 다 써도 연결 점검과 충전은 열어 둡니다. 충전길이 함께 막히면 되살릴 방법이 없었습니다.
  • 연결 점검 응답에 남은 횟수(quota)가 함께 실립니다.
2026.08.03
  • 자동 양식 인식(POST /smart-form) 공개.
  • 증명사진(POST /id-photo) 공개. v1 시작.
기존 연동을 깨는 변경은 미리 알려 드리고, 필요하면 새 버전(v2)을 따로 열어 기존 통로를 그대로 둡니다. 어느 날 갑자기 응답 모양이 바뀌는 일은 없습니다.
연동을 시작하시겠어요?

쓰실 기능과 예상 사용량을 알려주시면 시험용 키부터 열어 드립니다.

연동 문의하기