Full API reference for Shipyard — endpoints, authentication, request formats, and example payloads.
The Shipyard API gives you direct access to products, posts, requests, assets, and analytics. All write routes require a bearer token. Read routes for public data are open. Every endpoint below is documented with request shapes, field descriptions, and example payloads.
The API is designed to integrate with your existing development tools. Pull approved roadmap items into your IDE, generate tasks from community votes, pipe analytics into your own dashboards, or connect AI tools to the hosted planner MCP endpoint.
GET /v1/roadmap, filter by status, and feed them into your IDE or task runner to scaffold implementation work automatically.Write routes and privileged reads require a bearer token in the Authorization header. Public read routes for products, posts, and public roadmap data do not require auth. Desktop apps can call GET /v1/settings/api-key/current to check when the current database-backed service key expires.
expiresAt, expiresInDays, and rotationRecommended from /v1/settings/api-key/current to warn users before local integrations need a regenerated key.Service API key metadata for desktop apps, local tools, and trusted integrations.
/v1/settings/api-key/current
curl "$BASE_URL/v1/settings/api-key/current" \
-H "Authorization: Bearer $SERVICE_API_KEY"
{
"ok": true,
"serverTime": "2026-06-22T12:00:00.000Z",
"apiKey": {
"id": "jwk_shipcapsule_ab12cd34",
"name": "ShipCapsule",
"scopes": ["api:write"],
"allowedProductSlugs": ["markettrail"],
"status": "active",
"createdAt": "2026-06-22T12:00:00.000Z",
"expiresAt": "2026-09-20T12:00:00.000Z",
"expiresInSeconds": 7776000,
"expiresInDays": 90,
"rotationRecommended": false,
"rotationRecommendedAt": "2026-09-06T12:00:00.000Z",
"lastUsedAt": null,
"lastUsedPath": null,
"lastUsedMethod": null,
"usageCount": 0
}
}
Hosted MCP access for AI clients that need to read planner work, create future features, manage checklist tasks, and mark selected work as testing needed.
/mcp
curl "$BASE_URL/mcp" \
-H "Authorization: Bearer $SERVICE_API_KEY"
{
"name": "shipyard-planner",
"version": "1.0.0",
"transport": "streamable-http",
"endpoint": "/mcp"
}
/mcp
| Field | Type | Required | Description |
|---|---|---|---|
jsonrpc |
2.0 |
Yes | JSON-RPC version. |
id |
string | number |
No | Request id. Omit only for notifications. |
method |
initialize | ping | tools/list | tools/call |
Yes | MCP/JSON-RPC method. |
params |
object |
No | Method-specific params. tools/call expects name and arguments. |
curl -X POST "$BASE_URL/mcp" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_ai_work",
"arguments": {
"productSlug": "atlas"
}
}
}'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{ ...planner payload... }"
}
],
"structuredContent": {
"product": { "slug": "atlas" },
"grouped": [
{ "status": "do_not_touch", "label": "No AI Action", "items": [] },
{ "status": "ready", "label": "Ready for AI", "items": [] },
{ "status": "clarification_needed", "label": "Clarification Needed", "items": [] },
{ "status": "testing_needed", "label": "Testing Needed", "items": [] }
]
}
}
}
/mcp (mark_testing_needed)
| Field | Type | Required | Description |
|---|---|---|---|
itemId |
string |
Yes | Planner item id, passed inside params.arguments. |
summary |
string |
No | What changed. |
testingNotes |
string |
No | What the human/tester should verify. |
curl -X POST "$BASE_URL/mcp" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "mark_testing_needed",
"arguments": {
"itemId": "req_123",
"summary": "Added compact dashboard layout and wired existing summary data.",
"testingNotes": "Verify dashboard cards on mobile, desktop, and empty metrics."
}
}
}'
Authenticated Apple Connect sales summaries plus Cloudflare web analytics for admin and native/internal clients.
/v1/analytics
| Field | Type | Required | Description |
|---|---|---|---|
days |
7 | 30 | 90 | 180 |
No | Reporting window. Defaults to 30. |
productId |
string | all |
No | Specific app product id or all. |
view |
day | week | month |
No | Trend bucket size. |
activity |
download | paid | iap | purchase | update | redownload | all |
No | Activity class filter. |
curl "$BASE_URL/v1/analytics?days=30&view=day&activity=download" \
-H "Authorization: Bearer $SERVICE_API_KEY"
/v1/analytics/web
| Field | Type | Required | Description |
|---|---|---|---|
days |
7 | 30 |
No | Reporting window. Defaults to 7. |
hostname |
string |
No | Optional hostname selector (must be allowed for this workspace). |
ws |
string |
No | Optional workspace slug override for shared-host API clients. |
refresh |
0 | 1 |
No | Set to 1 to bypass the server-side cache. |
curl "$BASE_URL/v1/analytics/web?ws=acme-studio&hostname=www.acme.example&days=30" \
-H "Authorization: Bearer $SERVICE_API_KEY"
ShipyardKit Ask, announcement, Roadmap pull, and engagement count endpoints.
/v1/engagement/updates
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
Yes | Product slug. |
history |
0 | 1 |
No | Include non-live items. |
curl "$BASE_URL/v1/engagement/updates?product=atlas" \
-H "Authorization: Bearer $MOBILE_FEEDBACK_TOKEN"
/v1/engagement/asks
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
Yes | Product slug. |
curl "$BASE_URL/v1/engagement/asks?product=atlas" \
-H "Authorization: Bearer $MOBILE_FEEDBACK_TOKEN"
/v1/engagement/announcements
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
Yes | Product slug. |
curl "$BASE_URL/v1/engagement/announcements?product=atlas" \
-H "Authorization: Bearer $MOBILE_FEEDBACK_TOKEN"
/v1/engagement/asks/:id/respond
| Field | Type | Required | Description |
|---|---|---|---|
optionId |
string |
No | Single-choice option id. |
optionIds |
string[] |
No | Multi-choice option ids. |
ratingValue |
number |
No | Star or numeric rating value. |
textValue |
string |
No | Open-text response. |
/v1/engagement/announcements/:id/events
| Field | Type | Required | Description |
|---|---|---|---|
eventType |
shown | dismissed | clicked |
Yes | Announcement delivery event. |
visibleMs |
number |
No | Optional visible duration. |
screenKey |
string |
No | Optional client screen identifier. |
/v1/engagement/counts
curl "$BASE_URL/v1/engagement/counts" \
-H "Authorization: Bearer $SERVICE_API_KEY"
Product records, product-scoped post feeds, and public promo-code flows.
/v1/products
| Field | Type | Required | Description |
|---|---|---|---|
visibility |
public | private |
No | Auth only. |
type |
app | web |
No | Optional product type filter. |
status |
string |
No | Optional status filter. |
versionStatus |
string |
No | Optional working version status filter. workingVersionStatus is also accepted. |
workingVersion |
string |
No | Optional exact working version filter. |
productNumber |
string |
No | Optional exact manual product identifier filter. |
minProgress |
number |
No | Minimum manual working-version progress. |
maxProgress |
number |
No | Maximum manual working-version progress. |
includePriority |
0 | 1 |
No | Defaults to 1. Set to 0 to skip update-priority ranking unless using update_priority sort. |
includeLatestUpdates |
0 | 1 |
No | Defaults to 1. Set to 0 to skip latestUpdateAt and daysSinceLastUpdate unless required by priority or days-since-update sort. |
includeSupport |
0 | 1 |
No | Defaults to 1. Set to 0 to skip supportUrl lookup. |
sort |
string |
No | name_asc, name_desc, product_number_asc, product_number_desc, update_priority_asc, update_priority_desc, working_version_asc, working_version_desc, progress_asc, progress_desc, days_since_update_asc, days_since_update_desc, status, version_status, newest, or oldest. |
curl "$BASE_URL/v1/products?sort=progress_desc&versionStatus=in_progress" \
-H "Authorization: Bearer $SERVICE_API_KEY"
/v1/products/:slug
| Field | Type | Required | Description |
|---|---|---|---|
includePlanner |
0 | 1 |
No | Auth only. Include grouped private planner items for this product. |
includePriority |
0 | 1 |
No | Defaults to 1. Set to 0 to skip update-priority ranking. |
includeLatestUpdates |
0 | 1 |
No | Defaults to 1. Set to 0 to skip latestUpdateAt and daysSinceLastUpdate unless priority is included. |
includeSupport |
0 | 1 |
No | Defaults to 1. Set to 0 to skip supportUrl lookup. |
curl "$BASE_URL/v1/products/atlas?includePlanner=1" \
-H "Authorization: Bearer $SERVICE_API_KEY"
/v1/products
| Field | Type | Required | Description |
|---|---|---|---|
name |
string |
Yes | Human-readable product name. |
slug |
string |
No | Optional custom slug. |
type |
app | web | studio |
No | Product kind. |
description |
string |
No | Optional description. |
primaryColor |
string |
No | Hex brand accent. |
secondaryColor |
string |
No | Hex support color. |
templateKey |
string |
No | Landing template key. |
appStoreUrl |
string |
No | App Store link. |
websiteUrl |
string |
No | Marketing or product URL. |
status |
string |
No | Defaults to active. |
visibility |
public | private |
No | Defaults to private. |
productNumber |
string |
No | Optional manual product identifier. |
workingVersion |
string |
No | Manually tracked next version. |
workingVersionStatus |
string |
No | Manual App Store/release workflow status. |
workingVersionProgress |
number |
No | Manual percent complete from 0 to 100. |
platforms |
string[] |
No | Supported platform labels. |
metadata |
object |
No | String-only metadata bag. |
iconKey |
string |
No | Stored asset key. |
iconUrl |
string |
No | Explicit public icon URL. |
iconVariants |
object |
No | String-only icon variant map. |
curl -X POST "$BASE_URL/v1/products" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Relay Notes",
"slug": "relay-notes",
"type": "app",
"description": "Launch notes and private planning in one place.",
"status": "active",
"productNumber": "7",
"workingVersion": "1.2",
"workingVersionStatus": "in_progress",
"workingVersionProgress": 40,
"visibility": "private",
"platforms": ["iphone", "ipad", "mac"],
"metadata": { "tagline": "A calmer shipping surface" }
}'
/v1/products/:slug/posts
| Field | Type | Required | Description |
|---|---|---|---|
status |
string |
No | Defaults to published. |
type |
string |
No | Optional post type filter. |
limit |
number |
No | Max 100. |
offset |
number |
No | Pagination offset. |
curl "$BASE_URL/v1/products/atlas/posts?type=release&limit=10"
/v1/products/:slug/promo-code/status
curl "$BASE_URL/v1/products/atlas/promo-code/status"
{
"product": {
"slug": "atlas",
"name": "Atlas"
},
"promoCodes": {
"enabled": true,
"available": true,
"cooldownHours": 24,
"buttonLabel": "Get Promo Code",
"description": "Limited App Store promo codes are available for this app.",
"turnstileRequired": true
}
}
/v1/products/:slug/promo-code/claim
| Field | Type | Required | Description |
|---|---|---|---|
turnstileToken |
string |
No | Accepted for JSON requests. |
cf-turnstile-response |
string |
No | Accepted for form submissions too. |
curl -X POST "$BASE_URL/v1/products/atlas/promo-code/claim" \
-H "Content-Type: application/json" \
-d '{"turnstileToken":"<CF_TURNSTILE_TOKEN>"}'
{
"code": "ABCD-1234-EFGH",
"product": {
"slug": "atlas",
"name": "Atlas",
"appStoreUrl": "https://apps.apple.com/..."
}
}
/v1/products/:slug
| Field | Type | Required | Description |
|---|---|---|---|
name |
string |
No | Optional updated name. |
description |
string |
No | Optional updated description. |
primaryColor |
string |
No | Updated brand accent. |
secondaryColor |
string |
No | Updated support color. |
templateKey |
string |
No | Updated landing template. |
appStoreUrl |
string |
No | Updated App Store URL. |
websiteUrl |
string |
No | Updated product URL. |
status |
string |
No | Updated status. |
visibility |
string |
No | Updated public/private visibility. |
productNumber |
string |
No | Updated manual product identifier. |
workingVersion |
string |
No | Updated manually tracked next version. |
workingVersionStatus |
string |
No | Updated manual App Store/release workflow status. |
workingVersionProgress |
number |
No | Updated manual percent complete from 0 to 100. |
platforms |
string[] |
No | Updated platforms. |
metadata |
object |
No | Updated string metadata bag. |
iconKey |
string |
No | Updated asset key. |
iconVariants |
object |
No | Updated variant map. |
curl -X PATCH "$BASE_URL/v1/products/atlas" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"description":"Updated description","status":"active"}'
Release notes, updates, metrics, and post image attachments.
/v1/posts
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
No | Product slug. |
type |
string |
No | Post type filter. |
status |
string |
No | Defaults to published. |
limit |
number |
No | Max 100, default 50. |
offset |
number |
No | Pagination offset. |
curl "$BASE_URL/v1/posts?product=atlas&type=release&limit=5"
/v1/posts/:productSlug/:postSlug
/v1/posts/:id
/v1/posts/:id/metrics
curl "$BASE_URL/v1/posts/post_abc123/metrics"
/v1/posts
| Field | Type | Required | Description |
|---|---|---|---|
productSlug |
string |
Yes | Target product slug. |
sourceSlug |
string |
No | Alias for productSlug. |
type |
string |
Yes | Post type. |
title |
string |
Yes | Post title. |
summary |
string |
No | Short summary. |
body |
string |
No | Long-form body. |
version |
string |
No | Optional version label. |
status |
string |
No | Defaults to published. |
publishedAt |
string |
No | ISO timestamp. |
visibility |
everywhere | app_only |
No | Visibility surface. |
ctaLabel |
string |
No | Optional CTA label. |
ctaUrl |
string |
No | Optional CTA target. |
availabilityStart |
string |
No | Optional release window start. |
availabilityEnd |
string |
No | Optional release window end. |
availabilityLabel |
string |
No | Optional availability label. |
displayConfig |
object |
No | Display settings for structured layouts. |
metrics |
array |
No | Optional metrics array to seed on create. |
images |
array |
No | Optional image attachment array to seed on create. |
curl -X POST "$BASE_URL/v1/posts" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productSlug": "atlas",
"type": "release",
"title": "Atlas 1.1 - Tidal Alerts",
"summary": "Get notified when conditions hit your saved thresholds.",
"body": "Full release notes here.",
"version": "1.1.0",
"visibility": "everywhere",
"publishedAt": "2026-03-06T10:00:00Z"
}'
/v1/posts/:id
| Field | Type | Required | Description |
|---|---|---|---|
type |
string |
No | Updated post type. |
title |
string |
No | Updated title. |
summary |
string |
No | Updated summary. |
body |
string |
No | Updated body. |
version |
string |
No | Updated version label. |
status |
string |
No | Updated status. |
publishedAt |
string |
No | Updated ISO timestamp. |
visibility |
string |
No | Updated visibility. |
ctaLabel |
string |
No | Updated CTA label. |
ctaUrl |
string |
No | Updated CTA URL. |
availabilityStart |
string |
No | Updated availability start. |
availabilityEnd |
string |
No | Updated availability end. |
availabilityLabel |
string |
No | Updated availability label. |
displayConfig |
object |
No | Updated display config. |
/v1/posts/:id
/v1/posts/:id/metrics
| Field | Type | Required | Description |
|---|---|---|---|
metrics |
array |
Yes | Full replacement array. |
curl -X POST "$BASE_URL/v1/posts/post_abc123/metrics" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"metrics":[{"label":"Downloads","value":5000},{"label":"MAU","value":1204}]}'
/v1/posts/:id/images
| Field | Type | Required | Description |
|---|---|---|---|
images |
array |
Yes | Full replacement array of asset references. |
curl -X POST "$BASE_URL/v1/posts/post_abc123/images" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"images": [
{ "assetId": "asset_1", "platform": "iphone", "display": "feature", "caption": "Hero screen" },
{ "assetId": "asset_2", "platform": "ipad", "display": "gallery" }
]
}'
Public roadmap items and private internal planning all share one request model.
/v1/requests
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
No | Product slug. |
status |
string |
No | Status filter. |
visibility |
public | private |
No | Auth only. |
origin |
user | internal |
No | Auth only. |
curl "$BASE_URL/v1/requests?product=atlas&status=open"
/v1/requests
| Field | Type | Required | Description |
|---|---|---|---|
productSlug |
string |
No | Preferred product slug field. Required for public callers unless sourceSlug is provided. |
sourceSlug |
string |
No | Alias for productSlug. Required for public callers when productSlug is omitted. |
productId |
string |
No | Useful for authenticated planner writes. |
title |
string |
Yes | Request title. |
description |
string |
No | Optional description. |
status |
string |
No | Auth only. |
visibility |
public | private |
No | Auth only. |
origin |
user | internal |
No | Auth only. |
notes |
string |
No | Auth only. |
developerResponse |
string |
No | Auth only. Public developer response text, preserving line breaks and bullets. |
developerResponsePublic |
boolean |
No | Auth only. When true, exposes developerResponse publicly. |
itemType |
feature | bugfix |
No | Public/mobile callers may choose feature or bugfix; authenticated callers may use planner item types. |
releaseVersion |
string |
No | Auth only. |
sortOrder |
number |
No | Auth only. |
targetDate |
string |
No | Auth only. |
productName |
string |
No | Auth only. |
productSlugHint |
string |
No | Auth only. |
linkedPostId |
string |
No | Auth only. |
turnstileToken |
string |
No | Public/browser flow when Turnstile is enabled. |
cf-turnstile-response |
string |
No | Public/browser alias for Turnstile. |
curl -X POST "$BASE_URL/v1/requests" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productSlug": "atlas",
"title": "Tighten onboarding spacing",
"status": "open",
"visibility": "private",
"origin": "internal",
"itemType": "bugfix",
"releaseVersion": "Next"
}'
/v1/requests/:id
curl "$BASE_URL/v1/requests/req_abc123"
/v1/requests/bulk
| Field | Type | Required | Description |
|---|---|---|---|
titles |
string[] |
No | One title per item. |
lines |
string |
No | One line per item. |
productSlug |
string |
No | Optional product slug. |
productId |
string |
No | Optional product id. |
visibility |
public | private |
No | Defaults to private. |
status |
string |
No | Defaults to open. |
itemType |
string |
No | Defaults to update. |
releaseVersion |
string |
No | Optional release label. |
targetDate |
string |
No | Optional target date. |
curl -X POST "$BASE_URL/v1/requests/bulk" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productSlug": "atlas",
"visibility": "private",
"status": "open",
"itemType": "update",
"releaseVersion": "Next",
"lines": "Fix bottom sheet spacing\nTweak roadmap copy\nReview promo button wording"
}'
/v1/requests/bulk
| Field | Type | Required | Description |
|---|---|---|---|
ids |
string[] |
Yes | Item ids to update. |
status |
string |
No | Bulk status update. |
visibility |
string |
No | Bulk visibility update. |
itemType |
string |
No | Bulk item type update. |
releaseVersion |
string |
No | Bulk release version update. |
targetDate |
string |
No | Bulk target date update. |
/v1/requests/:id
| Field | Type | Required | Description |
|---|---|---|---|
title |
string |
No | Updated title. |
description |
string |
No | Updated description. |
status |
string |
No | Updated status. |
linkedPostId |
string |
No | Optional related post id. |
visibility |
string |
No | Updated visibility. |
origin |
string |
No | Updated origin. |
notes |
string |
No | Updated internal notes. |
developerResponse |
string |
No | Updated public developer response text. |
developerResponsePublic |
boolean |
No | Publishes or hides the developer response. |
itemType |
string |
No | Updated item type. |
releaseVersion |
string |
No | Updated release version. |
sortOrder |
number |
No | Updated order. |
targetDate |
string |
No | Updated target date. |
productName |
string |
No | Updated product name snapshot. |
productSlugHint |
string |
No | Updated slug hint. |
productId |
string |
No | Updated product link. |
/v1/requests/:id/tasks
/v1/requests/:id/tasks
| Field | Type | Required | Description |
|---|---|---|---|
title |
string |
Yes | Task title. |
/v1/requests/:id/tasks/:taskId
| Field | Type | Required | Description |
|---|---|---|---|
title |
string |
No | Updated title. |
isDone |
boolean |
No | Completion state. |
orderIndex |
number |
No | Task order. |
/v1/requests/:id/tasks/:taskId
/v1/requests/:id/vote
| Field | Type | Required | Description |
|---|---|---|---|
turnstileToken |
string |
No | Public/browser flow when Turnstile is enabled. |
cf-turnstile-response |
string |
No | Public/browser alias for Turnstile. |
voterToken |
string |
No | Optional native-client token. |
unvote |
boolean |
No | Toggle to remove a vote. |
Uploaded files plus help and knowledge-base article reads.
/v1/assets
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
No | Product slug. |
type |
string |
No | Asset type filter. |
limit |
number |
No | Max 100. |
offset |
number |
No | Pagination offset. |
/v1/assets
| Field | Type | Required | Description |
|---|---|---|---|
file |
File |
Yes | Binary upload. |
productSlug |
string |
No | Preferred product slug. Required unless sourceSlug is provided. |
sourceSlug |
string |
No | Alias for productSlug. Required when productSlug is omitted. |
type |
string |
No | Asset kind, default cover. |
title |
string |
No | Optional display title. |
curl -X POST "$BASE_URL/v1/assets" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-F "file=@./screenshot.png" \
-F "productSlug=atlas" \
-F "type=screenshot"
/v1/assets/:id
/v1/articles
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
No | Product slug. |
published |
true | false |
No | Auth only when filtering unpublished content. |
limit |
number |
No | Max 100. |
offset |
number |
No | Pagination offset. |
/v1/articles/:slug
Public waitlist signup plus authenticated signup management and invite generation.
/v1/waitlist
| Field | Type | Required | Description |
|---|---|---|---|
productSlug |
string |
No | Filter by product slug. |
productId |
string |
No | Filter by product id. |
status |
new | contacted | invited | converted |
No | Optional status filter. |
limit |
number |
No | Defaults to 100, max 1000. |
offset |
number |
No | Pagination offset. |
curl "$BASE_URL/v1/waitlist?productSlug=atlas&status=new&limit=50" \
-H "Authorization: Bearer $SERVICE_API_KEY"
{
"signups": [
{
"id": "wl_abc123",
"productId": "prod_atlas",
"email": "captain@example.com",
"name": "Captain Nora",
"status": "invited",
"source": "api",
"productSlug": "atlas",
"productName": "Atlas",
"inviteTargetLabel": "TestFlight",
"inviteDestinationUrl": "https://testflight.apple.com/join/abc123",
"inviteUrl": "https://app.startshipyard.com/waitlist/invite/wlinv_123"
}
],
"count": 1,
"totalCount": 14
}
/v1/waitlist
| Field | Type | Required | Description |
|---|---|---|---|
productSlug |
string |
Yes | Target product slug. |
email |
string |
Yes | Signup email address. |
name |
string |
No | Optional person name. |
notes |
string |
No | Optional freeform notes or custom answer. |
company |
string |
No | Honeypot field. Should stay empty. |
turnstileToken |
string |
No | Public/browser flow when Turnstile is enabled. |
cf-turnstile-response |
string |
No | Public/browser alias for Turnstile. |
curl -X POST "$BASE_URL/v1/waitlist" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productSlug": "atlas",
"email": "captain@example.com",
"name": "Captain Nora",
"notes": "Interested in the beta."
}'
{
"ok": true,
"id": "wl_abc123"
}
/v1/waitlist/:id/invite
curl -X POST "$BASE_URL/v1/waitlist/wl_abc123/invite" \
-H "Authorization: Bearer $SERVICE_API_KEY"
/v1/waitlist/:id
| Field | Type | Required | Description |
|---|---|---|---|
status |
new | contacted | invited | converted |
Yes | Next signup status. |
curl -X PATCH "$BASE_URL/v1/waitlist/wl_abc123" \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"contacted"}'
/v1/waitlist/:id
curl -X DELETE "$BASE_URL/v1/waitlist/wl_abc123" \
-H "Authorization: Bearer $SERVICE_API_KEY"
A simplified public roadmap surface and authenticated planner grouping powered by the same request model.
/v1/roadmap
| Field | Type | Required | Description |
|---|---|---|---|
product |
string |
No | Product slug. |
status |
string |
No | Optional status filter. |
visibility |
public | private | all |
No | Auth only. |
planning |
0 | 1 |
No | Auth only. Include public and private planner items. |
grouped |
0 | 1 |
No | Return planner release groups. |
group |
releaseVersion |
No | Alternative way to request release-version grouping. |
limit |
number |
No | Max 100. |
offset |
number |
No | Pagination offset. |
curl "$BASE_URL/v1/roadmap?product=atlas&planning=1&visibility=all&grouped=1" \
-H "Authorization: Bearer $SERVICE_API_KEY"