Federated search
POST /search searches a bounded set of contacts, projects, and tasks. The request requires a
term of at least two characters, one to three unique resource types, and an optional limit of at most
50.
search:read is only the federation scope. Every requested type also requires its domain read scope
and the normal product permission. Asking for projects and tasks, for example, requires both
projects:read and tasks:read. Results never cross the credential’s workspace or cell boundary.
Search is the only newly added AI-facing operation: teamgrid_search is a curated, sensitive MCP
tool. Use a dedicated credential and request only the resource types needed for the question.
Bounded asynchronous exports
POST /exports creates a CSV export job for contacts, projects, taskRecurrences, tasks,
timeEntries, or auditEvents.
Exports are bounded to 10,000 rows and at most 16 selected fields. The request supports archived and
updated-at filters and must use a stable Idempotency-Key when retried.
Creating a job requires exports:write; status and download operations require exports:read. The
matching domain read scope and analytics permission are also enforced. Poll GET /exports/{id} until
the state is succeeded or failed; a successful job records whether the requested result was
truncated.
A taskRecurrences export requires task-recurrences:read, tasks:read, and the normal task
permission. Its allowlisted projection includes series identity, name, lifecycle status, owner,
project, current definition identity/version/hash and timestamps. Optional fields can include the
canonical policy, task template and human summary. It exports series state, not occurrence-ledger
rows or generated task content; export generated tasks separately with resourceType: "tasks".
Audit exports additionally require audit:read and an immutable createdAtTo snapshot boundary.
They may use createdAtFrom, span at most 366 days, and never accept updated-at or archive filters.
Only the allowlisted sanitized audit projection can be selected; credentials, raw secrets, request
bodies, and internal tenant fields are not exportable.
Exports stay in the workspace’s owning cell and use a dedicated private bucket that is separate
from normal file uploads. A completed job record is retained for approximately one hour. Objects
under the private developer-exports/ prefix expire after one day, so download a completed export
promptly. If the job is no longer available, create a new export instead of retaining or replaying
an old download capability.
Header-only download capability
Completed exports use a two-step download flow:
- Call
POST /exports/{id}/download-intentto create a short-lived opaque capability. - Call
GET /exports/{id}/downloadwith that value only in theX-TeamGrid-Export-Download-Intentheader.
curl --fail-with-body \
--header "Authorization: Bearer $TEAMGRID_API_TOKEN" \
--header "X-TeamGrid-Export-Download-Intent: $DOWNLOAD_INTENT" \
--output teamgrid-export.csv \
"https://api.de.teamgrid.app/v1/exports/$EXPORT_ID/download"
Never put the intent in a query parameter, URL, command history, log, or analytics field. The
download endpoint does not accept a query-string fallback. TeamGrid resolves private object storage
internally and streams the file through the API with redirects disabled, a 50 MiB response limit,
Cache-Control: no-store, and content-type hardening. It does not reveal a storage URL.
Export jobs, intents, metadata, and bulk content are forbidden in every MCP profile.