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.
/api/v1/deliver/{projectId}/{assetId}Path parameters
| Name | Type | Default | Description |
|---|---|---|---|
projectId* | UUID | — | Project ID |
assetId* | UUID | — | Asset ID |
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
w | int | — | Target width in pixels |
h | int | — | Target height in pixels |
format | string | — | Output format: webp, jpeg, png |
Examples
GET /api/v1/deliver/770e8400-.../880e8400-...GET /api/v1/deliver/770e8400-.../880e8400-...?w=800GET /api/v1/deliver/770e8400-.../880e8400-...?w=800&h=600&format=webpResponse
Returns raw image bytes with the appropriate Content-Type header.
Cache headers
Cache-Control: public, max-age=31536000, immutableAssets 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.
/api/v1/widgets/{widgetSlug}API KeyPath parameters
| Name | Type | Default | Description |
|---|---|---|---|
widgetSlug* | string | — | The widget's slug identifier |
Authentication
Pass an API key via header or query parameter:
curl https://your-api.com/api/v1/widgets/hero-carousel \
-H "X-API-Key: pk_550e8400e29b41d4a716446655440000"curl "https://your-api.com/api/v1/widgets/hero-carousel?api_key=pk_550e8400e29b41d4a716446655440000"Response 200
{
"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.