Execute a Public Data API action
Single endpoint for all Public Data API operations. The `action` field in the request body determines which operation to execute. ### Read Actions | Action | Scope | Description | |---|---|---| | `get-active-users` | `users:read` | Get all active users | | `get-employees` | `employees:read` | Get employees with filters | | `get-user-memberships` | `users:read` | Get user-client memberships | | `get-work-item` | `work_items:read` | Get a single work item | | `list-work-items` | `work_items:read` | List work items with filters | | `get-work-item-relationships` | `work_items:read` | Get work item relationships | | `get-work-item-attachments` | `work_items:read` | Get work item attachments | | `get-work-item-photos` | `work_items:read` | Get work item photos | | `get-work-item-comments` | `work_items:read` | Get work item comments | | `get-work-item-time-entries` | `work_items:read` | Get work item time entries | | `get-work-item-assignees` | `work_items:read` | Get work item assignees | | `get-work-item-analytics` | `work_items:read` | Get work item analytics | | `get-work-item-sla` | `work_items:read` | Get work item SLA status | | `get-attendance-logs` | `attendance:read` | Get clock in/out records | | `get-shift-templates` | `shifts:read` | Get shift templates | | `get-shift-roster` | `roster:read` | Get scheduled shifts | | `get-locations` | `locations:read` | Get locations and geofences | | `get-timesheets` | `timesheets:read` | Get timesheet records | | `export-timesheets` | `timesheets:read` | Export timesheets (Sage/Payspace/SimplePay/Pastel) | | `get-overtime-records` | `overtime:read` | Get overtime records | | `list-threads` | `threads:read` | List conversation threads | | `get-job-thread` | `threads:read` | Get a job thread | | `get-job-threads` | `threads:read` | List job threads | | `get-team-thread` | `threads:read` | Get a team thread | | `get-team-threads` | `threads:read` | List team threads | | `get-thread-messages` | `threads:read` | Get messages in a thread | | `list-contacts` | `contacts:read` | List contacts | | `get-contact` | `contacts:read` | Get a single contact | | `list-contact-people` | `contacts:read` | List contact people | | `get-contact-person` | `contacts:read` | Get a contact person | | `search-contact-people` | `contacts:read` | Search contact people | | `get-contact-person-locations` | `contacts:read` | Get contact person locations | | `list-contact-locations` | `contacts:read` | List contact locations | | `get-contact-location` | `contacts:read` | Get a contact location | | `get-contact-location-people` | `contacts:read` | Get people at a location | | `list-contact-documents` | `contacts:read` | List contact documents | | `search-contacts` | `contacts:read` | Search contacts | | `search-contact-locations` | `contacts:read` | Search contact locations | | `list-recurring-jobs` | `recurring:write` or `work_items:read` | List recurring jobs | | `get-recurring-job` | `recurring:write` or `work_items:read` | Get a recurring job | ### Write Actions | Action | Scope | Description | |---|---|---| | `send-thread-message` | `threads:send_message` or `threads:write` | Send a message to a thread | | `create-work-item` | `work_items:write` | Create a new work item | | `create-appointment` | `appointments:write` or `work_items:write` | Create an appointment | | `create-comment` | `comments:write` or `work_items:write` | Add a comment to a work item | | `create-recurring-job` | `recurring:write` or `work_items:write` | Create a recurring job | | `update-recurring-job` | `recurring:write` or `work_items:write` | Update a recurring job | | `pause-recurring-job` | `recurring:write` or `work_items:write` | Pause a recurring job | | `resume-recurring-job` | `recurring:write` or `work_items:write` | Resume a recurring job | | `generate-recurring-job` | `recurring:write` or `work_items:write` | Generate instances from a recurring job | | `generate-job-card-pdf` | `work_items:read` | Generate a job card PDF | | `generate-attendance-card-pdf` | `work_items:read` | Generate an attendance card PDF | | `generate-finance-document-pdf` | `invoices:read` or `bills:read` or `quotes:read` | Generate a PDF for a finance document (invoice, quote, credit note, etc.) | | `convert-finance-document` | `invoices:write` or `bills:write` or `quotes:write` | Convert one finance document type to another (e.g. quote → invoice) | ### Dynamic Per-Type Actions For each work item type defined in the system (e.g. `job`, `invoice`, `task`), a dynamic `list-<type>` action is generated that maps to `list-work-items` with the `item_type` preset.
Single endpoint for all Public Data API operations. The action field
in the request body determines which operation to execute.
Read Actions
| Action | Scope | Description |
|---|---|---|
get-active-users | users:read | Get all active users |
get-employees | employees:read | Get employees with filters |
get-user-memberships | users:read | Get user-client memberships |
get-work-item | work_items:read | Get a single work item |
list-work-items | work_items:read | List work items with filters |
get-work-item-relationships | work_items:read | Get work item relationships |
get-work-item-attachments | work_items:read | Get work item attachments |
get-work-item-photos | work_items:read | Get work item photos |
get-work-item-comments | work_items:read | Get work item comments |
get-work-item-time-entries | work_items:read | Get work item time entries |
get-work-item-assignees | work_items:read | Get work item assignees |
get-work-item-analytics | work_items:read | Get work item analytics |
get-work-item-sla | work_items:read | Get work item SLA status |
get-attendance-logs | attendance:read | Get clock in/out records |
get-shift-templates | shifts:read | Get shift templates |
get-shift-roster | roster:read | Get scheduled shifts |
get-locations | locations:read | Get locations and geofences |
get-timesheets | timesheets:read | Get timesheet records |
export-timesheets | timesheets:read | Export timesheets (Sage/Payspace/SimplePay/Pastel) |
get-overtime-records | overtime:read | Get overtime records |
list-threads | threads:read | List conversation threads |
get-job-thread | threads:read | Get a job thread |
get-job-threads | threads:read | List job threads |
get-team-thread | threads:read | Get a team thread |
get-team-threads | threads:read | List team threads |
get-thread-messages | threads:read | Get messages in a thread |
list-contacts | contacts:read | List contacts |
get-contact | contacts:read | Get a single contact |
list-contact-people | contacts:read | List contact people |
get-contact-person | contacts:read | Get a contact person |
search-contact-people | contacts:read | Search contact people |
get-contact-person-locations | contacts:read | Get contact person locations |
list-contact-locations | contacts:read | List contact locations |
get-contact-location | contacts:read | Get a contact location |
get-contact-location-people | contacts:read | Get people at a location |
list-contact-documents | contacts:read | List contact documents |
search-contacts | contacts:read | Search contacts |
search-contact-locations | contacts:read | Search contact locations |
list-recurring-jobs | recurring:write or work_items:read | List recurring jobs |
get-recurring-job | recurring:write or work_items:read | Get a recurring job |
Write Actions
| Action | Scope | Description |
|---|---|---|
send-thread-message | threads:send_message or threads:write | Send a message to a thread |
create-work-item | work_items:write | Create a new work item |
create-appointment | appointments:write or work_items:write | Create an appointment |
create-comment | comments:write or work_items:write | Add a comment to a work item |
create-recurring-job | recurring:write or work_items:write | Create a recurring job |
update-recurring-job | recurring:write or work_items:write | Update a recurring job |
pause-recurring-job | recurring:write or work_items:write | Pause a recurring job |
resume-recurring-job | recurring:write or work_items:write | Resume a recurring job |
generate-recurring-job | recurring:write or work_items:write | Generate instances from a recurring job |
generate-job-card-pdf | work_items:read | Generate a job card PDF |
generate-attendance-card-pdf | work_items:read | Generate an attendance card PDF |
generate-finance-document-pdf | invoices:read or bills:read or quotes:read | Generate a PDF for a finance document (invoice, quote, credit note, etc.) |
convert-finance-document | invoices:write or bills:write or quotes:write | Convert one finance document type to another (e.g. quote → invoice) |
Dynamic Per-Type Actions
For each work item type defined in the system (e.g. job, invoice, task),
a dynamic list-<type> action is generated that maps to list-work-items
with the item_type preset.
Authorization
ApiKeyAuth API key for the Public Data API and MCP bridge.
Keys are prefixed with ta_sk_ (production) or ta_test_ (sandbox).
X-API-Key: ta_sk_xxxxxxxxxxxxxxxxxxxxIn: header
Header Parameters
Date-based minor version negotiation (e.g. 2026-07-01).
If omitted, the latest version is used.
^\d{4}-\d{2}-\d{2}$UUID v4 or arbitrary string (max 255 chars) to prevent duplicate
processing of retried requests. When the same key is sent with the
same request body, the original response is returned with an
X-Idempotent-Replay: true header. If the same key is sent with
a different body, a 409 Conflict is returned.
length <= 255Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/v1/public/data" \ -H "Content-Type: application/json" \ -d '{ "action": "list-work-items", "status": "open", "limit": 50 }'{ "success": true, "data": [], "error": "string", "meta": { "api_version": "string", "request_id": "string", "pagination": { "total": 0, "limit": 0, "offset": 0 } }}{ "success": false, "error": { "code": "BAD_REQUEST", "message": "Request body is empty. Expected JSON with action field.", "request_id": "req_abc123", "documentation_url": "https://dev-developer.totalaccess.co.za/docs/api-reference/errors#bad_request" }}{ "success": false, "error": { "code": "UNAUTHORIZED", "message": "API key required", "request_id": "req_abc123", "documentation_url": "https://dev-developer.totalaccess.co.za/docs/api-reference/errors#unauthorized" }}{ "success": false, "error": { "code": "SCOPE_REQUIRED", "message": "API key lacks work_items:read scope", "request_id": "req_abc123", "documentation_url": "https://dev-developer.totalaccess.co.za/docs/api-reference/errors#scope_required" }}{ "success": false, "error": { "code": "IDEMPOTENCY_CONFLICT", "message": "Idempotency key was already used with a different request body", "request_id": "req_abc123", "documentation_url": "https://dev-developer.totalaccess.co.za/docs/api-reference/errors#idempotency_conflict" }}{ "success": false, "error": { "code": "RATE_LIMITED", "message": "Rate limit exceeded. Maximum 100 requests per minute.", "request_id": "req_abc123", "documentation_url": "https://dev-developer.totalaccess.co.za/docs/api-reference/errors#rate_limited" }}{ "success": false, "error": { "code": "INTERNAL_ERROR", "message": "Internal server error", "request_id": "req_abc123", "documentation_url": "https://dev-developer.totalaccess.co.za/docs/api-reference/errors#internal_error" }}