API v1 · URL artwork packs
One URL in. One coherent animated pack out.
The API plans a recommended pack from a public website, gives you an exact credit quote, and generates only after you explicitly confirm that quote.
1 · Authenticate
Use a Bearer API key
Create a key in Studio. It is shown once. Keep it in an environment variable and send it only to https://app.designelier.com.
export DESIGNELIER_API_KEY="dsg_live_…"
export DESIGNELIER_API="https://app.designelier.com"
curl --fail-with-body \
--header "Authorization: Bearer $DESIGNELIER_API_KEY" \
"$DESIGNELIER_API/v1/account"2 · Plan
POST /v1/artwork-packsCreate a plan without spending
The only input is a public HTTP(S) URL and an optional display name. Every write needs a caller-generated Idempotency-Key.
curl --fail-with-body \
--request POST \
--header "Authorization: Bearer $DESIGNELIER_API_KEY" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: plan_$(uuidgen)" \
--data '{"url":"https://example.com","name":"Launch pack"}' \
"$DESIGNELIER_API/v1/artwork-packs"The response is 202 Accepted. Save its idor the Location header, then poll the pack resource.
3 · Poll & inspect
GET /v1/artwork-packs/{id}Wait for the exact quote
curl --fail-with-body \
--header "Authorization: Bearer $DESIGNELIER_API_KEY" \
"$DESIGNELIER_API/v1/artwork-packs/$PACK_ID"{
"id": "5312e731-8290-49e8-a534-d58715044364",
"state": "awaiting_confirmation",
"name": "Launch pack",
"url": "https://example.com/",
"created_at": "2026-08-04T10:00:00.000Z",
"updated_at": "2026-08-04T10:00:08.000Z",
"quote": {
"id": "ddafc447-71e8-44a1-acf7-e34e1062be93",
"credits": 9,
"expires_at": "2026-08-04T10:15:08.000Z"
},
"assets": [],
"error": null
}4 · Confirm
POST /v1/artwork-packs/{id}/confirmExplicitly approve the spend
Copy both values from the current quote. A stale quote ID, an expired quote, or any different credit value is rejected without spending.
export QUOTE_ID="ddafc447-71e8-44a1-acf7-e34e1062be93"
export QUOTED_CREDITS=9
curl --fail-with-body \
--request POST \
--header "Authorization: Bearer $DESIGNELIER_API_KEY" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: confirm_$(uuidgen)" \
--data "{"quote_id":"$QUOTE_ID","confirmed_credits":$QUOTED_CREDITS}" \
"$DESIGNELIER_API/v1/artwork-packs/$PACK_ID/confirm"5 · Download
Verify the successful manifest
A successful pack includes up to 16 immutable SVG entries. Each has a repository-relative path underpublic/designelier/{pack-id}/, byte size, SHA-256 digest, media type, and authenticated content URL.
curl --fail --location \
--proto '=https' \
--header "Authorization: Bearer $DESIGNELIER_API_KEY" \
"$DESIGNELIER_API/v1/artwork-packs/$PACK_ID/assets/$ASSET_ID/content" \
--output hero.svg
# Or download the complete archive
curl --fail --location \
--proto '=https' \
--header "Authorization: Bearer $DESIGNELIER_API_KEY" \
"$DESIGNELIER_API/v1/artwork-packs/$PACK_ID/download" \
--output designelier-pack.zipThese endpoints return a short-lived redirect to private storage. Normal curl and fetch behavior strips Authorization on a cross-origin redirect; never use--location-trusted.
Behavior
Retries, errors, and limits
- Repeating a write with the same key and canonically identical JSON replays its original status and body. A different body with that key returns 409.
- JSON bodies are capped at 4,096 bytes and JSON responses at 256 KiB. Unknown request fields are rejected.
- Rate limits return 429 with
Retry-After. In-progress status responses may also suggest a polling interval. - Cross-account pack, asset, and download lookups return 404. API responses use
Cache-Control: private, no-store. - Every error has one shape:
error.code, a safeerror.message, anderror.request_id.
{
"error": {
"code": "quote_mismatch",
"message": "Confirm the current quote and exact credit amount.",
"request_id": "019fcbd2-106e-7d33-8608-63df57f70e4d"
}
}