Design review lives on versioned assets. Staff can also share a guest link so clients approve without a portal account.
Assets & versions
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/designs |
List designs across projects |
| GET | /v1/projects/:id/designs |
List designs for a project |
| POST | /v1/projects/:id/designs |
Create design asset |
| GET | /v1/projects/:id/designs/:assetId |
Asset detail |
| DELETE | /v1/projects/:id/designs/:assetId |
Delete asset |
| GET | /v1/designs/:assetId/versions |
List versions |
| POST | /v1/designs/:assetId/versions/presign |
Presign upload |
| POST | /v1/designs/:assetId/versions/confirm |
Confirm upload |
| GET | /v1/designs/versions/:versionId |
Version detail |
| POST | /v1/designs/versions/:versionId/review |
Portal / staff review decision |
Guest review shares (staff)
Create, email, or revoke a share for a pending version:
| Method | Path | Purpose |
|---|---|---|
| POST | /v1/designs/versions/:versionId/review-share |
Create share token |
| POST | /v1/designs/versions/:versionId/review-share/send |
Email the guest link |
| DELETE | /v1/designs/versions/:versionId/review-share |
Revoke share |
curl -X POST "$API/v1/designs/versions/$VERSION_ID/review-share" \
-H "Authorization: Bearer fel_..." \
-H "Content-Type: application/json" \
-d '{"email":"client@example.com"}'const { data } = await fetch(
`${API}/v1/designs/versions/${versionId}/review-share`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ email: 'client@example.com' }),
},
).then((r) => r.json())
console.log(data.shareUrl)import requests
r = requests.post(
f"{API}/v1/designs/versions/{version_id}/review-share",
headers=headers,
json={"email": "client@example.com"},
)
print(r.json())Guest review flow (public token)
These routes are authenticated by the share token (plus OTP after verify), not by agency API keys:
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/designs/review-shares/:token |
Share metadata / branding |
| POST | /v1/designs/review-shares/:token/otp |
Request email OTP |
| POST | /v1/designs/review-shares/:token/otp/verify |
Verify OTP, open session |
| GET | /v1/designs/review-shares/:token/asset |
Load asset for review |
| POST | /v1/designs/review-shares/:token/review |
Approve or request changes |
Typical UI path: dashboard /review/:token → email → OTP → decision.
Figma import
After connecting Figma under Settings → Integrations:
| Method | Path | Purpose |
|---|---|---|
| POST | /v1/integrations/figma/frames |
List frames for a file |
| POST | /v1/integrations/figma/import |
Import frames as design versions |
See Integrations & webhooks for OAuth connection endpoints.