Which SECTION of the dashboard the XLSX covers, over which window, under which filters.
scope names the section. It is OPTIONAL and its absence is load-bearing: a body with no
scope returns exactly the five-sheet workbook this endpoint has always returned, built from
user_ids/start/end alone — which is the only body the shipped frontend sends. Every field
added below is inert on that path. Widening it later (letting search quietly narrow the legacy
workbook, say) would change a file an operator already relies on without them asking for it.
Scopes and the filters each one reads — a filter that a scope does not name is IGNORED by it and
is reported as such on the workbook's Context sheet, so a file can never claim a narrower or
wider selection than it actually has:
all (default) user_ids the legacy five sheets
overview user_ids
people user_ids, search, sort, order
rankings user_ids, metric
projects project_ids, user_ids (as assignee), search, sort, order
shares share_ids, user_ids (as creator), search, sort, order
activities activity_ids OR (activity_kinds, activity_source, user_ids (as actor),
project_ids, share_ids, search); sort, order either way
user user_ids, sort, order
project project_ids
An EMPTY selection is a selection. project_ids=[] is "everything" (nothing was picked), but a
list naming only ids that do not exist narrows to nothing and produces empty data sheets — it
never falls back to the whole workspace. activity_ids is the one field where [] is NOT
"nothing was picked" — see its own description.
activity_ids is how a TICKED SELECTION on the activity feed is exported, and it is not a
filter — it is the list itself. The rows on that feed come from six populations in five tables
and carry disjoint context (a team upload has a project and no share link, a client view has a
share link and usually no project), so a selection spanning both families cannot be described by
intersecting the facets its rows happen to share: doing that ANDed a project set against a share
set and matched nothing, and "Export selected" returned an empty workbook. Row ids are unique
across every family, so they are the only honest expression of a mixed pick. When it is present
every other activities filter is ignored, and the Context sheet says so.
Its ABSENCE and its EMPTINESS differ, unlike the id lists above. null means no rows were
individually picked, so the facet filters decide. [] means the operator picked nothing, and it
exports nothing — a selection that quietly became "everything" is the one direction this must
never fail in.
start/end are inclusive YYYY-MM-DD calendar days in UTC; both absent means the last 30 days,
the same default every GET on this lane uses.