Clevera REST API 사용하기
사용자 스크립트에서 Clevera를 호출하는 방법: 베이스 URL, Bearer 토큰 인증, 엔드포인트 및 각 엔드포인트에 필요한 권한, 유료 작업을 위한 견적 후 시작 흐름, 멱등성, 오류 형식 및 속도 제한에 대해 알아봅니다.
Clevera의 REST API를 사용하면 사용자 고유의 스크립트와 서비스에서 에이전트가 MCP를 통해 수행할 수 있는 작업(라이브러리 읽기, 영상 및 아티클 요청, 영상 내보내기, 문서 사이트 작업 및 작업 추적)을 수행할 수 있습니다. 이 아티클에서는 베이스 URL, 인증, 유료 작업을 위한 요청 흐름, 오류 및 속도 제한을 다룹니다.
기본 사항
| 베이스 URL | https://app.clevera.ai/api/v1 |
| 인증 | API 토큰을 사용한 Authorization: Bearer <token> (토큰은 clv_agent_로 시작함) |
| 형식 | JSON 입출력. Accept: application/json을 전송하고, 본문이 있는 경우 Content-Type: application/json를 전송합니다. |
| ID | 작업에 대한 job_…와 같은 공개 ID. API가 반환하는 ID를 사용하세요. |
GET /docs/me으로 토큰을 확인하세요:
curl -H "Authorization: Bearer $CLEVERA_TOKEN" \
-H "Accept: application/json" \
https://app.clevera.ai/api/v1/docs/me
응답에는 해당 토큰이 누구를 대신하여 작동하는지(토큰 이름 및 만료일, 사용자 및 현재 역할, 워크스페이스, 범위 내 사이트, 현재 작동 중인 권한(사용자의 현재 역할에 맞춰 조정된 토큰 권한))가 표시됩니다. 호출이 거부되면 먼저 이 호출을 수행하세요.
엔드포인트
각 엔드포인트에는 표시된 권한이 필요합니다. 권한 없이 호출하면 403 forbidden_ability이 반환됩니다. 에이전트 권한을 참조하세요.
라이브러리 및 자료
| 메서드 및 경로 | 권한 | 기능 |
|---|---|---|
GET /create/types |
any | 요청 가능한 영상 및 소셜 클립 유형입니다. |
GET /library |
library:read |
토큰 소유자가 볼 수 있는 영상, 녹화본 및 아티클입니다. |
GET /recordings |
library:read |
녹화본만 해당합니다. |
GET /library/{item} |
library:read |
단일 항목입니다. |
GET /library/{item}/transcript |
library:read |
해당 항목의 스크립트입니다. |
GET /library/{item}/article |
library:read |
해당 항목의 아티클입니다. |
GET /library/{item}/embed |
library:read |
해당 항목의 임베드 코드입니다. |
GET /materials |
library:read |
업로드된 이미지, 영상 및 PDF입니다. |
POST /materials, POST /materials/import, POST /materials/uploads, POST /materials/uploads/{upload_id}/complete |
materials:write |
이미지, 영상 또는 PDF를 추가합니다(직접 업로드, URL에서 가져오기 또는 대용량 업로드). |
영상 및 아티클
| 메서드 및 경로 | 권한 | 기능 |
|---|---|---|
POST /videos/quotes |
videos:create |
녹화본에서 영상(type: how_to, product_demo, cleanup, styled_video), 녹화본에서 아티클(article) 또는 번역(translation)을 견적합니다. |
POST /videos |
videos:create + credits:spend |
견적된 영상을 생성합니다(quote_id). |
POST /articles/from-recording |
videos:create + credits:spend |
견적된 아티클을 생성합니다. |
POST /videos/translations |
videos:create + credits:spend |
견적된 번역을 생성합니다. |
POST /clips/quotes |
videos:create |
소셜 클립을 견적합니다(GET /create/types의 유형). |
POST /clips |
videos:create + credits:spend |
견적된 소셜 클립을 생성합니다. |
POST /videos/{video_id}/exports |
videos:export |
MP4 렌더링: resolution 1080p(기본값), 2k 또는 4k; 항상 60fps. 무료입니다. |
작업 및 크레딧
| 메서드 및 경로 | 권한 | 기능 |
|---|---|---|
POST /quotes |
작업 권한 | 모든 작업 유형에 대한 견적입니다. |
POST /jobs |
작업 권한 (+ 유료 시 credits:spend) |
견적된 작업을 시작합니다. |
GET /jobs |
jobs:read |
작업 목록을 표시합니다. |
GET /jobs/{job} |
jobs:read |
단일 작업의 상태 및 결과입니다. |
GET /jobs/{job}/wait |
jobs:read |
폴링 대신 변경 사항을 기다립니다. |
GET /jobs/{job}/events |
jobs:read |
작업의 진행 상황 이벤트입니다. |
POST /jobs/{job}/cancel |
jobs:read |
작업을 취소합니다. 너무 늦은 경우: "이 작업은 더 이상 취소할 수 없습니다." |
GET /credits |
credits:spend 또는 jobs:read |
워크스페이스의 크레딧 잔액입니다. |
문서 사이트
| 메서드 및 경로 | 권한 | 기능 |
|---|---|---|
GET /docs/sites, GET /docs/sites/{site}, GET /docs/sites/{site}/tree, GET /docs/sites/{site}/pages |
content:read |
토큰 범위 내의 사이트 및 해당 페이지입니다. |
GET /docs/sites/{site}/search, GET /docs/pages/{page}, GET /docs/pages/{page}/revisions |
content:read |
초안을 포함하여 페이지를 검색하고 읽습니다. |
POST /docs/sites/{site}/articles, PATCH /docs/pages/{page}/article, POST /docs/pages/{page}/review |
articles:write |
아티클 초안을 생성 및 편집하고 검토를 위해 제출합니다. 라이브 아티클은 site:publish도 필요합니다. |
PATCH /docs/pages/{page}, DELETE /docs/pages/{page}, POST /docs/sites/{site}/sections, PATCH /docs/sections/{section} |
structure:write |
페이지 및 섹션을 이동, 이름 변경, 숨기기 및 제거합니다. |
GET/POST /docs/sites/{site}/site-pages, PUT /docs/site-pages/{page}/body |
content:read / site-pages:write |
홈, 연락처 및 법적 고지 페이지입니다. |
GET/POST /docs/sites/{site}/changelog, PATCH /docs/changelog/{entry} |
content:read / changelog:write |
변경 로그 항목을 초안으로 작성합니다. |
POST /docs/media, POST /docs/media/uploads |
media:write |
이미지를 업로드합니다. |
POST /docs/sites/{site}/publish, POST /docs/pages/{page}/ready, POST /docs/changelog/{entry}/publish |
site:publish |
독자가 볼 수 있도록 게시합니다. |
GET /insights/sites/{site}, …/gaps, …/feedback |
insights:read |
검색 격차, 답변되지 않은 질문, 페이지 피드백입니다. |
PATCH /docs/sites/{site}/settings, …/appearance, PUT …/navigation, POST …/redirects |
site:configure |
사이트 설정입니다. |
POST /docs/sites |
sites:create |
문서 사이트를 생성합니다. |
에이전트 및 문서 사이트에 대한 자세한 정보: AI 에이전트를 문서 사이트에 연결하기.
유료 작업 요청
크레딧이 소모되는 작업은 항상 견적을 먼저 받은 후 시작해야 합니다:
- 견적 받기. 원하는 작업과 함께
POST /videos/quotes(또는/clips/quotes)을 호출합니다. 응답에는quote_id와 크레딧 범위가 포함됩니다. 견적은 15분 동안 유효하며 한 번 사용할 수 있습니다. - 선택적으로 드라이런(dry-run) 수행.
"dry_run": true과 함께 시작 요청을 보내 작업이 시작될지, 승인이 필요한지, 차단될지 확인합니다. 아무것도 작성되지 않습니다. - 작업 시작.
quote_id및Idempotency-Key헤더와 함께POST /videos를 호출합니다. 응답은 작업이 포함된202입니다. - 작업 추적. 작업의
status가 변경될 때까지GET /jobs/{job}/wait을 호출하거나 웹훅을 수신 대기합니다.
curl -X POST https://app.clevera.ai/api/v1/videos/quotes \
-H "Authorization: Bearer $CLEVERA_TOKEN" -H "Content-Type: application/json" \
-d '{"type": "how_to", "recording_id": "<recording id>", "language": "en-US"}'
curl -X POST https://app.clevera.ai/api/v1/videos \
-H "Authorization: Bearer $CLEVERA_TOKEN" -H "Content-Type: application/json" \
-H "Idempotency-Key: 3f6c1a2e-8d4b-4f7a-9c1e-2b5d7e9f0a13" \
-d '{"quote_id": "<quote id>"}'
작업 상태:
| 상태 | 의미 |
|---|---|
queued |
수락됨, 실행 예정입니다. |
running |
실행 중입니다. |
needs_input |
사람의 승인을 기다리는 중입니다(보통 에이전트 요청에서 승인). 작업에는 링크와 만료 시간이 포함됩니다. |
succeeded |
완료되었습니다. 작업은 새 영상이나 아티클로 연결됩니다. |
failed |
실패했습니다. 작업에 error_code가 포함되어 있습니다. |
canceled |
취소되었거나 승인이 거부되었습니다. |
expired |
24시간 이내에 승인되지 않았습니다. |
시작 요청이 즉시 실행될지 아니면 사람의 승인을 기다릴지는 토큰의 지출 한도와 아래에서 자동 승인 설정에 따라 다릅니다. 에이전트 지출 및 승인 제어하기를 참조하세요.
재시도 및 멱등성
모든 생성 및 시작 요청 시 Idempotency-Key 헤더(작업당 새로운 UUID)를 전송하세요. 네트워크 오류로 인해 동일한 키와 본문으로 재시도하면 두 번째 영상이 생성되는 대신 첫 번째 응답이 반환됩니다. 키는 24시간 동안 유지됩니다.
| 코드 | 의미 |
|---|---|
idempotency_key_reused |
본문이 다른 동일한 키입니다. 새 요청에는 새 키를 사용하세요. |
idempotency_in_progress |
이 키를 사용한 첫 번째 요청이 여전히 실행 중입니다. 기다렸다가 재시도하세요. |
idempotency_conflict |
"이 멱등성 키는 다른 요청에 사용되었습니다." |
오류
모든 오류는 동일한 형식을 가지며, 다음에 수행할 작업을 알려주는 메시지가 포함되어 있습니다:
{
"error": {
"code": "forbidden_ability",
"message": "This token lacks the videos:create ability. Ask the workspace member who owns it for a token that has it.",
"details": { "ability": "videos:create" }
},
"request_id": "req_example"
}
지원팀에 문의할 때 request_id을 포함하세요.
| HTTP | 코드 | 일반적인 원인 |
|---|---|---|
| 401 | unauthenticated, token_expired, token_revoked |
토큰 없음, 잘못된 토큰, 만료된 토큰 또는 취소된 토큰입니다. |
| 402 | insufficient_credits |
워크스페이스에 견적을 위한 크레딧이 부족합니다. |
| 403 | forbidden_ability, forbidden_role, forbidden_item, ip_not_allowed, live_content_needs_publish, site_paused, forbidden |
권한 누락, 소유자의 역할, 컬렉션 액세스 또는 IP 허용 목록 문제입니다. |
| 403 | plan_locked |
"에이전트 API는 이 워크스페이스의 플랜에 포함되어 있지 않습니다. Pro 플랜 이상에서 사용할 수 있습니다." |
| 404 | not_found, unknown_kind |
"이 토큰 범위 내에 해당 ID를 가진 항목이 없습니다. 먼저 목록을 조회하거나 검색한 후 반환된 ID를 사용하세요." |
| 409 | revision_conflict, quote_used, not_cancelable, idempotency_* |
콘텐츠가 변경되었거나, 견적이 사용되었거나, 재시도 충돌이 발생했습니다. |
| 410 | quote_expired |
"이 견적은 만료되었습니다. 새 견적을 요청하세요." |
| 413 | unsupported_media |
파일이 너무 크거나 지원되지 않는 유형입니다. |
| 422 | validation_failed, invalid_input, quote_mismatch, limit_reached |
필드가 잘못되었습니다. details에서 해당 필드 이름을 확인할 수 있습니다. |
| 429 | rate_limited, cap_exceeded, busy |
요청 과다, 지출 한도 초과 또는 두 개의 시작 요청이 동시에 발생했습니다. |
모든 메시지와 해결 방법: 에이전트 및 API 오류 수정하기.
속도 제한
| 제한 | 값 | 메시지 |
|---|---|---|
| 토큰당 요청 | 분당 300회 | "이 토큰의 요청 속도가 제한을 초과했습니다. 기다렸다가 재시도하세요." |
| 워크스페이스당 요청 | 분당 1,200회(모든 토큰 합산) | "이 워크스페이스의 에이전트 요청 속도가 제한을 초과했습니다. 기다렸다가 재시도하세요." |
| 토큰당 쓰기 | 분당 60회 | "이 토큰의 쓰기 요청이 너무 많습니다. 기다렸다가 재시도하세요." |
| 토큰당 일일 쓰기 | 2,000회 | "이 토큰의 일일 쓰기 제한에 도달했습니다. 내일 다시 시도하세요." |
| 토큰당 게시 | 시간당 10회 | "이 토큰의 시간당 게시 제한에 도달했습니다. 나중에 다시 시도하세요." |
| 유료 시작 | 토큰당 시간당 20회, 워크스페이스당 일일 100회 | retry_after과 함께 rate_limited |
| 업로드 | 분당 30회; 토큰당 일일 500MB; 파일당 25MB | "이 토큰의 업로드 요청이 너무 많습니다. 기다렸다가 재시도하세요." / "이 토큰의 일일 업로드 용량 제한에 도달했습니다. 내일 다시 시도하세요." |
| 유효한 토큰 없는 호출 | IP 주소당 분당 60회 | "요청이 너무 많습니다. 기다렸다가 재시도하세요." |
429 응답에는 Retry-After 헤더와 본문에 retry_after(초)가 포함됩니다. 재시도하기 전에 해당 시간만큼 기다리세요. 읽기, 견적 및 상태 확인은 크레딧을 소모하지 않습니다.