API로 생성 작업을 만들려면 유료 크레딧 팩이나 활성 유료 구독이 필요하며, 유료 크레딧만 사용합니다. 조회, 목록, 다운로드는 계정의 어떤 키로도 할 수 있습니다.
빠른 시작
API 키 페이지에서 키를 만들고, 서버에만 두고, API_KEY로 설정하세요. 아래 예시는 seed-audio-1.0(으)로 생성 작업을 만들고, 끝날 때까지 조회한 뒤, 첫 파일을 내려받습니다.
새 요청마다 새 Idempotency-Key를 보내세요. 응답을 받지 못한 요청은 같은 키와 같은 본문으로 다시 보내면 됩니다. 첫 요청이 만든 작업을 받으며 청구는 한 번뿐입니다.
cURL
export API_ORIGIN='https://demo.freshapp.ai'
export API_KEY='sk_YOUR_API_KEY'
curl --fail-with-body "$API_ORIGIN/api/v1/generations" \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: order-1001' \
-d '{"model":"seed-audio-1.0","input":{"prompt":"새벽녘 절벽 위의 등대, 잔잔한 바다, 부드러운 빛."}}'
# Read it every 5 to 10 seconds until its status ends.
curl --fail-with-body "$API_ORIGIN/api/v1/generations/GENERATION_ID" \
-H "Authorization: Bearer $API_KEY"
# A delivered output's url is a signed link: no key needed.
curl --fail-with-body -o result "OUTPUT_URL"
TypeScript 클라이언트
import { createClient } from './open-api-client';
const client = createClient({
baseUrl: "https://demo.freshapp.ai",
apiKey: process.env.API_KEY, // on your server only
});
const generation = await client.create(
{
"model": "seed-audio-1.0",
"input": {
"prompt": "새벽녘 절벽 위의 등대, 잔잔한 바다, 부드러운 빛."
}
},
{ idempotencyKey: "order-1001" }
);
const done = await client.wait(generation.id);
for (const output of done.outputs)
if (output.status === 'delivered') {
const file = await client.download(output);
// file.body is the output, as output.content_type says
}
React 훅
import { createClient } from './open-api-client';
import { useGeneration } from './open-api-react';
// In a browser on this site: no key, the visitor's own session.
const client = createClient();
export function Progress({ id }: { id: string }) {
const { generation, error, done } = useGeneration(client, id);
if (error) return <p>{String(error)}</p>;
return <p>{generation?.status ?? '…'}{done ? ' ✓' : ''}</p>;
}
키와 권한
모든 요청은 API 키 페이지에서 만든 키를 Authorization: Bearer에 담아 보냅니다. 키는 sk_ 뒤에 영문자, 숫자, 하이픈, 밑줄 43자가 붙은 형태이며, 만들거나 교체할 때 한 번만 보입니다. Authorization이 있는 요청은 키로만 판단하며, 함께 있는 로그인 세션은 쓰지 않습니다.
키는 읽기만 하거나(목록, 조회, 다운로드) 생성까지 할 수 있습니다(생성과 취소). 읽기 전용 키로 생성이나 취소를 시도하면 403 insufficient_scope가 되고 아무것도 기록되지 않습니다.
키에는 주소와 네트워크로 된 IP 허용 목록을 붙일 수 있으며, 다른 주소에서 오면 403 ip_not_allowed가 됩니다. 키 권한을 넓히거나 한도를 올리거나 허용 목록을 넓히려면 최근 로그인이 필요하지만, 좁힐 때는 필요 없습니다.
키를 교체하면 즉시 새 값이 생기고 이전 값은 멈춥니다. 키를 폐기하면 영구히 멈춥니다. 아직 모델에 보내지 않은 작업은 취소되어 크레딧이 돌아오고, 이미 진행 중인 작업은 그대로 끝납니다.
유료 이용 자격이 있는 계정만 API로 생성 작업을 만들 수 있으며(아니면 403 not_eligible), API는 유료 크레딧만 씁니다(부족하면 402 insufficient_credits). 선물·출석 크레딧은 웹사이트용으로 남습니다.
생성 API 엔드포인트
모든 경로는 이 사이트에 있습니다. 요청과 응답 본문은 결과 파일을 빼고 모두 JSON입니다.
https://demo.freshapp.ai
메서드
경로
필요한 권한
하는 일
POST
/api/v1/generations
generations:write
생성 작업을 만듭니다. Idempotency-Key가 필요하며 202와 작업을 돌려줍니다.
GET
/api/v1/generations
generations:read
계정의 생성 작업을 최신순으로 한 페이지씩 돌려줍니다(limit, cursor, module). 텍스트 작업은 ID로만 조회합니다.
GET
/api/v1/generations/{id}
generations:read
계정의 생성 작업 하나를 출력, 크레딧, 종료 이유와 함께 돌려줍니다.
POST
/api/v1/generations/{id}/cancel
generations:write
아직 모델에 보내지 않은 작업을 취소하고 크레딧을 돌려줍니다.
GET, HEAD
/api/media/{id}
generations:read (또는 서명된 링크)
출력의 파일이며 바이트 범위는 하나까지입니다. 서명된 링크는 키가 필요 없고 어느 주소에서든 열립니다.
모델과 가격
이 사이트에서 활성화된 모델을 API에서 쓰는 형태로 보여 줍니다. ID는 model에, 필드는 input에 넣으세요. 요청은 만들 때 가장 비싼 결과의 금액을 잡아 두고, 끝나면 전달된 만큼만 냅니다.
계정에서 동시에 실행되는 생성 작업은 최대 2개이며, 더 만들면 429 too_many_active로 기다려야 합니다.
요청 본문은 최대 32 KiB의 JSON이며, 더 크면 413 request_too_large가 됩니다.
오류 코드
오류는 {"error": {"code": …, "message": …}} 형태로 옵니다. code는 언제나 아래 표 중 하나이고, message는 개발자를 위한 영어 설명입니다. 429와 503은 기다릴 초를 Retry-After에 담습니다. 실패하거나 취소된 작업은 작업용으로 표시된 코드 중 하나를 error 필드에 담습니다.
HTTP
코드
의미
할 일
401
invalid_credential
API 키가 없거나, 형식이 잘못되었거나, 존재하지 않거나, 폐기 또는 교체되었습니다.
API 키와 그 권한, 허용 목록을 확인하세요.
401
credential_revoked
요청 처리 중에 키가 폐기되거나 교체되었습니다. 폐기된 키의 대기 중인 작업은 취소되고 크레딧이 돌아옵니다.
API 키와 그 권한, 허용 목록을 확인하세요.
403
insufficient_scope
이 키로는 할 수 없는 일입니다. 필요한 권한은 오류의 required_scope에 있습니다.
API 키와 그 권한, 허용 목록을 확인하세요.
403
ip_not_allowed
이 주소에서는 이 키를 쓸 수 없습니다. 키의 IP 허용 목록 밖입니다.
API 키와 그 권한, 허용 목록을 확인하세요.
401
unauthorized
웹사이트 로그인이 끝났습니다. 다시 로그인하세요.
요청을 고친 뒤 다시 보내세요.
403
invalid_origin
웹사이트 요청은 이 사이트 자체에서 와야 합니다.
요청을 고친 뒤 다시 보내세요.
403
forbidden
신뢰할 수 있는 클라이언트 주소가 없는 요청입니다.
사이트 지원팀에 문의하세요.
400
invalid_request
요청 형식이 잘못되었습니다(JSON, 헤더(Idempotency-Key, Content-Type), 또는 쿼리).
요청을 고친 뒤 다시 보내세요.
400
invalid_input
입력이 모델의 필드에 맞지 않거나, 모델이 쓸 수 없는 입력입니다.
요청을 고친 뒤 다시 보내세요.
413
request_too_large
요청 본문이 너무 큽니다.
요청을 고친 뒤 다시 보내세요.
409
idempotency_conflict
이 Idempotency-Key는 이미 다른 요청에 쓰였습니다.
요청을 고친 뒤 다시 보내세요.
404
model_unavailable
모델이 없거나 지금은 쓸 수 없습니다.
요청을 고친 뒤 다시 보내세요.
404
not_found
이 계정에는 그런 경로, 작업, 파일이 없습니다.
요청을 고친 뒤 다시 보내세요.
405
method_not_allowed
이 경로는 이 메서드를 받지 않습니다. 받는 메서드는 Allow에 있습니다.
요청을 고친 뒤 다시 보내세요.
409
not_cancelable
작업이 이미 모델로 보내졌거나 끝났습니다.
요청을 고친 뒤 다시 보내세요.
409
not_ready
파일이 아직 준비되지 않았습니다.
Retry-After만큼 기다린 뒤 다시 보내세요.
410
expired
보관 기간이 지나 파일이 삭제되었습니다.
요청을 고친 뒤 다시 보내세요.
400
request_limit_exceeded
이 요청의 비용이 max_credits나 키 또는 사이트의 요청당 한도를 넘습니다.
요청을 고친 뒤 다시 보내세요.
403
not_eligible
API로 생성하려면 유료 계정이 필요합니다.
크레딧 팩이나 요금제를 구매하세요. API는 유료 크레딧만 씁니다.
403
email_unverified
생성하려면 계정 이메일을 인증하세요.
요청을 고친 뒤 다시 보내세요.
402
insufficient_credits
크레딧이 부족합니다. API는 유료 크레딧만 씁니다.
크레딧 팩이나 요금제를 구매하세요. API는 유료 크레딧만 씁니다.
403
generation_restricted
콘텐츠 거절이 반복되어 이 계정의 생성이 일시 중지되었습니다. 언제까지인지는 ends_at에 있습니다.
사이트 지원팀에 문의하세요.
403
trial_paused
체험 출력이 여러 번 체험 한도를 넘어 이 계정의 웹사이트 체험이 일시 중지되었습니다. 언제까지인지는 ends_at에 있습니다. 체험이 아닌 요청은 평소처럼 처리됩니다.
요청을 고친 뒤 다시 보내세요.
429
key_daily_limit_exceeded
이 키의 하루 사용 한도에 도달했습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 다음 UTC 날까지.
429
account_daily_limit_exceeded
계정의 API 하루 사용 한도에 도달했습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 다음 UTC 날까지.
429
rate_limited
짧은 시간에 요청이 너무 많습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 한도 구간의 남은 시간.
429
too_many_active
계정에서 실행 중인 작업이 너무 많습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 30초.
429
too_many_under_review
계정의 일부 작업이 수동 확인을 기다리고 있습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 3,600초.
503
busy
지금 사이트 전체에서 실행 중인 작업이 너무 많습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 30초.
503
paused
생성이 잠시 중지되었습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 60초.
503
temporarily_unavailable
지금은 요청을 마칠 수 없습니다.
같은 Idempotency-Key로 같은 요청을 다시 보내세요. Retry-After: 60초.
503
api_unavailable
이 사이트에서는 아직 생성을 쓸 수 없습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 60초.
503
retry
요청 처리 중에 키 설정 같은 것이 바뀌었습니다.
같은 Idempotency-Key로 같은 요청을 다시 보내세요. Retry-After: 60초.
503
unavailable
파일에 잠시 접근할 수 없습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 60초.
500
internal_error
사이트에 문제가 생겼습니다.
같은 Idempotency-Key로 같은 요청을 다시 보내세요.
400
request_failed
전용 코드가 없는 이유로 요청이 거절되었습니다.
사이트 지원팀에 문의하세요.
400
captcha_required
웹사이트의 보안 확인을 마치세요.
요청을 고친 뒤 다시 보내세요.
403
captcha_failed
웹사이트의 보안 확인을 통과하지 못했습니다.
요청을 고친 뒤 다시 보내세요.
503
captcha_unavailable
웹사이트의 보안 확인을 쓸 수 없습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 60초.
400
reference_unavailable
참조한 업로드가 없거나 이 계정의 것이 아닙니다.
요청을 고친 뒤 다시 보내세요.
413
reference_too_large
참조하는 업로드는 합쳐서 최대 10MB입니다.
요청을 고친 뒤 다시 보내세요.
503
reference_storage_unavailable
참조 파일 저장소를 쓸 수 없습니다.
Retry-After만큼 기다린 뒤 다시 보내세요. Retry-After: 60초.
409
storage_quota_exceeded
계정의 저장 공간이 가득 찼습니다.
사이트 지원팀에 문의하세요.
작업 안
canceled
작업이 보내지기 전에 취소되었고 크레딧은 돌아왔습니다.
요청을 고친 뒤 다시 보내세요.
작업 안
submission_expired
작업을 제시간에 보내지 못해 크레딧이 돌아왔습니다.
같은 Idempotency-Key로 같은 요청을 다시 보내세요.
작업 안
model_busy
모델이 바빠서 크레딧이 돌아왔습니다.
Retry-After만큼 기다린 뒤 다시 보내세요.
작업 안
content_rejected
콘텐츠 안전 검사에서 입력이나 출력이 거절되었습니다.
요청을 고친 뒤 다시 보내세요.
작업 안
result_expired
결과를 제시간에 저장하지 못했습니다.
사이트 지원팀에 문의하세요.
작업 안
generation_failed
생성에 실패했습니다.
사이트 지원팀에 문의하세요.
작업 안
delivery_failed
결과를 전달하지 못해 크레딧이 돌아왔습니다.
사이트 지원팀에 문의하세요.
작업 안
trial_limit_exceeded
웹사이트 체험의 출력이 체험 한도를 넘어 전달되지 않았고 크레딧이 돌아왔습니다.
요청을 고친 뒤 다시 보내세요.
TypeScript 클라이언트와 React 훅
TypeScript 클라이언트 open-api-client.ts는 다른 패키지가 필요 없고 서버, 워커, 브라우저에서 실행됩니다. 서버에서는 baseUrl과 apiKey를 주고, 이 사이트의 브라우저 페이지에서는 둘 다 주지 않으면 방문자 자신의 로그인 세션으로 요청합니다.
create는 Idempotency-Key(지정한 값 또는 새 무작위 값)를 보내고, 연결 끊김, 5xx, 429, 408이 오면 Retry-After만큼 기다린 뒤 같은 요청을 다시 보냅니다. 포기할 때는 오류에 키가 담겨 있어 나중에 그 키로 다시 보낼 수 있습니다. localStorage 같은 store를 주면 페이지를 새로 고쳐도 처음 키를 유지합니다.
wait는 작업이 끝날 때까지 조회합니다. 처음에는 5초, 이후 최대 10초 간격이며 중단하면 바로 멈춥니다. download는 출력의 파일을 받아 오며, 키는 이 사이트의 서명되지 않은 링크에만 붙입니다.
React 훅 open-api-react.ts는 클라이언트의 wait로 작업 하나를 따라가고, 컴포넌트가 언마운트되면 멈춥니다. 두 파일을 내려받아 같은 곳에 두고 확장자를 .ts로 바꾸세요.