Total Access Docs
Openapi

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.

POST
/api/v1/public/data

Single endpoint for all Public Data API operations. The action field in the request body determines which operation to execute.

Read Actions

ActionScopeDescription
get-active-usersusers:readGet all active users
get-employeesemployees:readGet employees with filters
get-user-membershipsusers:readGet user-client memberships
get-work-itemwork_items:readGet a single work item
list-work-itemswork_items:readList work items with filters
get-work-item-relationshipswork_items:readGet work item relationships
get-work-item-attachmentswork_items:readGet work item attachments
get-work-item-photoswork_items:readGet work item photos
get-work-item-commentswork_items:readGet work item comments
get-work-item-time-entrieswork_items:readGet work item time entries
get-work-item-assigneeswork_items:readGet work item assignees
get-work-item-analyticswork_items:readGet work item analytics
get-work-item-slawork_items:readGet work item SLA status
get-attendance-logsattendance:readGet clock in/out records
get-shift-templatesshifts:readGet shift templates
get-shift-rosterroster:readGet scheduled shifts
get-locationslocations:readGet locations and geofences
get-timesheetstimesheets:readGet timesheet records
export-timesheetstimesheets:readExport timesheets (Sage/Payspace/SimplePay/Pastel)
get-overtime-recordsovertime:readGet overtime records
list-threadsthreads:readList conversation threads
get-job-threadthreads:readGet a job thread
get-job-threadsthreads:readList job threads
get-team-threadthreads:readGet a team thread
get-team-threadsthreads:readList team threads
get-thread-messagesthreads:readGet messages in a thread
list-contactscontacts:readList contacts
get-contactcontacts:readGet a single contact
list-contact-peoplecontacts:readList contact people
get-contact-personcontacts:readGet a contact person
search-contact-peoplecontacts:readSearch contact people
get-contact-person-locationscontacts:readGet contact person locations
list-contact-locationscontacts:readList contact locations
get-contact-locationcontacts:readGet a contact location
get-contact-location-peoplecontacts:readGet people at a location
list-contact-documentscontacts:readList contact documents
search-contactscontacts:readSearch contacts
search-contact-locationscontacts:readSearch contact locations
list-recurring-jobsrecurring:write or work_items:readList recurring jobs
get-recurring-jobrecurring:write or work_items:readGet a recurring job

Write Actions

ActionScopeDescription
send-thread-messagethreads:send_message or threads:writeSend a message to a thread
create-work-itemwork_items:writeCreate a new work item
create-appointmentappointments:write or work_items:writeCreate an appointment
create-commentcomments:write or work_items:writeAdd a comment to a work item
create-recurring-jobrecurring:write or work_items:writeCreate a recurring job
update-recurring-jobrecurring:write or work_items:writeUpdate a recurring job
pause-recurring-jobrecurring:write or work_items:writePause a recurring job
resume-recurring-jobrecurring:write or work_items:writeResume a recurring job
generate-recurring-jobrecurring:write or work_items:writeGenerate instances from a recurring job
generate-job-card-pdfwork_items:readGenerate a job card PDF
generate-attendance-card-pdfwork_items:readGenerate an attendance card PDF
generate-finance-document-pdfinvoices:read or bills:read or quotes:readGenerate a PDF for a finance document (invoice, quote, credit note, etc.)
convert-finance-documentinvoices:write or bills:write or quotes:writeConvert 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
X-API-Key<token>

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_xxxxxxxxxxxxxxxxxxxx

In: header

Header Parameters

X-API-Version?string

Date-based minor version negotiation (e.g. 2026-07-01). If omitted, the latest version is used.

Match^\d{4}-\d{2}-\d{2}$
Idempotency-Key?string

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.

Lengthlength <= 255

Request 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"  }}