Designelier

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.

Planning never spends credits. Confirmation reserves the exact quote; you are charged once only after every asset succeeds. Failed jobs release the reservation.

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-packs

Create 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
}
queuedWaiting for a worker. This can occur before planning or immediately after confirmation.
analyzingReading the public page and preparing one recommended pack.
awaiting_confirmationPlanning is complete. Read the immutable quote before confirming.
generatingThe exact quoted credits are reserved while all assets are generated and verified.
succeededEvery manifest file is durable and verified. The reservation becomes one debit.
failedNo files are exposed. Any reservation is released without a charge.

4 · Confirm

POST /v1/artwork-packs/{id}/confirm

Explicitly 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.zip

These 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 useCache-Control: private, no-store.
  • Every error has one shape: error.code, a safeerror.message, and error.request_id.
{
  "error": {
    "code": "quote_mismatch",
    "message": "Confirm the current quote and exact credit amount.",
    "request_id": "019fcbd2-106e-7d33-8608-63df57f70e4d"
  }
}