This quickstart gets you authenticated and making real calls against the
Future Demand Client API. It’s deliberately product-agnostic — it works for
both Lookout and Wave.
What you’ll need
Credentials
Request access at support.future-demand.com
to get a service-account username/password bound to your partner
(your tenant) on staging.
A base URL
Always integrate against staging first. See Environments
for the host. The version prefix is /v3.
curl, Postman, or the [TypeScript client](/sdk/typescript-client)
Anything that can speak HTTPS and set headers.
1. Sign in and capture a token
BASE = https://client-api.stg.future-demand.com/api/v3
curl -s -X POST " $BASE /auth" \
-H "Content-Type: application/json" \
-d '{ "username": "you@partner.com", "password": "..." }'
Response (abbreviated — see Authentication for all
branches including MFA and forced password change):
{
"AccessToken" : "eyJraWQ..." ,
"IdToken" : "eyJraWQ..." ,
"RefreshToken" : "eyJjdHkiOiJKV1Q..." ,
"ExpiresIn" : 3600 ,
"TokenType" : "Bearer"
}
Stash the tokens:
export FD_ACCESS_TOKEN = "eyJraWQ..."
export FD_REFRESH_TOKEN = "eyJjdHkiOiJKV1Q..."
2. Find your partner_id
Decode the IdToken (it’s a standard JWT) and read cognito:groups.
Whichever entry matches partner-id-* or fd<digits> is a partner you can
act as. If you have only one, use it; if multiple, your UI should let the
user choose.
# Quick decode (jq + base64):
echo " $FD_ID_TOKEN " | cut -d. -f2 | base64 -d | jq '."cognito:groups"'
# → ["partner-id-acme", "webapp-access-group-2"]
export FD_PARTNER_ID = "partner-id-acme"
3. Make your first authenticated calls
Every authenticated request carries two headers:
Authorization : Bearer <AccessToken>
X-Preferred-Partner-Id : <partner_id>
# Health check — no auth needed
curl -s " $BASE /status/"
# Confirm your token + partner header are right
curl -s " $BASE /partners/" \
-H "Authorization: Bearer $FD_ACCESS_TOKEN " \
-H "X-Preferred-Partner-Id: $FD_PARTNER_ID "
A 200 from /partners/ returning your partner record means both your
token and your X-Preferred-Partner-Id are valid.
4. List events (Lookout)
Events are the centre of gravity in Lookout. List the upcoming ones:
curl -s " $BASE /events/?limit=5&descending=false" \
-H "Authorization: Bearer $FD_ACCESS_TOKEN " \
-H "X-Preferred-Partner-Id: $FD_PARTNER_ID "
Expected envelope (page+limit, 1-indexed):
{
"total" : 423 ,
"limit" : 5 ,
"page" : 1 ,
"pages" : 85 ,
"nextPage" : 2 ,
"prevPage" : null ,
"items" : [
{
"id" : "evt_abc123" ,
"name" : "Concert at Olympiahalle" ,
"start_at" : "2026-06-12T18:30:00Z" ,
"venue" : "Olympiahalle München" ,
"status" : "active" ,
"currency" : "EUR"
}
]
}
See Events list for the full payload, filters,
and exactly how the reference Lookout webapp pages call this endpoint.
5. Fetch a recommendation (Affinity)
Pick one event and ask Affinity which taste clusters to target:
EID = evt_abc123
curl -s " $BASE /events/ $EID /suggested_tcs?budget=5000&goal=tickets" \
-H "Authorization: Bearer $FD_ACCESS_TOKEN " \
-H "X-Preferred-Partner-Id: $FD_PARTNER_ID "
This is the same call that powers Lookout’s “Suggested Targeting” card —
see Recommendation Detail .
6. Create a campaign (Wave)
To move from insight to activation, kick off the campaign setup process:
curl -s -X POST " $BASE /setup_processes/ $EID " \
-H "Authorization: Bearer $FD_ACCESS_TOKEN " \
-H "X-Preferred-Partner-Id: $FD_PARTNER_ID " \
-H "Content-Type: application/json" \
-d '{ "goal": "tickets", "budget": 5000 }'
setup_processes/{eid} is the state-machine row that owns the Wave
campaign setup for a given event. See
Wave Campaigns Lifecycle for the full
state model.
Next steps
Authentication Token refresh, MFA, user provisioning, error codes.
Platform Model The partner / client / event / campaign hierarchy you need in your head.
Your First Integration A 30-minute walk-through that renders a Lookout recommendation in React.
API Reference Every endpoint, auto-generated from OpenAPI.