Templates API

템플릿을 조회하고 책에 적용하는 방법을 안내합니다.

템플릿이란?

템플릿은 포토북 페이지의 레이아웃을 정의하는 디자인 틀입니다. 텍스트, 사진, 그래픽 요소의 배치와 스타일이 미리 설정되어 있어, 파라미터만 전달하면 완성된 페이지를 만들 수 있습니다. 각 템플릿의 디자인 특징과 사용 예시는 템플릿 상세 정보 ↗에서 확인할 수 있습니다.

템플릿 종류

템플릿은 templateKind로 구분되며, 네 가지 종류가 있습니다. 현재 제공되는 모든 템플릿 카탈로그는 템플릿 카탈로그 ↗에서 미리 볼 수 있습니다.

종류용도적용 API
표지 템플릿cover책 표지 디자인. 책당 하나만 적용됩니다.POST /books/{bookUid}/cover
내지 템플릿content내지 페이지 디자인. 여러 번 적용하여 페이지를 추가합니다.POST /books/{bookUid}/contents
구분지 템플릿divider섹션 구분용 페이지 디자인.POST /books/{bookUid}/contents
출판 템플릿publish출판용 특수 페이지 디자인.POST /books/{bookUid}/contents
표지 템플릿과 내지 템플릿은 서로 다른 API로 적용합니다. 표지에 내지 템플릿을 사용하거나, 내지에 표지 템플릿을 사용할 수 없습니다.

카테고리

템플릿은 용도별 카테고리로 분류됩니다. GET /template-categories로 전체 목록을 조회할 수 있습니다.

코드key한국어English
1diary일기장Diary
2notice알림장Notice
3album앨범Album
4yearbook졸업앨범Yearbook
5wedding웨딩Wedding
6baby육아Baby
7travel여행Travel
8etc기타Etc

템플릿 조회하기

목록 조회

GET /templates로 사용 가능한 템플릿을 조회합니다. 공용(public) 템플릿과 본인이 생성한 템플릿이 함께 조회됩니다.

Query Parameter설명
bookSpecUid판형 UID로 필터링 (예: SQUAREBOOK_HC)
category카테고리로 필터링 (예: album, diary)
templateKind종류로 필터링 (cover, content, divider, publish)
templateName템플릿 이름 검색 — 띄어쓰기로 구분된 다중 키워드 AND 매칭 (예: 알림장 내지)
specProfileUidSpecProfile UID로 필터링
theme테마로 필터링 (예: spring, minimal)
sort정렬 기준 — name_asc, name_desc, created_asc, updated_desc, updated_asc (기본: created_desc)
limit, offset페이지네이션 (기본 limit: 50)
Request
# SQUAREBOOK_HC용 내지 템플릿 조회
curl 'https://api-sandbox.sweetbook.com/v1/templates?bookSpecUid=SQUAREBOOK_HC&templateKind=content' \
  -H 'Authorization: Bearer {YOUR_API_KEY}'
Response
{
  "success": true,
  "message": "Success",
  "data": [
    {
      "templateUid": "8hKvbcNJdSgj",
      "accountUid": "public",
      "templateName": "알림장A_내지",
      "description": "알림장 내지 — 미니멀 1단",
      "templateKind": "content",
      "category": "diary",
      "theme": "minimal",
      "bookSpecUid": "SQUAREBOOK_HC",
      "bookSpecName": "고화질 스퀘어북 (하드커버)",
      "isPublic": true,
      "status": "active",
      "thumbnails": { "layout": "https://..." },
      "createdAt": "2026-01-15T09:00:00Z",
      "updatedAt": "2026-01-20T14:30:00Z"
    }
  ],
  "pagination": { "total": 45, "limit": 50, "offset": 0, "hasNext": false }
}

상세 조회

GET /templates/{templateUid}로 특정 템플릿의 상세 정보를 확인할 수 있습니다. 상세 응답에는 파라미터 정의, 레이아웃, 레이아웃 규칙, 베이스 레이어 등이 포함됩니다.

상세 응답 필드설명
parameters파라미터 정의 (텍스트/이미지/갤러리 바인딩 정보)
layout레이아웃 정의 (요소 배치, 크기)
layoutRules레이아웃 규칙 (여백, 흐름, 컬럼 등)
baseLayer베이스 레이어 (홀수/짝수 페이지 배경 요소)
thumbnails템플릿 외형 견본 URL 객체. layout / baseLayerOdd / baseLayerEven 세 키가 있으며, 등록되지 않은 항목은 응답에서 omit됩니다 (셋 모두 미등록이면 thumbnails 객체 자체가 omit). 응답에 키가 존재하면 해당 URL은 항상 유효합니다.
썸네일은 사전 등록된 외형 견본입니다. 파트너가 입력한 사진이 합성된 결과가 아니며, 카탈로그 UI나 템플릿 선택 화면 표시용으로만 사용합니다. 입력 사진이 실제로 합성된 결과는 책 최종화(POST /books/{bookUid}/finalization) 후 PDF 다운로드로만 확인할 수 있습니다.

썸네일 URL은 정적 호스팅 자산이며 다음 정책을 따릅니다.

  • 인증 불요: Authorization 헤더 없이 접근 가능합니다. <img src>에 직접 사용할 수 있습니다.
  • 영구 URL: 만료·서명 토큰이 없습니다. 캐시·CDN 친화적입니다.
  • 확장자 가변: .jpg / .png / .webp 등 등록 시 원본 확장자가 그대로 유지됩니다. 응답의 URL을 그대로 사용하고 확장자를 임의로 가정·변경하지 마세요.
  • 도메인: 호출 도메인(api-sandbox.sweetbook.com / api.sweetbook.com)이 자동 적용됩니다.
Request
curl 'https://api-sandbox.sweetbook.com/v1/templates/8hKvbcNJdSgj' \
  -H 'Authorization: Bearer {YOUR_API_KEY}'
thumbnails 응답 예시 (3종 모두 등록된 경우)
"thumbnails": {
  "layout": "https://api-sandbox.sweetbook.com/templates_thumb/{templateUid}/layout.jpg",
  "baseLayerOdd": "https://api-sandbox.sweetbook.com/templates_thumb/{templateUid}/base_layer_odd.jpg",
  "baseLayerEven": "https://api-sandbox.sweetbook.com/templates_thumb/{templateUid}/base_layer_even.jpg"
}
thumbnails 응답 예시 (layout만 등록된 경우)
"thumbnails": {
  "layout": "https://api-sandbox.sweetbook.com/templates_thumb/{templateUid}/layout.jpg"
}

템플릿 선택 기준

템플릿을 선택할 때 다음 사항을 확인하세요.

1. bookSpecUid 일치

템플릿의 bookSpecUid가 생성한 책의 bookSpecUid와 일치해야 합니다. 레이아웃 크기가 다르면 적용할 수 없습니다.

2. templateKind 확인

표지에는 cover 템플릿, 내지에는 content 템플릿을 사용해야 합니다.

3. 파라미터 확인

상세 조회로 parameters를 확인하여 어떤 값(텍스트, 사진 등)을 전달해야 하는지 파악하세요.

파라미터 구조

템플릿 상세 응답의 parametersdefinitions 래퍼로 감싸진 구조입니다. 각 파라미터 키는 parameters.definitions.{key} 경로에 위치합니다.

필드설명
parameters.definitions파라미터 정의 목록 객체
parameters.definitions.{key}.binding바인딩 타입 — text, file, rowGallery
parameters.definitions.{key}.label사람이 읽을 수 있는 파라미터 이름
파라미터 필드를 식별할 때 type 대신 binding 필드를 사용합니다. 플레이스홀더 문법은 $$variableName$$ (달러 기호 두 개)입니다. 예: $$bookTitle$$
parameters 구조 예시
{
  "parameters": {
    "definitions": {
      "bookTitle": {
        "binding": "text",
        "label": "책 제목"
      },
      "frontPhoto": {
        "binding": "file",
        "label": "표지 사진"
      },
      "photos": {
        "binding": "rowGallery",
        "label": "내지 사진 목록"
      }
    }
  }
}

파라미터 바인딩

템플릿의 parameters.definitions에 정의된 바인딩 유형에 따라 값을 전달합니다.

바인딩 유형전달 값예시
text텍스트 문자열"bookTitle": "우리 가족 앨범"
file이미지 URL 또는 업로드 파일 1장"frontPhoto": "https://..."
gallery이미지 URL 또는 파일 배열 (다중)"images": ["a.jpg", "b.jpg"]
collageGallery콜라주용 이미지 배열 (다중)"collagePhotos": ["a.jpg", "b.jpg"]
rowGallery행 배치용 이미지 배열 (다중)"photos": ["photo1.jpg", "photo2.jpg"]
갤러리 계열(gallery / collageGallery / rowGallery)에 사용할 사진은 먼저 POST /books/{bookUid}/photos로 업로드한 후, 반환된 fileName을 사용하거나 외부 URL을 직접 전달할 수 있습니다.

파라미터 스키마 조회

GET /templates/{templateUid}/schema는 템플릿 파라미터 명세를 JSON Schema (draft-07) 형식으로 반환합니다. 상세 조회(GET /templates/{templateUid})의 parameters 필드는 내부 저장 구조를 그대로 노출하지만, 본 엔드포인트는 표준 JSON Schema 형식으로 변환하여 페이로드 검증·자동화 도구·코드 생성기와 바로 연동할 수 있도록 합니다.

권한 정책은 상세 조회와 동일합니다 — 공용 템플릿(isPublic: true)은 누구나, 본인 소유 개인 템플릿은 본인만 조회 가능합니다. 존재하지 않거나 접근 권한이 없는 templateUid로 호출하면 404 ERR_NOT_FOUND가 반환됩니다.

Request
curl 'https://api-sandbox.sweetbook.com/v1/templates/4MY2fokVjkeY/schema' \
  -H 'Authorization: Bearer {YOUR_API_KEY}'

응답 구조

응답의 data 객체는 JSON Schema draft-07 사양을 따르며 다음 필드를 포함합니다.

필드타입설명
$schemastringJSON Schema dialect URI. 항상 http://json-schema.org/draft-07/schema#
$idstring스키마 식별자 — 템플릿 UID
titlestring템플릿 이름
descriptionstring템플릿 설명. 등록된 설명이 없는 경우 응답에서 omit됩니다 (빈 문자열로 노출되지 않음)
typestring항상 "object" 고정 (템플릿 파라미터는 key-value 구조)
propertiesobject파라미터 키 → 스키마 정의. 항목 구조는 다음 섹션 참조
requiredstring[]필수 파라미터 키 목록. 판정 규칙은 별도 섹션 참조
x-templateKindstring템플릿 종류 (cover / content / divider / publish) — JSON Schema 표준 외 확장 필드
description과 같이 값이 없으면 응답에서 키 자체가 omit되는 필드가 있습니다. 클라이언트는 키 존재 여부를 검사한 뒤 사용해야 합니다 ("description" in data).
Response (표지 템플릿 예시)
{
  "success": true,
  "message": "성공",
  "data": {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "4MY2fokVjkeY",
    "title": "표지",
    "type": "object",
    "properties": {
      "frontPhoto": {
        "type": "string",
        "description": "앞표지 배경 대형 사진",
        "format": "uri",
        "x-binding": "file"
      },
      "backPhoto": {
        "type": "string",
        "description": "뒤표지 소형 사진",
        "format": "uri",
        "x-binding": "file"
      },
      "dateRange": {
        "type": "string",
        "description": "날짜 범위",
        "x-binding": "text"
      },
      "spineTitle": {
        "type": "string",
        "description": "책등 및 앞표지 세로 제목",
        "x-binding": "text"
      }
    },
    "required": ["frontPhoto", "dateRange", "spineTitle"],
    "x-templateKind": "cover"
  }
}

properties 항목 구조

각 파라미터는 표준 JSON Schema property로 표현되며, 원본 binding 값은 x-binding 확장 필드로 보존됩니다. 바인딩 유형별로 다음과 같이 매핑됩니다.

원본 bindingtypeformatitemsx-binding
text"string""text"
file"string""uri""file"
gallery"array"{ "type": "string", "format": "uri" }"gallery"
collageGallery"array"{ "type": "string", "format": "uri" }"collageGallery"
rowGallery"array"{ "type": "string", "format": "uri" }"rowGallery"

description은 원본 정의에 명시된 경우에만 노출됩니다 (없으면 omit). 원본에 enum 후보값이 있으면 그대로 passthrough되며, 없으면 omit됩니다.

갤러리 항목 응답 예시
"photos": {
  "type": "array",
  "description": "사진들 (0~N장)",
  "items": {
    "type": "string",
    "format": "uri"
  },
  "x-binding": "rowGallery"
}

required 판정 규칙

응답의 루트 required 배열은 다음 규칙에 따라 결정됩니다.

  • 원본 정의에 required명시되지 않은 키는 자동으로 필수(true)로 간주되어 응답 required 배열에 포함됩니다.
  • 원본 정의에 required: false명시된 키만 선택 파라미터로 처리되어 required 배열에서 제외됩니다.
  • 본 규칙은 응답 시점에만 정규화되며 원본 데이터에는 영향을 주지 않습니다. 기존 GET /templates/{templateUid} 상세 조회의 parameters 필드는 raw passthrough이므로 이 정규화가 적용되지 않습니다.

상세 조회와의 비교

상세 조회(GET /templates/{templateUid})와 신규 스키마 조회의 차이는 다음과 같습니다.

항목상세 조회 GET /templates/{uid}스키마 조회 GET /templates/{uid}/schema
응답 형식내부 저장 구조 (parameters / layout / baseLayer / thumbnails 포함)JSON Schema draft-07 문서
parameters 처리저장된 JSON을 그대로 passthroughJSON Schema 형식으로 변환 (properties + required)
required 정규화원본 그대로 (명시되지 않은 키는 누락)명시되지 않은 키 자동 포함 (위 규칙)
페이로드 크기크다 (layout · 썸네일 · baseLayer 포함)작다 (스키마 전용)
주 용도템플릿 편집 UI · 카탈로그 · 썸네일 사용페이로드 검증 · 자동화 도구 · 코드 생성기

기존 호출자는 변경할 필요가 없습니다. 상세 조회 응답 구조는 그대로 유지됩니다. JSON Schema 형식이 필요한 클라이언트만 새 엔드포인트를 추가로 호출하면 됩니다.

권장 사용 흐름

스키마 응답을 활용하여 책에 템플릿을 적용하는 표준 흐름은 다음과 같습니다.

  1. GET /templates?bookSpecUid=...로 사용 가능한 템플릿 목록을 조회합니다.
  2. GET /templates/{templateUid}/schema로 파라미터 스키마를 받습니다.
  3. required 배열로 필수 키를 확인하고, properties.{key}.x-binding으로 전달 형식을 결정합니다.
    • "text"parameters[key]에 문자열
    • "file"parameters[key]에 이미지 URL 또는 업로드된 사진의 fileName
    • 갤러리 계열(gallery / collageGallery / rowGallery) → parameters[key]에 URL/파일명 배열
  4. POST /books/{bookUid}/cover 또는 POST /books/{bookUid}/contents로 템플릿을 적용합니다.

$schema: "http://json-schema.org/draft-07/schema#"이 명시되어 있으므로 기성 JSON Schema 검증기(예: ajv, python-jsonschema)에 응답을 그대로 입력하여 페이로드 검증을 자동화할 수 있습니다.x-binding 같은 확장 필드는 표준 검증기가 무시하므로 별도 설정이 필요하지 않습니다.

책에 템플릿 적용하기

책 생성부터 최종화까지의 전체 흐름에서 템플릿이 사용되는 과정입니다.

  1. POST /books — 책 생성 (bookSpecUid 지정)
  2. POST /books/{bookUid}/photos — 사진 업로드 (필요 시)
  3. POST /books/{bookUid}/cover — 표지 적용 (cover 템플릿 + 파라미터)
  4. POST /books/{bookUid}/contents — 내지 추가 (content 템플릿 + 파라미터) ← 반복
  5. POST /books/{bookUid}/finalization — 최종화

표지 적용 예시

표지 템플릿을 적용할 때는 templateUid, 파라미터(제목, 저자 등), 이미지 파일을 함께 전달합니다.

Request
curl -X POST 'https://api-sandbox.sweetbook.com/v1/books/{bookUid}/cover' \
  -H 'Authorization: Bearer {YOUR_API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
  "templateUid": "COVER_TEMPLATE_UID",
  "parameters": {
    "bookTitle": "우리 가족 앨범",
    "year": "2026"
  }
}'

내지 추가 예시

내지는 POST /books/{bookUid}/contents를 여러 번 호출하여 페이지를 계속 추가할 수 있습니다. 각 호출마다 다른 템플릿을 사용할 수도 있습니다.
Request
curl -X POST 'https://api-sandbox.sweetbook.com/v1/books/{bookUid}/contents' \
  -H 'Authorization: Bearer {YOUR_API_KEY}' \
  -H 'Content-Type: application/json' \
  -d '{
  "templateUid": "8hKvbcNJdSgj",
  "parameters": {
    "date": "2026-03-01",
    "dayOfWeek": "월요일",
    "teacherComment": "오늘 하루도 잘 보냈습니다.",
    "photos": ["photo1.jpg", "photo2.jpg"]
  }
}'

HTTP 상태 코드

Templates API의 모든 엔드포인트(GET /templates, GET /templates/{templateUid}, GET /templates/{templateUid}/schema, GET /template-categories)는 다음 상태 코드를 공통으로 반환합니다.

코드errorCode설명
200 OK조회 성공 (결과 없으면 빈 배열)
400 Bad RequestERR_VALIDATION_FAILED쿼리 파라미터 형식 오류 (limit/offset 범위, 잘못된 sort 값 등)
401 UnauthorizedERR_UNAUTHORIZED인증 실패
404 Not FoundERR_NOT_FOUND존재하지 않는 templateUid (단건/스키마 조회 시)
500 Internal Server ErrorERR_INTERNAL_ERROR서버 오류

실패 응답 6필드 shape(success·errorCode·message·data·errors·fieldErrors) 및 errorCode 분기 가이드는 에러 코드 & 트러블슈팅을 참고하세요.