템플릿 병합 규칙

여러 개의 템플릿 또는 파일을 하나의 임시 템플릿으로 합치는 병합 API(POST /templates/merge)의 동작 규칙입니다. 병합된 임시 템플릿으로 곧바로 서명·열람 요청을 보낼 수 있어, 매번 새 템플릿을 만들지 않고도 여러 문서를 조합해 발송할 수 있습니다.

📘

시작하기 전에 꼭 이해하기

  • 소스(source) — 병합에 넣는 재료입니다. 이미 만들어 둔 템플릿이거나, 파일 업로드 API로 올린 파일일 수 있습니다. 소스는 2개 이상 12개 이하로 넣습니다.
  • 임시 템플릿 — 병합 결과로 생성되는 템플릿입니다. 유효기간은 2시간이며, 그 안에 서명·열람 요청에 사용해야 합니다.
  • 앞 소스 우선 — 제목·라벨·도장 등 대부분의 설정은 sources 배열에서 가장 앞에 있는 소스의 값을 따릅니다. 순서가 곧 우선순위입니다.

전체 흐름

소스를 준비해 병합 API로 보내면, 하나의 임시 템플릿이 만들어지고 그 ID로 서명·열람 요청을 보냅니다. 아래 흐름도에서 파랑은 서버·API 처리 단계, 민트는 사용자 화면·완료 단계를 의미합니다.

  1. 소스 준비 — 병합할 템플릿 ID를 확인하거나, 파일을 파일 업로드 API로 올려 fileId·token을 받습니다. (2~12개)
  2. POST /templates/mergesources 배열에 소스를 순서대로 담아 병합을 요청합니다.
  3. 임시 템플릿 생성 — 병합 규칙에 따라 하나의 임시 템플릿이 생성됩니다. (유효기간 2시간)
  4. 서명/열람 요청 — 생성된 임시 템플릿 ID로 POST /documents/request-with-template를 호출해 요청을 보냅니다.

1. 병합 요청 방법

sources 배열에 병합할 소스를 순서대로 담아 요청합니다. 배열의 순서가 PDF 페이지 순서이자 설정 우선순위입니다.

curl -X POST 'https://api.modusign.co.kr/templates/merge' \
  -H 'Authorization: Basic {인코딩된 API-KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
    "sources": [
      { "type": "TEMPLATE", "templateId": "TEMPLATE_ID_1" },
      { "type": "TEMPLATE", "templateId": "TEMPLATE_ID_2" }
    ]
  }'

소스 종류

소스는 type에 따라 두 가지입니다.

type필수 항목설명
TEMPLATEtemplateId미리 만들어 둔 템플릿을 소스로 사용
FILEfileId, token파일 업로드 API로 올린 파일을 소스로 사용

TEMPLATE 소스에는 선택 항목으로 identifier(최대 8자)를 넣을 수 있습니다. 각 소스의 하위 리소스를 구분하기 위해 dataLabel의 접미사로 사용되며, 미입력 시 templateId 앞 8자로 대체됩니다.

🚧

파일 소스는 파일 업로드 API를 사용하세요

FILE 소스는 파일을 base64로 본문에 담지 않고, 먼저 파일 업로드 API(POST /files)로 업로드한 뒤 응답으로 받은 fileId·token을 참조합니다.

{
  "sources": [
    { "type": "TEMPLATE", "templateId": "TEMPLATE_ID_1" },
    {
      "type": "FILE",
      "fileId": "2752f600-c6fc-11ed-b2e3-b5476bd20f82",
      "token": "01GVZ3BGGT2D9BSEVXJJ2V00SP"
    }
  ]
}

파일 업로드로 받은 fileId·token의 유효기간은 2시간입니다.

응답 예시

병합에 성공하면 생성된 임시 템플릿 정보가 반환됩니다. 반환된 id를 서명·열람 요청의 templateId로 사용하세요.

{
  "id": "MERGED_TEMPLATE_ID",
  "title": "가장 앞 소스의 제목",
  "createdAt": "2026-07-14T00:00:00.000Z",
  "updatedAt": "2026-07-14T00:00:00.000Z"
}

2. 핵심 규칙

병합 결과는 다음 규칙에 따라 결정됩니다.

앞 소스 우선 원칙

아래 항목들은 소스에 템플릿이 포함되어 있는지 여부에 따라 적용되는 값이 달라집니다.

항목소스에 템플릿이 있는 경우소스에 템플릿이 없는 경우 (파일만)
템플릿 제목가장 앞에 있는 템플릿의 제목임시_템플릿_{날짜}
문서 라벨가장 앞에 있는 템플릿의 라벨빈 배열
진본증명도장가장 앞에 있는 템플릿의 설정비활성화
외부 참조자가장 앞에 있는 템플릿의 값빈 배열
결재선모든 소스가 동일해야 병합 가능빈 값

서명자 병합

서로 다른 소스의 서명자가 동일 인물인지 판단하여, 동일하면 병합, 아니면 별도로 유지합니다. 서명자를 rolenamecontact 순으로 비교해 3개 속성이 모두 일치하면 병합하며, 병합된 서명자의 설정은 앞 소스의 값을 따릅니다.

하나라도 불일치하면 분리합니다. 분리 시 앞 소스의 서명자는 원본 역할을 유지하고, 뒤 소스의 서명자부터 - 1, - 2 접미사가 붙습니다.

📘

참고사항

비교 항목이 양쪽 모두 미설정인 경우 일치로 취급합니다. 예를 들어 두 소스의 서명자 이름이 모두 비어 있으면 이름은 일치한 것으로 봅니다.

병합된 서명자의 설정 규칙은 다음과 같습니다.

항목규칙
입력란(fields)양쪽 소스의 입력란이 합산됨
서명 방식(사인/도장)앞 소스의 설정으로 통일
한 번의 서명 옵션앞 소스의 설정으로 통일
서명자 크기 조절 여부앞 소스의 설정으로 통일
인증수단(verification)앞 소스의 설정만 적용
첨부파일 요청모든 소스의 첨부파일 요청을 유지

병합되지 않은 서명자들 간에 역할명이 같으면, 첫 번째 서명자는 원본 역할을 유지하고 이후 중복되는 서명자부터 순서대로 역할에 - {숫자}가 붙습니다. (예: 근로자, 근로자 - 1, 근로자 - 2)

서명자 순서 결정 — 서명자를 가진 소스 중 가장 앞 소스가 순서 있는 서명(ordered signing)이면 소스 순서대로 서명 순서가 부여됩니다. (예: 템플릿 A(갑, 을, 병) + 템플릿 B(을, 무, 기) → 갑, 을, 병, 무, 기. "을"은 동일 인물로 병합) 가장 앞 소스가 순서 없는 서명(unordered signing)이면 서명 순서는 모두 1로 설정됩니다.

📘

참고사항

서명자가 1명인 템플릿은 순서 있는 서명으로 취급됩니다.

DataLabel 자동 변환

병합 전 템플릿의 데이터별 dataLabel을 시스템이 자동 변환하여 중복 가능성을 최소화합니다.

  • 모든 소스의 dataLabel이 변환 대상입니다.
  • 변환 형식: {기존_dataLabel}_{템플릿_제목}_{템플릿_ID_앞_8자리} (identifier를 지정하면 앞 8자리 대신 사용됩니다.)
  • dataLabel 최대 길이: 100글자

각 구성 요소의 축약 규칙은 다음과 같습니다.

구성 요소축약 규칙
기존 dataLabel45자 초과 시 앞 42자 + ... (총 45자)
템플릿 제목45자 초과 시 앞 20자 + ... + 뒤 22자 (총 45자)
템플릿 ID앞 8자 고정
⚠️

주의사항

변환된 dataLabel이 소스 간에 여전히 중복되면 병합이 실패합니다. 서로 다른 소스에서 동일한 dataLabel과 유사한 템플릿 제목을 사용하는 경우 주의하세요.

📘

참고사항

체크박스 필드 그룹에 속하는 체크박스 필드의 dataLabel에는 위 변환 규칙이 적용되지 않습니다.


3. 상세 규칙

열람자 병합

열람자를 가진 소스 중 가장 앞에 있는 소스의 열람자를 사용합니다.

📘

참고사항

열람용 템플릿끼리 병합하는 경우, 열람자를 가진 소스 중 가장 앞 소스의 열람자 1명만 유지됩니다.

필드(Field) 처리

각 소스의 필드 위치(position.page)는 병합된 PDF의 페이지 오프셋에 맞게 자동 재계산됩니다. x, y 좌표(상대값 0~1)는 변경되지 않습니다.

서명자가 병합된 경우, 뒤 소스의 서명 필드는 다음과 같이 조정됩니다.

항목조정 규칙
서명 방식(사인/도장)앞 소스의 서명자 설정으로 통일
한 번의 서명 옵션앞 소스의 서명자 설정으로 통일
필드 위치·크기서명 방식 변경 여부에 따라 자동 조정

필드 그룹(Field Group) 처리

필드 그룹 타입병합 규칙
CHECKBOX_GROUP모든 소스의 체크박스 그룹을 그대로 유지

첨부파일(Attachment) 처리

첨부파일 유형병합 규칙
요청자 첨부파일소스 중 가장 앞 소스의 요청자 첨부파일을 사용
서명자 첨부파일소스 간 이름이 같으면 앞 소스의 서명자 첨부파일을 사용

인증수단(Verification) 처리

참여자 유형병합 규칙
서명자병합된 경우 앞 소스 서명자의 인증수단을 사용. 병합되지 않은 경우 각 서명자의 인증수단을 유지
열람자열람자를 가진 소스 중 가장 앞 소스의 인증수단을 사용

4. 주의사항

  • 임시 템플릿 유효기간(TTL)은 2시간입니다. 만료된 템플릿으로 서명 요청 시 404 Not Found가 발생할 수 있습니다.
  • 동일 임시 템플릿 ID로 유효기간 내 복수 서명 요청이 가능합니다. (각각 별개의 문서 생성)
  • PDF 페이지 순서는 sources 배열 순서를 따릅니다.
  • 소스는 최소 2개, 최대 12개까지 지정할 수 있습니다.
  • 파일 소스는 파일 업로드 API로 올린 fileId·token을 사용하세요.

병합 실패 조건

아래 조건에 해당하면 병합이 실패합니다.

구분실패 조건
설정설정 고정 템플릿을 병합하는 경우
설정서명용 템플릿과 열람용 템플릿을 함께 병합하는 경우
설정모든 소스의 결재선이 동일하지 않은 경우
파일 크기병합된 문서 파일 크기가 10MB를 초과하는 경우
참여자 수서명자 수가 30명을 초과하는 경우
필드 수전체 입력란이 2,000개를 초과하는 경우
필드 수서명 필드가 100개를 초과하는 경우
필드 수이미지 필드가 7개를 초과하는 경우
필드 수드롭다운 필드가 100개를 초과하는 경우
첨부파일첨부파일이 30개를 초과하는 경우

5. 자주 묻는 질문

FAQ

병합으로 만든 임시 템플릿은 얼마나 유지되나요?

유효기간은 2시간입니다. 그 안에 임시 템플릿 ID로 서명·열람 요청을 보내세요. 유효기간이 지난 뒤 요청하면 404 Not Found가 발생할 수 있습니다.

소스의 순서가 왜 중요한가요?

제목·라벨·진본증명도장·인증수단 등 대부분의 설정은 가장 앞 소스의 값을 따릅니다. 또한 PDF 페이지 순서도 sources 배열 순서대로 결정됩니다. 따라서 기준이 되는 소스를 배열 맨 앞에 두세요.

서명용 템플릿과 열람용 템플릿을 함께 병합할 수 있나요?

아니요. 서명용과 열람용 템플릿을 함께 병합하면 병합이 실패합니다. 같은 유형끼리만 병합하세요.

병합이 실패했습니다. dataLabel 중복이 원인일 수 있나요?

네. 서로 다른 소스에서 동일한 dataLabel과 유사한 템플릿 제목을 쓰면, 자동 변환 후에도 dataLabel이 중복되어 병합이 실패할 수 있습니다.

응답 예시:

{
  "statusCode": 422,
  "message": "Validation failed"
}
  • 소스별로 identifier를 다르게 지정하거나, 템플릿 제목·dataLabel을 구분되게 설정하세요.
👍

더 자세한 API 내용은 API References에서 확인하세요!

템플릿/문서 병합 API의 요청·응답 스키마를 확인하세요.


🚧

유의사항

  • 병합으로 만든 임시 템플릿의 유효기간은 2시간입니다. 만료 전에 서명·열람 요청에 사용하세요.
  • 대부분의 설정은 가장 앞 소스를 따르므로, 기준 소스를 sources 맨 앞에 배치하세요.
  • 파일 소스는 base64 대신 파일 업로드 API의 fileId·token으로 참조하세요.


Did this page help you?