Skip to main content
Use the Public REST API to connect operational systems to Trellis. Create a key in Settings > Developer, discover its workspace, then read the records you need before creating or updating them. This guide covers common task and property operations; the interactive reference contains the full request and response schemas.
Use the Public OpenAPI document for the available operational endpoints and the dedicated Workflow OpenAPI document for definitions, runs, tests, variables, and approvals. Build against documented operations so your integration can validate fields, permissions, and responses.

Base URL

Interactive reference:
OpenAPI document:
Workflow OpenAPI document:

Authentication

Send the workspace API key as a Bearer token:
Discover the key’s owner workspace before calling workspace-scoped routes:
Use the returned id as {workspaceId}. The response contains only the key’s owner workspace. Public REST calls do not require a Trellis web login session or browser cookie. Store API keys only in trusted server-side environments, and rotate a key from Settings > Developer if it is exposed. Keys created for a named server integration are single-workspace technical identities. The administrator who creates the key is retained for audit only and is not exposed as a user or assignee. Requests are limited to the key’s owner workspace and scopes, and the key remains active until it expires or an administrator of that workspace revokes it. Named integration presets limit the available scopes. For example, the RapidEye preset permits selected task and operational actions plus property reads; it does not permit property creation, updates, or deletion. Read each operation’s required scope in the interactive reference before enabling it. MCP client keys remain member-based and inherit the creator’s active workspace membership and role. You can also authenticate with an access token obtained from POST /api/v1/auth/token. See Authentication for details.
Authentication and scope requirements are listed per operation in the OpenAPI documents. A valid credential does not grant access to every operation or to another workspace.

Contract versions

The generated OpenAPI document is the source for the current schemas and all resource versions. Breaking changes require a new object contract version or a new REST API version.

Endpoints

Workspace discovery

Properties

Custom property fields

See Read and write custom fields for discovery and value updates.

Tasks

Task checklist actions, attachments, and tags

Workspace lookups

Workflow automations

The Workflow API manages saved definitions and their immutable versions separately from executions. Use the dedicated Workflow OpenAPI document for the complete operation list and request schemas. Run listings, counts, health summaries, action choices, and previous/next navigation exclude executions of automatic standard tasks. Their persisted execution details remain available by run ID for diagnostics. Workflow API keys use three least-privilege scopes:
  • workflows:read reads definitions, versions, runs, tests, and related resources.
  • workflows:write creates or changes saved resources.
  • workflows:execute starts execution, activates a definition, resolves approvals, and retries runs.
Create and execution requests that declare Idempotency-Key can be retried safely with the same request body. Mutations that declare If-Match require the current ETag, which prevents one client from overwriting a newer change. Run requests return 202 Accepted; follow the response’s status URL until the run reaches a final state.

Pagination

Task and property lists accept limit and offset. Check other operations individually: some resources use their own pagination contract. Paginated responses include a pagination object. The records may be named tasks, data, or another resource-specific field; use the operation schema rather than assuming a common items field. For example:

Properties

List properties

Supported filters: Property statuses: PROSPECT, ONBOARDING, ACTIVE, AT_RISK, INACTIVE.

Get a property

Create a property

Update a property

First retrieve the property with GET and save the response’s ETag header, including its quotes, as TRELLIS_PROPERTY_ETAG. Send that exact value in If-Match when updating. A stale version returns 412; a missing version returns 428. Fetch the latest record and review the new values before trying again.
PATCH and PUT both apply the supplied fields without clearing omitted fields. Read the returned record and new ETag before another update.

Delete a property

Property object

Property reads return a canonical record under data, with response metadata under meta. Location fields are nested under location; write requests use the documented update fields, so do not send an entire read response back as an update. Additional room count fields (kitchens, livingRooms, hallways, terraces, balconies, gardens), stay limits (minNights, maxNights, minGuests), and deal tracking (dealValue) are also available. See the interactive reference or OpenAPI document for the full schema.

Read and write custom fields

Use GET /workspaces/{workspaceId}/property-fields to discover field definitions and GET /workspaces/{workspaceId}/properties/{propertyId}/fields to read their values. Write a value through the dedicated /properties/{propertyId}/fields/{fieldDefinitionId} operation using its stable field definition ID. Document values have their own operations. Do not send a customFields object to the core property update endpoint.

Tasks

List tasks

Supported filters: Task statuses: OPEN, CREATED, DRAFT, DRAFTED, SCHEDULED, IN_PROGRESS, FINISHED, CLOSED, PENDING_APPROVAL, REQUEST_APPROVED, REQUEST_REJECTED, COMPLETED. Use COMPLETED to complete a task. FINISHED is a legacy input alias and is normalized to COMPLETED when saved. Task responses present legacy finished records as COMPLETED. Visits use COMPLETED and do not have a FINISHED status. Task priorities: WATCH, LOWEST, LOW, NORMAL, HIGH, URGENT. Task sources: MANUAL, AUTOMATION, SCHEDULE_RULE, INTEGRATION, AI, REVIEW, MESSAGE, CALL, MEETING_BOT. Use the include query parameter to embed cost items and assignees in the task response:
When included, each task will contain:
  • costItems: Array of cost line items with amount, currency, description, billToType, categoryName, and notes.
  • assignees: Array of task assignees with role (PRIMARY or SECONDARY), type (USER or VENDOR), userId, vendorOrgId, and name.

Get a task

Create a task

Task creation uses the same Trellis mutation path as the app: assignees, tags, visit links, activity, notifications, automations, enrichment, and connected operational sync are handled by the normal task side-effect pipeline. Select a department explicitly when you know which team should own the work. The schema also supports name-based resolution and template defaults; check departmentName, templateId or templateName, and assignmentIntent when using those paths. Common create request fields:

Update a task

Fetch the task first and copy its task.updatedAt value into the required expectedUpdatedAt field. Replace the timestamp below with the exact value you received. This prevents your integration from overwriting a newer change.
Completion still checks required checklist items, proof, and workflow rules. Resolve the returned blocker instead of repeatedly submitting the same status change. Additional update-only fields: status, summary, completedAt, startedAt, sortOrder, projectId, billableToOwner, cost, costCurrency, isNoCharge, customFields, completionFields, replacePrimaryUser.

Delete a task

Task object

Additional fields for integrations, scheduling, vendor workflows, and AI provenance are also returned. See the interactive reference or OpenAPI document for the full schema.

External checklist actions

Use a linked checklist action when another service must finish work before the Trellis task can be completed. The same externalSource and externalId can be retried safely for one task.
The actionUrl must use HTTPS. Trellis displays it as the checklist action link without modifying the originating template. When externalSource is exactly rapideye, Trellis also appends one labeled inspection link to the existing task description and sends that description update to the connected operations provider. Retrying the same item does not duplicate the description link, and a pending or failed provider delivery can be retried safely. Other external sources remain Trellis-only. A required item with blocksCompletion: true prevents normal task completion until the item is completed. After the external work finishes, mark the item complete. Repeating this request preserves the first completion timestamp:

Durable task photos

The attachment operation downloads an existing public HTTPS image immediately and stores a durable copy in Trellis. Signed source URLs are supported: they only need to remain valid for the duration of the POST request.
The source must be reachable without cookies or provider-specific headers, use HTTPS, resolve only to public network addresses, return the declared image/* content type, and be no larger than 25 MB. Trellis records the downloaded byte count rather than trusting the optional sizeBytes hint. After the copy succeeds, Trellis keeps the durable internal URL and does not retain or return the signed source URL. For backward compatibility, both internalUrl and the legacy externalUrl response field point to the durable Trellis copy. The durable image is then queued through the same task-media sync used by the Trellis app; a linked operations provider such as Breezeway receives its own copy asynchronously. Repeating the same task, source, and external ID with the same API key returns the existing durable attachment without downloading it again. If that idempotency record predates durable storage, sending a fresh source URL backfills its Trellis copy.

Task tags

Discover the active tags that can be assigned to tasks:
Use a returned id to assign the tag idempotently:
Only active tags configured for tasks in the same workspace can be assigned. Removing an assignment is also idempotent, so retrying a successful delete returns success. Assignments and removals use the standard task-tag sync; tags mapped to the task’s linked operations provider are propagated there, while Trellis-only tags remain local.

Departments and assignable users

Use GET /workspaces/{workspaceId}/departments to select a valid departmentId for task creation. Use GET /workspaces/{workspaceId}/users to list active assignees. The user response includes display name, role, membership ID, user ID, and department IDs; email addresses and phone numbers are not returned.

Daily work orders

The daily work orders endpoint returns tasks with status SCHEDULED in field-ops departments for a single calendar date, formatted as costed work orders with assignee details. Use it for daily operations reports and workforce cost summaries. Tasks in other statuses or non-field-ops departments are excluded.
Response:
When tasks use multiple currencies, totalCost is null, totalCostCurrency is "MIXED", and costTotalsByCurrency contains per-currency totals.

Errors