An event is the unit of analysis and activation across both Lookout
and Wave. It can be a concert, a fixture, a fair, a product release — any
finite-window thing your audience can buy a ticket or admission to.
Event shape (read)
Shortened example. The real /events/ payload has many more fields
than shown here (campaign state flags, predicted-sales fields, benchmark
sub-objects, etc.). Treat this as illustrative — inspect a live response
for the full contract, and don’t assume these are the only fields.
{
"id": "evt_abc123",
"title": "Concert at Olympiahalle",
"start_date_time": "2026-06-12T18:30:00Z",
"city": "München",
"venue_name": "Olympiahalle",
"hall_name": "Main Hall",
"capacity": 12000,
"category": "concert",
"special_ad_category": null,
"predicted_sales_share": 0.71,
"status": "active",
"frontend_status": "DEFAULT",
"campaign_status": "RUNNING",
"client_campaign_status": "RUNNING",
"campaign_optimisation_status": "ON",
"ad_campaign_optimisation_status": "ON",
"campaign_event_series": ["evt_abc124", "evt_abc125"],
"benchmark": {
"prediction": { "value": 0.78, "benchmark": 0.65 }
}
}
There is no currency field on the event object. Currency is stored
at the partner level — read it from GET /partners/ (currency),
or, for display, from the user/tenant setting the reference webapp keeps
in browser storage (userCurrency).
The list endpoint (GET /events/) wraps these in the standard envelope:
{ "total": 423, "limit": 50, "page": 1, "pages": 9, "items": [ ... ] }
Statuses you’ll deal with
There are several status fields on an event. They are independent and
mean different things.
| Field | Values | Meaning |
|---|
status | active, archived, cancelled, … | Backend lifecycle. |
frontend_status | DEFAULT, FLAGGED, HIDDEN, CANCELLED | UX state. FLAGGED pins to the top of the list; HIDDEN archives from the user’s view; CANCELLED marks a cancelled event. |
campaign_status | RUNNING, OPEN, CLOSED, IGNORED | Wave campaign roll-up. |
client_campaign_status | RUNNING, PAUSED | The user’s pause/run toggle for this event’s Wave campaigns. |
campaign_optimisation_status | ON, OFF | Whether Future Demand’s automated optimisation is active. |
ad_campaign_optimisation_status | ON, OFF | Same, but at the per-platform ad-campaign level. |
Most UIs only need frontend_status (for the list view) and one of the
campaign-status fields (for the action menus). The rest are platform internals.
Reads you’ll actually use
| Purpose | Endpoint |
|---|
| List with filters | GET /events/ |
| Flagged-only list | GET /events/flagged/ |
| List of venues (optional filters) | GET /events/venues |
| Single event detail | GET /events/{eid} |
| Tenant-wide statistics | GET /events/statistics |
| Demand benchmark | GET /events/{eid}/lookout_prediction_benchmark?type=capacity|ticket_count |
| Demand prediction curve | GET /events/{eid}/lookout_prediction?type=capacity|ticket_count |
| Daily revenue / tickets | GET /daily_revenue_summary/?event_id=¤cy=&start_date=&end_date= |
| Ticket categories | GET /events/{eid}/tickets |
| Sibling events in series | GET /events/{eid}/series |
| Taste clusters | GET /events/{eid}/clusters |
| Suggested clusters at a budget | GET /events/{eid}/suggested_tcs?budget=&goal= |
| Default Wave campaign params | GET /events/{eid}/default_campaigns_parameters |
| Existing campaigns | GET /events/{eid}/campaigns |
lookout_prediction_benchmark and lookout_prediction both require a
type query param: capacity (percentage mode) or ticket_count
(absolute values). These replace the older benchmark / sales-graph
paths.
Venues filter
GET /events/venues returns the full venue list with no parameters. It
also supports optional repeated filters per Swagger — city[] and
venue[]:
GET /events/venues # full list
GET /events/venues?city=Berlin&city=Munich # filtered
Treat the filters as optional, not required.
Writes
| Purpose | Endpoint |
|---|
| Toggle flag / archive | PUT /events/{eid}/setup_frontend_status |
| Pause / resume Wave campaigns | PUT /events/{eid}/client_campaign_status?... |
| Toggle automated optimisation | PUT /events/{eid}/campaign_optimisation_status?... |
| Reset Wave setup | PUT /events/{eid}/reset_campaigns_setup |
| Edit event meta (CR API) | [cr_api] PUT /events/{eid}?event_type=...&partner_product=... |
| Manage event series | POST /events/{eid}/series, DELETE /events/{eid}/series |
Two-step status updates. Setting frontend_status is a two-call
sequence: PUT /events/{eid}/setup_frontend_status (main API) followed
by PUT [cr_api] /events/last_updated_on_fe/{eid}. The CR status is
CANCELLED only when frontend_status === "CANCELLED"; otherwise it’s
RUNNING (including for HIDDEN). See
Event detail guide.
Sales data
Two ingest paths and a clear endpoint:
| Purpose | Endpoint |
|---|
| Manual transaction-summary ingest | POST /ingest/transaction_summary |
| Excel file ingest | POST /ingest/transaction_summary/from_excel?eid={eid} (multipart) |
| Clear all ingested sales | DELETE /daily_revenue_summary?eid={eid} |
| Bulk sales-edit XLSX (download/upload) | GET/POST /daily_revenue_summary/sales_edit_export |
Event series
A series groups sibling events — multi-date tours, repeat fixtures, weekly
recurrences. GET /events/{eid}/series lists members; the available pool
for adding new members comes from GET /events/{eid}/available_events_for_series.
Mutations:
POST /events/{eid}/series?event_series=evt_x&event_series=evt_y
DELETE /events/{eid}/series?event_series=evt_x
Note these mutations send the list as repeated query params, not a
JSON body.
Lifecycle (typical flow)
ingest (CR API) ─▶ active ─▶ campaign_status: OPEN
│ │
│ user flags │ user runs Wave wizard
▼ ▼
FLAGGED client_campaign_status: RUNNING
│
│ event runtime ends
▼
campaign_status: CLOSED