Delivery API

Public endpoints for delivering assets and fetching published widgets.

The delivery API provides public access to assets and published widgets. Asset delivery requires no authentication. Widget delivery requires an API key.

Deliver asset

Deliver a single asset with optional on-the-fly image transformations.

GET/api/v1/deliver/{projectId}/{assetId}

Path parameters

NameTypeDefaultDescription
projectId*UUIDProject ID
assetId*UUIDAsset ID

Query parameters

NameTypeDefaultDescription
wintTarget width in pixels
hintTarget height in pixels
formatstringOutput format: webp, jpeg, png

Examples

Original image
GET /api/v1/deliver/770e8400-.../880e8400-...
Resize to 800px wide
GET /api/v1/deliver/770e8400-.../880e8400-...?w=800
Resize and convert to WebP
GET /api/v1/deliver/770e8400-.../880e8400-...?w=800&h=600&format=webp

Response

Returns raw image bytes with the appropriate Content-Type header.

Cache headers

Cache-Control: public, max-age=31536000, immutable

Assets are served with immutable cache headers (1 year). This is safe because asset content never changes — if you need a different version, use different query parameters.

Fetch published widget

Fetch a published widget's configuration and assets.

GET/api/v1/widgets/{widgetSlug}API Key

Path parameters

NameTypeDefaultDescription
widgetSlug*stringThe widget's slug identifier

Authentication

Pass an API key via header or query parameter:

Header
curl https://your-api.com/api/v1/widgets/hero-carousel \
-H "X-API-Key: pk_550e8400e29b41d4a716446655440000"
Query parameter
curl "https://your-api.com/api/v1/widgets/hero-carousel?api_key=pk_550e8400e29b41d4a716446655440000"

Response 200

Response
{
"widget": {
  "id": "aa0e8400-e29b-41d4-a716-446655440000",
  "slug": "hero-carousel",
  "layout": "CAROUSEL",
  "config": "{"autoplay":true,"autoplay_speed":3000,"show_dots":true}",
  "theme": "{"border_radius":12}"
},
"assets": [
  {
    "id": "880e8400-e29b-41d4-a716-446655440000",
    "url": "https://your-api.com/api/v1/deliver/770e8400-.../880e8400-...",
    "filename": "hero-1.jpg",
    "contentType": "image/jpeg",
    "width": 1920,
    "height": 1080,
    "altText": "Hero banner image"
  },
  {
    "id": "880e8400-e29b-41d4-a716-446655440001",
    "url": "https://your-api.com/api/v1/deliver/770e8400-.../880e8400-...",
    "filename": "hero-2.jpg",
    "contentType": "image/jpeg",
    "width": 1920,
    "height": 1080,
    "altText": null
  }
]
}

Error responses

| Status | Cause | |---|---| | 401 | Missing or invalid API key | | 403 | API key does not have access to this project | | 404 | Widget not found or not published |

The config and theme fields in the response are JSON strings. The Android SDK parses these automatically. If you're building a custom client, parse them as JSON objects.