이미지 생성
자연어 프롬프트로 이미지 PNG 한 장을 생성합니다. 참고 이미지(url|b64, 최대 16장) 입력, 완료 결과 재생성(POST /v1/free-images/{id}/regenerate), 시안 기반 생성(/v1/references 등록·검수 후 필드 교체)을 지원합니다. 크기 생략 시 3840×2160, 장변 ≤3840px, 비율 제한 없음(3:1 초과는 밴드 합성). 3:1 초과 비율은 참고 최대 15장. 와이드 비율로 전자현수막·배너도 생성합니다. 프롬프트는 기본으로 LLM 정제를 거칩니다(refine:false 로 옵트아웃).
자유 이미지 생성 시작
비동기 — 202 즉시 반환 후 백그라운드 생성. 요청 본문은 application/json.
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
Idempotency-Key | header | stringminLength: 1maxLength: 255 | — | 같은 키로 24h 내 재호출 시 첫 응답 리플레이. 다른 본문이면 409. |
요청 본문 · application/json · 필수
promptstringminLength: 1maxLength: 2000이미지 묘사 자연어 프롬프트. reference 지정 시 선택('추가 요청' 역할 — 조립된 프롬프트 뒤에 덧붙여짐, 미지정 시 조립 프롬프트만 사용).
widthintegerdefault: 3840min: 1생략 시 3840. 비율 제한 없음 — 3:1 초과는 밴드 합성으로 생성(유효 단변 해상도 = 3840/비율). 장변 ≤3840px. reference 지정 시 1920 또는 3840 만 가능(프리셋 잠금, 기본 3840). 세로형(aspect<1) 시안은 산출 height 가 두 프리셋 모두에서 상한(3840px)을 넘으면 400(세로형 정식 지원 없음).
heightintegerdefault: 2160min: 1생략 시 2160. reference 지정 시 지정 불가(시안 aspect 로 산출됨).
imagesarray<object>minItems: 1maxItems: 16참고 이미지 (선택, 최대 16장). 제공 시 참고 이미지를 반영해 생성합니다. 3:1 초과 비율에서는 최대 15장(영역 가이드 1슬롯). reference 와 동시 지정 불가(시안 이미지가 참고 슬롯을 전담).
array<RefImageItem> 의 항목:
urlstring (uri)format: urihttps 공개 이미지 URL
b64stringbase64 인코딩 이미지 (data URI prefix 허용)
descriptionstringmaxLength: 500이 이미지를 결과에 어떻게 반영할지 설명 (선택)
refinebooleandefault: trueLLM 이 느슨한 입력을 최종 이미지 프롬프트로 정규화합니다(플레이그라운드와 동일). 직접 다듬은 프롬프트를 그대로 쓰려면 false. 정제 결과는 응답의 refinedPrompt 로 확인할 수 있습니다. 정제는 생성 전 LLM 호출 1회를 추가합니다(수 초). reference 지정 시 이 값은 무시됨(조립 프롬프트가 이미 최종형).
referenceFreeImageReferenceParamidstring필수시안 id (빌트인 또는 본인이 등록한 것)
fieldsobject필드 key → 새 글자. required 필드는 필수, 미기재 선택 필드는 시안 원본 글자가 그대로 유지됨
model"gpt-image-2" | "gpt-image-2.5-flare" | "gpt-image-2.5-sunburst"default: "gpt-image-2"생성에 쓸 이미지 모델. 생략하면 gpt-image-2 입니다. 아래 목록의 문자열을 그대로 넣으세요 — 줄임말(flare, 2.5flare)이나 내부 배포 이름은 받지 않습니다. 목록에 없는 값이면 400 INVALID_REQUEST 입니다.
gpt-image-2 (기본)
gpt-image-2.5-flare
gpt-image-2.5-sunburst
크기 규칙(장변 ≤3840px · 비율 ≤3:1 · 초과 비율은 밴드 합성)은 모든 모델이 같습니다. 재생성(POST /v1/free-images/{id}/regenerate)은 원본과 같은 모델을 상속하며 따로 지정할 수 없습니다.
예시
표준 — 표준 비율 이미지
{
"prompt": "햇살 좋은 봄날의 벚꽃 가득한 캠퍼스, 따뜻한 파스텔 톤",
"width": 3840,
"height": 2160
}배너 — 와이드 배너·전자현수막 (8:1)
{
"prompt": "봄 신입사원 환영 현수막, 밝은 파스텔 배경에 벚꽃 장식, 가운데 환영 문구가 들어갈 여백",
"width": 3840,
"height": 480
}시안(reference) — 등록된 시안 기반 생성 — 필드만 교체
{
"reference": {
"id": "ref_01HXX0KZ8N5R7E2WV9MT3FQGPB",
"fields": {
"main": "영업2팀 가을 워크샵",
"date": "2026.10.03 ~ 05"
}
},
"prompt": "배경을 가을 단풍 느낌으로"
}모델 지정 — 기본 모델 대신 다른 모델로 생성
{
"prompt": "밤바다 위 불꽃놀이, 짙은 남색 하늘",
"width": 1920,
"height": 1080,
"model": "gpt-image-2.5-flare"
}예제 요청 (cURL)
curl -X POST "https://api.sysmate.example/v1/free-images" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt":"햇살 좋은 봄날의 벚꽃 가득한 캠퍼스, 따뜻한 파스텔 톤","width":3840,"height":2160}'응답
| 상태 | 본문 | 설명 |
|---|---|---|
202 | FreeImageResource | 이미지 리소스 생성됨 (status=pending) |
400 | HttpErrorResponse | INVALID_REQUEST |
401 | HttpErrorResponse | UNAUTHORIZED |
404 | HttpErrorResponse | NOT_FOUND — reference 지정 시 해당 시안 id 를 찾을 수 없음(다른 키 소유 포함) |
409 | HttpErrorResponse | IDEMPOTENCY_KEY_CONFLICT |
429 | HttpErrorResponse | RATE_LIMITED(분당 상한 초과) 또는 QUOTA_EXCEEDED(키 한도 소진 — 키 설정에 따라 KST 자정 또는 매월 1일 초기화, error.details.period 참고). error.code 로 구분하고 Retry-After 를 따르세요. 월 한도 키는 Retry-After 가 최대 약 268만 초(31일)까지 커질 수 있어 그 값 그대로 sleep-block 하면 안 됩니다. |
자유 이미지 리소스 조회 (폴링)
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
id | path | string | 예 | — |
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/v1/free-images/:id" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | FreeImageResource | 현재 상태 (succeeded 시 image 인라인) |
404 | — | NOT_FOUND |
완료된 이미지를 기준으로 재생성
succeeded 리소스의 결과 이미지 + 원래 프롬프트를 유지한 채 수정 요청(instruction)을 반영해 새 이미지 리소스를 만듭니다 (202 → 기존 GET 폴링). 재생성 결과를 다시 재생성할 수 있습니다.
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
id | path | string | 예 | 원본(succeeded) 리소스 id |
Idempotency-Key | header | stringminLength: 1maxLength: 255 | — | 같은 키로 24h 내 재호출 시 첫 응답 리플레이. 다른 본문이면 409. |
요청 본문 · application/json · 필수
instructionstring필수minLength: 1maxLength: 1000이전 결과에 대한 수정 요청
imagesarray<object>minItems: 1maxItems: 15추가 참고 이미지 (원본 결과가 자동으로 1번째 참고가 되므로 최대 15장). 극단 비율 원본은 추가 최대 14장.
array<RefImageItem> 의 항목:
urlstring (uri)format: urihttps 공개 이미지 URL
b64stringbase64 인코딩 이미지 (data URI prefix 허용)
descriptionstringmaxLength: 500이 이미지를 결과에 어떻게 반영할지 설명 (선택)
refinebooleanLLM 프롬프트 정제 여부. 생략 시 원본 리소스의 설정을 상속합니다(크기 상속과 같은 규칙).
예시
{
"instruction": "배경을 밤하늘로 바꾸고 조명을 따뜻하게",
"images": [
{
"url": "https://cdn.example.com/logo.png",
"description": "우상단에 로고"
}
]
}예제 요청 (cURL)
curl -X POST "https://api.sysmate.example/v1/free-images/:id/regenerate" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"instruction":"배경을 밤하늘로 바꾸고 조명을 따뜻하게","images":[{"url":"https://cdn.example.com/logo.png","description":"우상단에 로고"}]}'응답
| 상태 | 본문 | 설명 |
|---|---|---|
202 | FreeImageResource | 새 이미지 리소스 생성됨 (status=pending, regeneratedFrom=원본 id) |
400 | HttpErrorResponse | INVALID_REQUEST |
404 | HttpErrorResponse | JOB_NOT_FOUND — 원본 없음 |
409 | HttpErrorResponse | JOB_NOT_READY(원본 미완료) 또는 IDEMPOTENCY_KEY_CONFLICT |
429 | HttpErrorResponse | RATE_LIMITED(분당 상한 초과) 또는 QUOTA_EXCEEDED(키 한도 소진 — 키 설정에 따라 KST 자정 또는 매월 1일 초기화, error.details.period 참고). error.code 로 구분하고 Retry-After 를 따르세요. 월 한도 키는 Retry-After 가 최대 약 268만 초(31일)까지 커질 수 있어 그 값 그대로 sleep-block 하면 안 됩니다. |
시안 목록 (빌트인 + 내가 등록한 것)
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/v1/references" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | object | 목록 |
시안 등록 — AI 가 교체 가능 텍스트 필드를 비동기 검출
요청 본문 · application/json · 필수
imageobject필수url 또는 b64 중 정확히 하나
urlstring (uri)format: urihttps 공개 이미지 URL
b64stringbase64 인코딩 이미지 (PNG/JPEG, 4MB 이하)
namestringmaxLength: 100예제 요청 (cURL)
curl -X POST "https://api.sysmate.example/v1/references" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
202 | Reference | 등록 접수 (status=processing) — status 가 ready 될 때까지 GET 으로 폴링 |
400 | HttpErrorResponse | INVALID_REQUEST — 이미지 형식·크기·URL 오류 |
시안 상세 (검출된 fields 포함)
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
id | path | string | 예 | — |
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/v1/references/:id" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | Reference | 시안 |
404 | HttpErrorResponse | NOT_FOUND — 없거나 접근 불가(다른 키 소유) |
검출 결과 검수·수정 — fields 는 배열 전체 교체
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
id | path | string | 예 | — |
요청 본문 · application/json · 필수
namestringmaxLength: 100fieldsarray<object>minItems: 1maxItems: 20배열 전체 교체(부분 병합 아님) — GET 으로 받은 배열을 고쳐 통째로 보낼 것
array<ReferenceField> 의 항목:
keystring필수pattern: ^[a-z][a-zA-Z0-9]{0,29}$필드 식별자 (생성 요청 reference.fields 의 키)
labelstring필수maxLength: 50사람이 읽는 필드 이름 (예: 중앙 제목, 일시, 장소)
originalstring필수maxLength: 200시안 이미지 속 원본 글자 — 교체 대상. 이미지와 정확히 일치해야 함
requiredboolean필수true 면 생성 시 반드시 값을 넣어야 함
valueTemplatestringmaxLength: 200라벨-빈칸 슬롯용 — 입력이 {v} 에 끼워짐 (선택)
예제 요청 (cURL)
curl -X PATCH "https://api.sysmate.example/v1/references/:id" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | Reference | 수정된 시안 |
400 | HttpErrorResponse | INVALID_REQUEST — 빌트인 수정 시도 · ready 아님 · 필드 규칙 위반 |
404 | HttpErrorResponse | NOT_FOUND — 없거나 접근 불가 |
시안 삭제 (내가 등록한 것만)
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
id | path | string | 예 | — |
예제 요청 (cURL)
curl -X DELETE "https://api.sysmate.example/v1/references/:id" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
204 | — | 삭제됨 |
400 | HttpErrorResponse | INVALID_REQUEST — 빌트인 삭제 시도 |
404 | HttpErrorResponse | NOT_FOUND — 없거나 접근 불가 |
인증
Content Generation API 공통 인증(Bearer) 안내와 키 검증 엔드포인트. AI 생성 기능 진입 전에 GET /v1/auth/verify 로 보유한 키가 유효한지 확인할 수 있습니다 — 유효하면 200, 없거나 잘못됐거나 폐기된 키면 401 입니다. 키가 노출되지 않도록 서버 측에서 호출하세요.
보유한 API 키가 유효한지 확인
요청에 실은 Bearer 키가 유효하면 200 과 키 메타데이터를, 키가 없거나 잘못됐거나 폐기됐거나 만료됐으면 401 을 반환합니다. AI 생성 메뉴 진입 시 사전 점검 용도로 사용하세요 — 200 이면 그대로 진행하고, 401 이면 사용자에게 유효한 키 등록을 안내하면 됩니다.
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/v1/auth/verify" \
-H "Authorization: Bearer $API_KEY"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | VerifyResponse | 키 유효 — 키 메타데이터 반환. |
401 | ErrorEnvelope | 키 누락·잘못된 키·폐기된 키·만료된 키. 코드는 모두 UNAUTHORIZED 이며 만료는 메시지로 구분됩니다. |
운영자 API
키 관리(발급·조회·폐기, 업체명·한도·만료일 수정), 키별 사용량·한도 잔여, 키별 생성 내역을 다루는 운영자용 API. 고객 키(Bearer)가 아니라 관리 토큰 x-admin-token 으로 인증합니다.
발급된 키 목록 조회
전체 키의 메타데이터를 최신순으로 반환합니다. 2026-08-03 이후 발급분은 평문 key 를 포함해 재복사할 수 있습니다. ?label= 로 특정 라벨의 키만 조회할 수 있습니다(정확 일치) — 한도 조정 전에 hash 를 찾는 용도로 편리합니다.
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
label | query | string | — | 라벨 정확 일치 필터. 일치하는 키가 없으면 빈 배열이 아니라 404 — 오타를 '키 없음'으로 오독하지 않게 합니다. 라벨을 바꾼 뒤에는 옛 라벨로 404 입니다.예: 초록우산 |
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/api/admin/keys?label=%EC%B4%88%EB%A1%9D%EC%9A%B0%EC%82%B0" \
-H "x-admin-token: $API_TOKEN"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | KeyListResponse | 키 목록 |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
404 | ErrorResponse | ?label= 필터와 일치하는 키가 없음. |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
키 발급
업체 라벨을 지정해 새 키를 발급합니다. 응답에 평문 key 가 포함되며, 이후 목록 조회(GET)에서도 재조회할 수 있습니다. expiresInMonths 로 만료를 개월 단위로 걸 수 있습니다(선택, 생략 시 만료 없음). 발급 후 조정은 PATCH expiresAt.
요청 본문 · application/json · 필수
labelstring필수고객사명 등 식별 라벨. 앞뒤 공백은 제거되며, 제거 후 빈 문자열이면 400. 라벨은 키와 1:1 — 이미 같은 라벨의 키가 있으면 409 로 거부됩니다(2026-08-20부터). 키 교체 시에는 구 키를 먼저 폐기하거나 새 라벨을 쓰세요. 라벨을 잘못 입력했다면 재발급하지 말고 PATCH newLabel 로 고치세요(키 값이 바뀌지 않아 업체에 다시 전달할 필요가 없습니다).
expiresInMonthsintegermin: 1만료까지 개월 수(선택). 생략하면 만료 없음. 발급일(KST)과 같은 일자 N개월 뒤가 만료일이며 그 전날까지 사용할 수 있습니다 — 예: 5월 12일 발급 3개월 → 8월 12일 만료(8월 11일까지 사용). 같은 일자가 없는 달(1월 31일 + 1개월)이면 그 달을 끝까지 주고 다음 달 1일에 만료합니다.
예제 요청 (cURL)
curl -X POST "https://api.sysmate.example/api/admin/keys" \
-H "x-admin-token: $API_TOKEN"응답
| 상태 | 본문 | 설명 |
|---|---|---|
201 | CreatedApiKey | 발급됨 |
400 | ErrorResponse | label 누락(본문이 JSON 이 아니거나, label 이 문자열이 아니거나, 공백 제거 후 빈 문자열), 또는 expiresInMonths 가 1 이상 정수가 아님. |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
409 | ErrorResponse | 이미 같은 라벨의 키가 있음 — 라벨은 키와 1:1 입니다. |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
키 수정 — 업체명(라벨)·한도(월/일)·만료일
발급된 키의 속성을 수정합니다. 본문의 hash/label 은 대상 키(셀렉터)이고, newLabel·quota·expiresAt 은 바꿀 값입니다 — 바꿀 값은 하나 이상 보냅니다. 업체명을 잘못 등록했으면 newLabel 로 고칩니다(2026-10-07부터). 키 값은 그대로라 업체의 API 호출에는 영향이 없고, 다른 활성 키(만료된 키 포함)와 같은 이름이면 409, 현재 이름과 같으면 변경 없이 200 입니다. 업체명을 바꿀 때는 대상을 hash 로 지정하세요. 생성 한도를 설정하거나(quota: { period, limit }) 해제하고(quota: null = 무제한), 만료일을 설정·연장·정정·해제합니다(expiresAt: "YYYY-MM-DD" KST 날짜 = 이 날부터 사용 불가, null = 만료 없음). 만료된 키는 폐기와 달리 레코드가 남아 있어 만료일을 미루면 즉시 다시 사용할 수 있습니다. 기간(monthly=KST 매월 1일 초기화 / daily=KST 자정 초기화)을 키마다 선택할 수 있습니다. 대상 키는 hash 또는 label(정확 일치) 중 하나로 지정합니다 — 라벨은 키와 1:1 이라 보통 label 만으로 충분하지만, 라벨은 바뀔 수 있으니 시스템에 저장해 두는 식별자는 hash 를 쓰세요. 한도는 키 레코드에만 저장되고 캐시가 없어 다음 생성 요청부터 즉시 반영됩니다 — 되돌리기는 이 API 1회로 끝나며 배포가 필요 없습니다. 한도가 소진되면 생성 요청이 429 QUOTA_EXCEEDED 로 거부됩니다. 소모는 성공 + 진행중 요청만 세고 실패한 요청은 세지 않습니다. period 를 monthly 로 설정하면 소진 시 Retry-After 가 이달 말까지 남은 초 — 최대 약 268만 초(31일)까지 커질 수 있으니, 고객사 연동 시 그 값 그대로 sleep-block 하지 말라고 안내하세요. 옛 dailyLimit 필드로 보내면 400 으로 거부됩니다 — quota: { period: "daily", limit } 로 바꿔 보내세요.
요청 본문 · application/json · 필수
다음 중 하나:
object
object
예시
월 한도 100건(현재 표준) — KST 매월 1일 초기화
{
"label": "초록우산",
"quota": {
"period": "monthly",
"limit": 100
}
}일 한도로 되돌리기 — period 가 바뀌면 리셋 마커는 지워집니다
{
"label": "초록우산",
"quota": {
"period": "daily",
"limit": 10
}
}한도 해제(무제한) — quota 를 null 로 명시
{
"label": "초록우산",
"quota": null
}해시로 지정
{
"hash": "0b6f3625ca59f32f5f879b147d9f0ca71764924dd85720578fe6907b1248824f",
"quota": {
"period": "monthly",
"limit": 100
}
}만료일 설정·연장·정정 — 8월 12일부터 사용 불가(8월 11일까지 사용). 연장은 현재 만료일에 더한 날짜를 보냄
{
"label": "초록우산",
"expiresAt": "2026-08-12"
}만료 해제(만료 없음) — expiresAt 을 null 로 명시
{
"label": "초록우산",
"expiresAt": null
}즉시 차단(과거 날짜) — 폐기와 달리 되돌릴 수 있다 — 날짜를 다시 미루면 재사용
{
"label": "초록우산",
"expiresAt": "2026-01-01"
}업체명(라벨) 변경 — 잘못 등록한 업체명 교정 — 키 값·한도·만료일은 그대로
{
"hash": "0b6f3625ca59f32f5f879b147d9f0ca71764924dd85720578fe6907b1248824f",
"newLabel": "초록우산재단"
}예제 요청 (cURL)
curl -X PATCH "https://api.sysmate.example/api/admin/keys" \
-H "x-admin-token: $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"label":"초록우산","quota":{"period":"monthly","limit":100}}'응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | UpdatedKeyLimit | 갱신됨 |
400 | ErrorResponse | hash·label 이 둘 다 없거나 둘 다 있음, hash 형식 오류, newLabel·quota·expiresAt 모두 누락, newLabel 이 문자열이 아니거나 공백 제거 후 빈 문자열, quota 가 { period, limit≥1 }·null 이 아님, expiresAt 이 YYYY-MM-DD(달력에 있는 날짜)·null 이 아님, 또는 옛 dailyLimit 필드로 보냄 |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
404 | ErrorResponse | 해당 해시 또는 라벨의 키가 없음 |
409 | object | object | 두 경우가 있으며 본문 모양으로 구분합니다. ① 라벨 셀렉터가 같은 라벨의 키 여러 개에 걸림(유일성 강제 2026-08-20 이전 발급분) — candidates 의 hash 로 재지정하세요. ② newLabel 이 다른 활성 키(만료된 키 포함)의 라벨과 같음 — { error } 만 오며, 이때 다른 바꿀 값(quota·expiresAt)도 적용되지 않습니다. |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
키 폐기
해시로 키를 폐기합니다. 폐기는 캐시 없이 즉시 반영되어 해당 키의 API 호출이 곧바로 401 이 됩니다.
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
hash | query | stringpattern: ^[0-9a-f]{64}$ | 예 | 폐기할 키의 sha256 해시(hex 64자). 목록·발급 응답의 hash 값을 사용합니다.예: 91351e313ea08e68fd7b5ad39401e3aedb350845233567950aaa00d6214e95f0 |
예제 요청 (cURL)
curl -X DELETE "https://api.sysmate.example/api/admin/keys?hash=91351e313ea08e68fd7b5ad39401e3aedb350845233567950aaa00d6214e95f0" \
-H "x-admin-token: $API_TOKEN"응답
| 상태 | 본문 | 설명 |
|---|---|---|
204 | — | 폐기됨 (본문 없음) |
400 | ErrorResponse | hash 쿼리 파라미터가 없거나 sha256 hex 형식이 아님. |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
404 | ErrorResponse | 해당 해시의 키가 없음 (이미 폐기되었거나 존재한 적 없음). |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
키별 생성 내역 조회 (갤러리·추적용)
특정 키(사용 업체)가 free-images API 로 생성에 성공한 건을 반환합니다(실패·진행중은 포함하지 않음). 시스메이트가 업체별 갤러리를 만들거나 생성 내역을 추적하는 용도입니다. 재생성은 원본을 뿌리로 하는 스레드로 묶입니다: 항목의 rootId 가 스레드 id, regeneratedFrom 이 부모입니다. view=roots 로 스레드 뿌리만(변형 수·마지막 활동 시각 포함) 받고, rootId=<뿌리 id> 로 그 스레드 전체를 오래된 순으로 받습니다. 기간 제한 없이 전체가 대상이고 from/to 로 좁힐 수 있습니다. 각 항목은 요약이며 상세는 GET /v1/free-images/{id} 로 조회하세요. 썸네일(thumbnailUrl)은 2026-09-03 이후 생성분에 있으며 없으면 image.url(원본, 1~3MB)로 폴백해야 합니다. 이미지 URL 은 인증 없이 공개 서빙되므로 URL 을 아는 누구나 볼 수 있습니다(발급 키 응답과 동일).
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
label | query | string | — | 대상 키의 라벨(정확 일치, 활성 키만). hash 와 둘 중 정확히 하나. 미일치 404, 같은 라벨이 여러 개면 409 + 후보. 라벨은 바뀔 수 있으니(PATCH newLabel) 시스템에 저장해 두는 식별자는 hash 를 쓰세요.예: 초록우산 |
hash | query | stringpattern: ^[0-9a-f]{64}$ | — | 대상 키의 sha256 해시. 키 존재를 요구하지 않아 폐기된 키의 이미지도 조회됩니다(key.label 은 null). |
view | query | "all" | "roots"default: "all" | — | all = 평면 최신순. roots = 재생성 스레드의 뿌리만, 마지막 활동 순 — 항목에 variantCount·threadUpdatedAt 이 붙습니다. |
rootId | query | string | — | 스레드 뿌리 id. 지정하면 그 스레드의 성공 건 전부를 오래된 순으로 반환합니다(view·cursor 무시, 최대 limit). 갤러리에서 뿌리 카드를 펼칠 때 사용. |
from | query | string (date)format: date | — | KST 날짜(YYYY-MM-DD), 이 날 00:00 부터. 생략 시 제한 없음. |
to | query | string (date)format: date | — | KST 날짜(YYYY-MM-DD), 이 날 포함. 생략 시 제한 없음. |
limit | query | integerdefault: 50min: 1max: 200 | — | 페이지 크기. 200 초과는 200 으로 잘립니다. 0·음수·정수 아님은 400. |
cursor | query | string | — | 이전 응답의 nextCursor 그대로. 해석 불가면 400. |
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/api/admin/generations?label=%EC%B4%88%EB%A1%9D%EC%9A%B0%EC%82%B0&hash=:hash&view=:view&rootId=:rootId&from=:from&to=:to&limit=:limit&cursor=:cursor" \
-H "x-admin-token: $API_TOKEN"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | GenerationListResponse | 한 페이지 |
400 | ErrorResponse | label·hash 둘 다/둘 다 없음, hash 형식, view 값, rootId 형식, status 파라미터 사용(없는 파라미터), from/to 형식·순서, limit, cursor 해석 실패 |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
404 | ErrorResponse | label 과 일치하는 활성 키 없음 |
409 | DuplicateLabelError | 같은 라벨의 키가 여러 개 — candidates 의 hash 로 재지정 |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
키별 사용량 조회
기간 내 생성 요청을 키별·일별·엔드포인트별로 집계해 반환합니다. 집계는 전체 이벤트 기준이고, events 상세만 최신순 500건 캡입니다. 사용량 로그는 요청 수락 시 기록되는 편의 계층입니다 — 로깅 실패가 생성을 막지 않으며, 기록 시작 전 데이터는 소급되지 않습니다.
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
from | query | stringpattern: ^\d{4}-\d{2}-\d{2}$ | — | 조회 시작일 YYYY-MM-DD (UTC). 기본값은 to−6일(최근 7일). from ≤ to 여야 합니다.예: 2026-07-29 |
to | query | stringpattern: ^\d{4}-\d{2}-\d{2}$ | — | 조회 종료일 YYYY-MM-DD (UTC). 기본값은 오늘. 기간은 최대 31일입니다.예: 2026-08-04 |
key | query | string | — | 특정 키만 집계 — summary·keyOptions 응답의 keyHash(sha256 hex) 값을 사용합니다. keyOptions 는 필터와 무관하게 전체 키를 유지합니다. |
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/api/admin/usage?from=2026-07-29&to=2026-08-04&key=:key" \
-H "x-admin-token: $API_TOKEN"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | UsageReportResponse | 사용량 리포트 |
400 | ErrorResponse | 날짜 형식 오류, from > to, 또는 기간 31일 초과. |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
키별 한도·잔여 조회 (기간별)
발급된 모든 키의 현재 기간 창(키의 period 에 따라 오늘 또는 이달, KST) 한도·소모·잔여를 한 번에 반환합니다. 소모는 성공 + 진행중이며 실패한 요청은 세지 않습니다(결과물이 나가지 않은 요청은 소모하지 않는다는 정책). 재생성(regenerate)은 결과물이 나가는 별도 생성이라 1회 소모합니다. 한도 게이트와 같은 키 레코드를 읽으므로 값이 항상 일치합니다.
매개변수
| 이름 | 위치 | 타입 | 필수 | 설명 |
|---|---|---|---|---|
hash | query | stringpattern: ^[0-9a-f]{64}$ | — | 키 해시 단건 조회. |
label | query | string | — | 라벨 정확 일치 조회. hash 와 함께 주면 hash 가 우선합니다. 라벨은 바뀔 수 있으니(PATCH newLabel) 시스템에 저장해 두는 식별자는 hash 를 쓰세요.예: 초록우산 |
예제 요청 (cURL)
curl -X GET "https://api.sysmate.example/api/admin/usage/quota?hash=:hash&label=%EC%B4%88%EB%A1%9D%EC%9A%B0%EC%82%B0" \
-H "x-admin-token: $API_TOKEN"응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | KeyQuotaResponse | 키별 한도·잔여. used + exemptedByReset 이 이번 기간의 실제 사용량입니다. |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
404 | ErrorResponse | hash/label 필터와 일치하는 키가 없음 — 오타를 '잔여 없음'으로 오독하지 않게 합니다. |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
이번 기간 한도 초기화(리셋)
대상 키의 이번 기간(daily 키는 오늘, monthly 키는 이달, KST) 사용량을 다시 채웁니다. 사용량 기록은 지우지 않고 리셋 시각(resetAt)을 키에 기록해 그 이전 소모를 제외합니다 — 사용량 리포트·CSV 수치는 그대로입니다. 다음 기간이 시작되면 리셋은 자동으로 효력을 잃어 원래 한도로 돌아갑니다(복구 요청 불필요). 같은 기간에 다시 호출하면 그 시각까지 다시 비워집니다. 한도가 없는(무제한) 키는 400. 언제 쓰나: 고객이 이번 달 한도를 다 썼는데 추가 사용을 허용해야 할 때 — 한도를 올렸다가 다음 달에 다시 내리는 2회 작업 대신 이 API 1회로 끝냅니다. 한도 자체를 바꾸려면 PATCH /api/admin/keys 를 쓰세요(그때 period 가 바뀌면 리셋 마커는 지워집니다). 권장 절차: ① GET /api/admin/usage/quota?label=… 로 used·remaining 확인 → ② 이 API 호출 → ③ 응답의 exemptedCount(이번 리셋으로 면제된 소모 수)·remaining 확인 → ④ 필요하면 GET /api/admin/audit 에서 key.quota.reset 기록 확인. 모든 호출에 x-admin-token 헤더가 필요합니다.
요청 본문 · application/json · 필수
다음 중 하나:
object
object
예시
라벨로 지정(권장) — 라벨은 키와 1:1 — 사람이 치는 경로
{
"label": "초록우산"
}해시로 지정 — 스크립트·자동화 경로. 목록/잔여 조회 응답의 hash 를 그대로
{
"hash": "0b6f3625ca59f32f5f879b147d9f0ca71764924dd85720578fe6907b1248824f"
}예제 요청 (cURL)
curl -X POST "https://api.sysmate.example/api/admin/usage/quota/reset" \
-H "x-admin-token: $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"label":"초록우산"}'응답
| 상태 | 본문 | 설명 |
|---|---|---|
200 | QuotaResetResponse | 리셋됨. resetAt 이 키에 기록되었고, 그 이전 소모 exemptedCount 건이 이번 기간 카운트에서 빠졌습니다. |
400 | ErrorResponse | hash·label 둘 다 없거나 둘 다 있음, hash 형식 오류, 또는 무제한 키(리셋할 한도가 없음) |
401 | ErrorResponse | x-admin-token 이 없거나 일치하지 않음. |
404 | ErrorResponse | 해당 키 없음(라벨 오타 포함) — 빈 응답 대신 404 를 돌려 오타를 '리셋 완료'로 오독하지 않게 합니다. |
409 | DuplicateLabelError | 같은 라벨의 키가 여러 개(유일성 강제 2026-08-20 이전 발급분) — candidates 의 hash 로 재지정하세요. |
503 | ErrorResponse | 서버에 V1_ADMIN_TOKEN 이 설정되지 않아 관리 기능 전체가 잠김. 토큰 없이 배포되는 것을 막기 위한 의도된 동작이며, 인증 실패(401)와 구분됩니다. |
