Nowsta Sync
By: Nicholas Stewart
Read-only service that optimizes the Nowsta API by converting its responses into consolidated, analytics-ready data built to be pulled onto a spreadsheet or BI platform including Microsoft Fabric at the bronze level. As every record is accounted for, Microsoft workflows falling out of sync with the Nowsta semantic model is now a thing of the past.
A built-in thread-safe rate limiter matches Nowsta's per-company limits (10 req/s, 1000 req/hour) and retries automatically on
429 failure with backoff, honoring Retry-After. Because of caching, the data can be polled frequently (every 25 minutes) on a schedule without repeating the expensive work or bumping into those limits.
https://nowsta.tpc-utils.netHow it works
| Modules | |
|---|---|
server.py | Web app & routes, inbound auth, request logging, JSON error handling. |
api.py | The Nowsta API client: authenticated calls, rate limiting, pagination, hydration, row builders. |
cache.py | Recycled record cache, thread-safe and persistent. |
utils.py | Auth/logging setup, rate limiter, and date-window parsing. |
Request lifecycle
The caller sends a request with the bearer token the auth guard checks NOWSTA_PUBLIC_TOKEN
the route reads its params and calls the Nowsta client, which makes rate-limited, paged calls to Nowsta using NOWSTA_PRIVATE_TOKEN; ids are hydrated into full
records (recycled from the cache) and the result comes back in the standard JSON response.
Optimizations
Assembling the Nowsta data is the expensive part: a single request for shift data can fan out into hundreds of follow-up calls to retreive relevant employee, uniforms and event information. Nowsta Sync is lighting fast: follow-up records are fetched in parallel and the slow-moving ones are cached and reused across requests.
Response times
GET /shifts over ~2.5 weeks. Response times may vary with date range and activity.What’s cached, what’s live
Only the stable by-id records are cached the fast-changing data points are always fetched fresh. Records
persist in a local cache (default 6-hour TTL), so a restart keeps the warm data. Add ?refresh=true
to force the cached records to re-fetch.
| Cached? | Why | |
|---|---|---|
| shift · payroll | No | Can change frequently (e.g. worker allocation, hours worked) |
| company_user · uniform | Yes | Changes rarely or not at all (e.g. first/last name, clothing size) |
Authentication
Endpoints require a bearer token the value of the server's NOWSTA_PUBLIC_TOKEN. Send it on every request:
Authorization: Bearer <NOWSTA_PUBLIC_TOKEN>
An X-API-Key: <token> header is also accepted. A missing or wrong token returns 401
with {"message":"Unauthorized","data":null}.
This token authenticates callers to this service. It is separate from
NOWSTA_PRIVATE_TOKEN, which the service uses to call Nowsta and is never exposed here. If
NOWSTA_PUBLIC_TOKEN is unset the service runs unauthenticated (and logs a warning).
Microsoft Fabric
Landing his data in Fabric is just an automated, scheduled pull that points at the endpoint and writes the
data.objects array into a Lakehouse. Three common patterns, lowest-code first:
1 · Dataflow Gen2 (Power Query) → Lakehouse
Best for a no-code, scheduled refresh. Create a Dataflow Gen2, add a blank query, and paste:
let
token = "•••", // your NOWSTA_PUBLIC_TOKEN
base = "https://nowsta.internal", // where this service runs
resp = Web.Contents(base, [
RelativePath = "schedule-data",
Headers = [ #"Authorization" = "Bearer " & token ]
]),
doc = Json.Document(resp),
rows = doc[data][objects],
result = Table.FromRecords(rows)
in
resultExpand result, set the column types, then Load to a Lakehouse table and give the dataflow a
scheduled refresh (e.g. daily). The column names already match your report schema, so nothing to rename.
2 · Data Factory pipeline (Copy activity, REST source) → Lakehouse / Warehouse
Best for orchestration and incremental windows.
- Create an HTTP / REST connection to the service base URL; add header
Authorization: Bearer <token>. - In a Copy activity, set the relative URL to
/schedule-data(append?starts_at=…&ends_at=…for a window) and response format JSON. - Set the source collection / records path to
data.objectsso each object becomes a row. - Sink to a Lakehouse Delta table (or Warehouse) and add a schedule trigger. Parameterize the date window to loop for incremental loads.
3 · Fabric Notebook (PySpark)
Best when you want transforms or upserts in code. Schedule the notebook from a pipeline.
import requests
from pyspark.sql import Row
base = "https://nowsta.internal"
token = mssparkutils.credentials.getSecret("my-keyvault", "nowsta-public-token")
r = requests.get(
f"{base}/schedule-data",
headers={"Authorization": f"Bearer {token}"},
params={"starts_at": "2026-08-01T00:00:00Z"},
)
r.raise_for_status()
rows = r.json()["data"]["objects"]
df = spark.createDataFrame([Row(**row) for row in rows])
df.write.mode("overwrite").saveAsTable("nowsta_schedule")Landing & modeling notes
- Point ingestion at
data.objectsfor list endpoints, ordatafor single-record endpoints. - Let scheduled pulls use the cache (omit
refresh), only pass?refresh=truewhen you need the very latest employee or uniform records. - Chunk large date ranges in the pipeline, the service also throttles & retries automatically so wide windows just take longer.
- Keep the bearer token in a Fabric connection credential or Key Vault secret never inline in a query.
- Land in a Lakehouse Delta table → Direct Lake semantic model → Power BI for near-real-time reporting.
Power Automate
A scheduled cloud flow can pull an endpoint and drop the result into SharePoint or OneDrive as a CSV that
Power BI then refreshes from. The flow follows the response envelope: read data.objects, shape the
rows, and write the file.
- Recurrence set the schedule (for example, every 25 minutes).
- HTTP Method
GETURI the endpoint (e.g.https://…/schedule-data?starts_at=…) add the headerAuthorization: Bearer <NOWSTA_PUBLIC_TOKEN>. - Parse JSON Content = the HTTP
Body. The payload is the standard envelope, so the rows live atdata.objects. - Select From =
body('Parse_JSON')?['data']?['objects']; map the columns you want (the/schedule-datakeys are already report-ready). - Create CSV table From = the
Selectoutput; Columns = Automatic. - Update file (SharePoint) write the
Create CSV tableoutput to your file; Power BI refreshes from it.
Keep NOWSTA_PUBLIC_TOKEN in a secure input or environment variable rather than inline in the HTTP action.
Other automation
Any scheduler (cron, Airflow, GitHub Actions, an Azure Function) can pull the same JSON and drop it into OneLake, blob storage, or a database. For example, a nightly job to a JSON file:
curl -s -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" "$BASE_URL/schedule-data?starts_at=2026-08-01T00:00:00Z" | jq ".data.objects" > schedule.json
Or reuse the built-in report shape: /schedule-data's columns are the report columns, so writing
data.objects straight to CSV/Parquet produces the same schedule table your BI already expects.
List shifts
/shiftsstarts_at2026-07-29T00:00:00Z). Defaults to today 00:00 UTC.ends_atstarts_at.refreshcompany_user records, bypassing the cache./shiftscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/shifts"
{
"message": "Nowsta shifts received.",
"data": {
"count": 1,
"objects": [
{
"id": 90210,
"company_id": 88,
"name": "Summer Gala",
"event_id": 4455,
"event_name": "Summer Gala",
"position_id": 3136,
"position_name": "Server",
"department_id": 140,
"starts_at": "2026-07-29T09:00:00",
"ends_at": "2026-07-29T17:00:00",
"quantity": 4,
"open_count": 4,
"instructions": "See details.",
"time_zone": "America/New_York",
"client_id": 712,
"uniform_id": 796,
"venue_id": 330,
"rate_cents": 2500,
"default_rate_cents": 2500,
"pay_rate_cents": 2500,
"bill_rate_cents": 2500,
"default_bill_rate_cents": 2500,
"tip_policy": "example",
"tip_policy_flexpool": "example",
"published": true,
"event_workers": [
{
"id": 90210,
"shift_id": 90210,
"company_user_id": 3001,
"company_user_payroll_id": "125.00",
"status": "confirmed",
"shift_slot_id": 5501,
"pay_rate_cents": 2500,
"total_compensation_cents": 2500,
"duration_in_hours": 8.0,
"removed_at": null,
"removed_by_company_user_id": null,
"company_user": {
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
}
}
],
"event": {
"id": 4455,
"company_id": 88,
"name": "Summer Gala",
"occurs_at": "2026-07-29T09:00:00Z",
"ends_at": "2026-07-29T17:00:00",
"time_zone": "America/New_York",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"venue_name": "Grand Hall",
"venue_parking_instructions": "See details.",
"venue_parking_type": "standard",
"venue_radius_yards": 1,
"client_id": 712,
"client_name": "Acme Events",
"department_id": 140,
"uniform_id": 796,
"base_venue_id": 330,
"org_unit_id": 21,
"division_id": 9,
"worker_instructions": "See details.",
"internal_worker_instructions": "See details.",
"external_worker_instructions": "See details.",
"supervisor_notes": "See details.",
"admin_notes": "See details.",
"agency_notes": "See details.",
"contact_name": "Summer Gala",
"contact_phone_number": "+1-555-0100",
"number_of_guests": 4,
"event_type": "standard",
"booking_status": "active",
"budget_cents": 2500,
"invoice_amount_cents": 2500,
"archived_at": null,
"external_id": "E12345",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}
]
}
}Schedule data report
/schedule-datastarts_atends_atrefresh/schedule-datacurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/schedule-data"
{
"message": "Nowsta schedule data received.",
"data": {
"count": 1,
"objects": [
{
"Clothing Gender": "",
"Clothing Jacket Size": "Women 4",
"Clothing Neck Size": "13.5 inches",
"Clothing Pants": "28x32 or Size 4",
"Clothing Shirt Size": "S",
"Clothing Shoe Size": "9.5 med",
"Clothing Waist": "",
"Data Last Refresh": "7/28/2026 19:00",
"Date": "8/12/2026 9:00",
"email": "diana@example.com",
"Employee Id": 1919312,
"Event ID": "E19626 - S57451",
"Event Name": "Ice Cream Social @ 345 Park",
"First Name": "Diana",
"Last Name": "F.",
"Nowsta Event ID": 4013442,
"Nowsta Event Page Url": "https://app.nowsta.com/events/4013442?date=2026-08-12",
"Phone Number": "9173966397",
"position": 3136,
"Position Name": "Waiter",
"rate": 25.0,
"scheduled cost": 125.0,
"scheduled hours": 5.0,
"scheduled in": "8/12/2026 9:00",
"scheduled out": "8/12/2026 14:00",
"Shift ID": 14958714,
"Shift Quantity": 4,
"Uniform": "All black, grey stripe apron & skinny tie",
"Uniform ID": 796
}
]
}
}Worker allocation report
/worker-allocationstarts_atends_at/worker-allocationcurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/worker-allocation"
{
"message": "Nowsta worker allocation received.",
"data": {
"count": 1,
"objects": [
{
"event_id": 4455,
"event_name": "Summer Gala",
"external_id": "E12345",
"event_url": "https://app.nowsta.com/events/4455?date=2026-07-29",
"event_date": "2026-07-29",
"shift_id": 90210,
"position": "Server",
"shift_quantity": 4,
"assigned_workers": 2,
"requested_workers": 1,
"confirmed_workers": 1,
"declined_workers": 0,
"total_workers": 4,
"empty_slots": 0
}
]
}
}Event workers for a shift
/shifts/{shift_id}/event_workersThe workers on one shift, each hydrated with the full company_user and event records.
shift_idinclude_removedrefresh/shifts/{shift_id}/event_workerscurl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/shifts/{shift_id}/event_workers"{
"message": "Shift event workers received.",
"data": {
"count": 1,
"objects": [
{
"id": 7701,
"shift_id": 90210,
"company_user_id": 3001,
"company_id": 88,
"status": "confirmed",
"shift_slot_id": 5501,
"removed_at": null,
"removed_by_id": null,
"starts_at": "2026-07-29T09:00:00",
"ends_at": "2026-07-29T17:00:00",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"position_id": 3136,
"position_name": "Server",
"event_id": 4455,
"event_name": "Summer Gala",
"company_user": {
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
},
"event": {
"id": 4455,
"company_id": 88,
"name": "Summer Gala",
"occurs_at": "2026-07-29T09:00:00Z",
"ends_at": "2026-07-29T17:00:00",
"time_zone": "America/New_York",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"venue_name": "Grand Hall",
"venue_parking_instructions": "See details.",
"venue_parking_type": "standard",
"venue_radius_yards": 1,
"client_id": 712,
"client_name": "Acme Events",
"department_id": 140,
"uniform_id": 796,
"base_venue_id": 330,
"org_unit_id": 21,
"division_id": 9,
"worker_instructions": "See details.",
"internal_worker_instructions": "See details.",
"external_worker_instructions": "See details.",
"supervisor_notes": "See details.",
"admin_notes": "See details.",
"agency_notes": "See details.",
"contact_name": "Summer Gala",
"contact_phone_number": "+1-555-0100",
"number_of_guests": 4,
"event_type": "standard",
"booking_status": "active",
"budget_cents": 2500,
"invoice_amount_cents": 2500,
"archived_at": null,
"external_id": "E12345",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}
]
}
}List payroll items
/payrollstarts_atends_atitem_modeitem_mode filter.row_split_moderow_split_mode filter.include_unapprovedrefresh/payrollcurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/payroll"
{
"message": "Nowsta payroll items received.",
"data": {
"count": 1,
"objects": [
{
"company_user_id": 3001,
"position_id": 3136,
"event_id": 4455,
"client_id": 712,
"rate": "125.00",
"client_bill_rate": {
"fractional": "125.00"
},
"client_bill_total": {
"fractional": "125.00"
},
"first_item_for_punchcard": true,
"hours": 8.0,
"starts_at": "2026-07-29T09:00:00",
"ends_at": "2026-07-29T17:00:00",
"scheduled_in": "2026-07-29T09:00:00",
"scheduled_out": "2026-07-29T17:00:00",
"break_hours": 8.0,
"minimum_hours_difference": 8.0,
"additional_pay": {
"fractional": "125.00"
},
"total_pay": {
"fractional": "125.00"
},
"bonus_pay": {
"fractional": "125.00"
},
"minimum_hours_pay": {
"fractional": "125.00"
},
"drive_pay": {
"fractional": "125.00"
},
"reimbursement_pay": {
"fractional": "125.00"
},
"declared_tips": "125.00",
"nowstapay_deduction": "125.00",
"total_hours": 8.0,
"drive_time_minutes": 30,
"week_start": "2026-07-29T09:00:00Z",
"regular_hours": 8.0,
"regular_rate": {
"fractional": "125.00"
},
"regular_hours_pay": {
"fractional": "125.00"
},
"regular_lm_client_rate": "125.00",
"regular_lm_client_hours_pay": "125.00",
"deep_rate_client_bill_rate": "125.00",
"regular_lm_agency_rate": "125.00",
"regular_lm_agency_hours_pay": "125.00",
"deep_rate_agency_pay_rate": "125.00",
"overtime_hours": 8.0,
"overtime_rate": {
"fractional": "125.00"
},
"overtime_hours_pay": {
"fractional": "125.00"
},
"blended_rate": {
"fractional": "125.00"
},
"overtime_lm_client_rate": "125.00",
"overtime_lm_client_hours_pay": "125.00",
"overtime_lm_agency_rate": "125.00",
"overtime_lm_agency_hours_pay": "125.00",
"double_overtime_hours": 8.0,
"double_overtime_rate": {
"fractional": "125.00"
},
"double_overtime_hours_pay": {
"fractional": "125.00"
},
"double_overtime_lm_client_rate": "125.00",
"double_overtime_lm_client_hours_pay": "125.00",
"double_overtime_lm_agency_rate": "125.00",
"double_overtime_lm_agency_hours_pay": "125.00",
"total_client_billable": "125.00",
"total_agency_spend": "125.00",
"total_profit": "125.00",
"wildflowers_ot_total": "125.00",
"spread_of_hours_pay": {
"fractional": "125.00"
},
"regular_client_bill_rate_naive": {
"fractional": "125.00"
},
"regular_client_bill_amount_naive": {
"fractional": "125.00"
},
"overtime_client_bill_rate_naive": {
"fractional": "125.00"
},
"overtime_client_bill_amount_naive": {
"fractional": "125.00"
},
"double_overtime_client_bill_rate_naive": {
"fractional": "125.00"
},
"double_overtime_client_bill_amount_naive": {
"fractional": "125.00"
},
"client_bill_total_naive": {
"fractional": "125.00"
},
"ew_event_name": "Summer Gala",
"ew_external_event_id": "GALA-2026",
"active_work_breaks": [],
"scheduled_hours": 8.0,
"actual_hours": 8.0,
"company_user_pay_code": "125.00",
"position_pay_code": "125.00",
"company_pay_code": "125.00",
"department_pay_code": "125.00",
"venue_pay_code": "125.00",
"position_name": "Server",
"department_name": "Front of House",
"worker_first_name": "Ada",
"worker_last_name": "Lovelace",
"worker_full_name": "Ada Lovelace",
"punchcard_note": "See details.",
"worker_review": "Great work",
"event_external_id": "E12345",
"event_name": "Summer Gala",
"job_name": "Summer Gala",
"time_zone": "America/New_York",
"venue_name": "Grand Hall",
"client_name": "Acme Events",
"org_unit": "East Region",
"customer_job": "Acme : Summer Gala",
"marketplace_region_name": "Northeast",
"workday_employee_id": "monday",
"first_of_split": true,
"approved": true,
"approved_at": "2026-07-29T09:00:00Z",
"approved_by_company_user_id": 1001,
"company_user": {
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
},
"event": {
"id": 4455,
"company_id": 88,
"name": "Summer Gala",
"occurs_at": "2026-07-29T09:00:00Z",
"ends_at": "2026-07-29T17:00:00",
"time_zone": "America/New_York",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"venue_name": "Grand Hall",
"venue_parking_instructions": "See details.",
"venue_parking_type": "standard",
"venue_radius_yards": 1,
"client_id": 712,
"client_name": "Acme Events",
"department_id": 140,
"uniform_id": 796,
"base_venue_id": 330,
"org_unit_id": 21,
"division_id": 9,
"worker_instructions": "See details.",
"internal_worker_instructions": "See details.",
"external_worker_instructions": "See details.",
"supervisor_notes": "See details.",
"admin_notes": "See details.",
"agency_notes": "See details.",
"contact_name": "Summer Gala",
"contact_phone_number": "+1-555-0100",
"number_of_guests": 4,
"event_type": "standard",
"booking_status": "active",
"budget_cents": 2500,
"invoice_amount_cents": 2500,
"archived_at": null,
"external_id": "E12345",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}
]
}
}List company users
/company_usersquerypayroll_idinclude_archived/company_userscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/company_users"
{
"message": "Nowsta company users received.",
"data": {
"count": 1,
"objects": [
{
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
}
]
}
}Get a company user
/company_users/{company_user_id}company_user_id/company_users/{company_user_id}curl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/company_users/{company_user_id}"{
"message": "Nowsta company user received.",
"data": {
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
}
}Get clothing sizes
/company_users/{company_user_id}/clothing_sizescompany_user_idrefresh/company_users/{company_user_id}/clothing_sizescurl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/company_users/{company_user_id}/clothing_sizes"{
"message": "Company user clothing sizes received.",
"data": {
"count": 1,
"objects": [
{
"id": 8801,
"company_user_id": 3001,
"clothing_size_id": 1001,
"value": "L",
"clothing_size_name": "Shirt",
"clothing_size_data_type": "string",
"clothing_size_units": "US",
"clothing_size_description": "Shirt size",
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"company_user": {
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
}
}
]
}
}List events
/eventsstarts_afterstarts_beforequeryexternal_id/eventscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/events"
{
"message": "Events received.",
"data": {
"count": 1,
"objects": [
{
"id": 4455,
"company_id": 88,
"name": "Summer Gala",
"occurs_at": "2026-07-29T09:00:00Z",
"ends_at": "2026-07-29T17:00:00",
"time_zone": "America/New_York",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"venue_name": "Grand Hall",
"venue_parking_instructions": "See details.",
"venue_parking_type": "standard",
"venue_radius_yards": 1,
"client_id": 712,
"client_name": "Acme Events",
"department_id": 140,
"uniform_id": 796,
"base_venue_id": 330,
"org_unit_id": 21,
"division_id": 9,
"worker_instructions": "See details.",
"internal_worker_instructions": "See details.",
"external_worker_instructions": "See details.",
"supervisor_notes": "See details.",
"admin_notes": "See details.",
"agency_notes": "See details.",
"contact_name": "Summer Gala",
"contact_phone_number": "+1-555-0100",
"number_of_guests": 4,
"event_type": "standard",
"booking_status": "active",
"budget_cents": 2500,
"invoice_amount_cents": 2500,
"archived_at": null,
"external_id": "E12345",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
]
}
}Get an event
/events/{event_id}event_id/events/{event_id}curl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/events/{event_id}"{
"message": "Event received.",
"data": {
"id": 4455,
"company_id": 88,
"name": "Summer Gala",
"occurs_at": "2026-07-29T09:00:00Z",
"ends_at": "2026-07-29T17:00:00",
"time_zone": "America/New_York",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"venue_name": "Grand Hall",
"venue_parking_instructions": "See details.",
"venue_parking_type": "standard",
"venue_radius_yards": 1,
"client_id": 712,
"client_name": "Acme Events",
"department_id": 140,
"uniform_id": 796,
"base_venue_id": 330,
"org_unit_id": 21,
"division_id": 9,
"worker_instructions": "See details.",
"internal_worker_instructions": "See details.",
"external_worker_instructions": "See details.",
"supervisor_notes": "See details.",
"admin_notes": "See details.",
"agency_notes": "See details.",
"contact_name": "Summer Gala",
"contact_phone_number": "+1-555-0100",
"number_of_guests": 4,
"event_type": "standard",
"booking_status": "active",
"budget_cents": 2500,
"invoice_amount_cents": 2500,
"archived_at": null,
"external_id": "E12345",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}Event workers for an event
/events/{event_id}/event_workersevent_idinclude_removedrefresh/events/{event_id}/event_workerscurl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/events/{event_id}/event_workers"{
"message": "Event workers received.",
"data": {
"count": 1,
"objects": [
{
"id": 7701,
"shift_id": 90210,
"company_user_id": 3001,
"company_id": 88,
"status": "confirmed",
"shift_slot_id": 5501,
"removed_at": null,
"removed_by_id": null,
"starts_at": "2026-07-29T09:00:00",
"ends_at": "2026-07-29T17:00:00",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"position_id": 3136,
"position_name": "Server",
"event_id": 4455,
"event_name": "Summer Gala",
"company_user": {
"id": 3001,
"company_id": 88,
"user_id": 1001,
"payroll_id": "example",
"first_name": "Ada",
"last_name": "Lovelace",
"nickname": "Ada",
"email": "ada@example.com",
"phone_number": "+1-555-0100",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"birthday": "2026-07-29T09:00:00Z",
"pronouns": "she/her",
"emergency_contact_name": "Summer Gala",
"emergency_contact_phone_number": "+1-555-0100",
"avatar_url": "https://app.nowsta.com/events/4455",
"notes": "See details.",
"minimum_pay_rate_cents": 2500,
"default_department_id": 1002,
"rank": 4,
"onboarding_status": "active",
"staffing_agency_placeholder": true,
"tablet_access_code": "ABC123",
"tax_class": "W2",
"week_start_day": "monday",
"override_week_start_hour": 1,
"override_daily_overtime_threshold": 1.0,
"opt_in_worker_profile_change_emails": true,
"pay_enabled_at": "2026-07-29T09:00:00Z",
"start_date": "2026-07-29T09:00:00Z",
"workday_metadata": {
"worker_id": "example",
"organization_id": "example"
},
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z",
"user_email": "ada@example.com",
"user_first_name": "Ada",
"user_last_name": "Lovelace"
},
"event": {
"id": 4455,
"company_id": 88,
"name": "Summer Gala",
"occurs_at": "2026-07-29T09:00:00Z",
"ends_at": "2026-07-29T17:00:00",
"time_zone": "America/New_York",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"country_code": "US",
"venue_name": "Grand Hall",
"venue_parking_instructions": "See details.",
"venue_parking_type": "standard",
"venue_radius_yards": 1,
"client_id": 712,
"client_name": "Acme Events",
"department_id": 140,
"uniform_id": 796,
"base_venue_id": 330,
"org_unit_id": 21,
"division_id": 9,
"worker_instructions": "See details.",
"internal_worker_instructions": "See details.",
"external_worker_instructions": "See details.",
"supervisor_notes": "See details.",
"admin_notes": "See details.",
"agency_notes": "See details.",
"contact_name": "Summer Gala",
"contact_phone_number": "+1-555-0100",
"number_of_guests": 4,
"event_type": "standard",
"booking_status": "active",
"budget_cents": 2500,
"invoice_amount_cents": 2500,
"archived_at": null,
"external_id": "E12345",
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}
]
}
}List clients
/clientsname/clientscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/clients"
{
"message": "Clients received.",
"data": {
"count": 1,
"objects": [
{
"id": 712,
"client_company_id": 1001,
"name": "Summer Gala",
"contact_full_name": "Jordan Ops",
"contact_email": "ops@acme.example",
"contact_phone_number": "+1-555-0100",
"admin_notes": "See details.",
"company_user_notes": "See details.",
"supervisor_notes": "See details.",
"org_unit_id": 21,
"parent_client_id": 1002,
"early_check_in_override": true,
"maximum_check_in_minutes_before_scheduled": 1,
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
]
}
}Get a client
/clients/{client_id}client_id/clients/{client_id}curl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/clients/{client_id}"{
"message": "Client received.",
"data": {
"id": 712,
"client_company_id": 1001,
"name": "Summer Gala",
"contact_full_name": "Jordan Ops",
"contact_email": "ops@acme.example",
"contact_phone_number": "+1-555-0100",
"admin_notes": "See details.",
"company_user_notes": "See details.",
"supervisor_notes": "See details.",
"org_unit_id": 21,
"parent_client_id": 1002,
"early_check_in_override": true,
"maximum_check_in_minutes_before_scheduled": 1,
"archived_at": null,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}List venues
/venuesnamezip_code/venuescurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/venues"
{
"message": "Venues received.",
"data": {
"count": 1,
"objects": [
{
"id": 330,
"name": "Summer Gala",
"address1": "345 Park Ave",
"address2": "Floor 12",
"city": "New York",
"state": "NY",
"zip": "10007",
"notes": "See details.",
"admin_notes": "See details."
}
]
}
}List positions
/positionsname/positionscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/positions"
{
"message": "Positions received.",
"data": {
"count": 1,
"objects": [
{
"id": 3136,
"department_id": 140,
"name": "Summer Gala",
"instructions": "See details.",
"description": "See details.",
"archived_at": null,
"supervisor": true,
"pay_code": "REG",
"overtime_pay_code": "125.00",
"ten99_pay_code": "125.00",
"default_punchcard_minimum_hours": 8.0,
"auto_break_threshold_hours": 8.0,
"auto_break_duration_minutes": 30,
"flexpool_break_threshold_hours": 8.0,
"flexpool_break_duration_minutes": 30,
"integration_source": "example",
"order_index": 4,
"qualified_count": 4,
"default_rate_cents": 2500,
"client_bill_rate_cents": 2500,
"event_template_shift_count": 4,
"deep_rate_external_id": "125.00",
"kroger_uuid": "550e8400-e29b-41d4-a716-446655440000"
}
]
}
}List departments
/departmentsname/departmentscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/departments"
{
"message": "Departments received.",
"data": {
"count": 1,
"objects": [
{
"id": 140,
"company_id": 88,
"name": "Summer Gala",
"pay_code": "REG",
"archived_at": null
}
]
}
}List uniforms
/uniformsname/uniformscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/uniforms"
{
"message": "Nowsta uniforms received.",
"data": {
"count": 1,
"objects": [
{
"id": 796,
"company_id": 88,
"name": "Summer Gala",
"description": "See details.",
"archived_at": null
}
]
}
}Get a uniform
/uniforms/{uniform_id}uniform_id/uniforms/{uniform_id}curl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/uniforms/{uniform_id}"{
"message": "Uniform received.",
"data": {
"id": 796,
"company_id": 88,
"name": "Summer Gala",
"description": "See details.",
"archived_at": null
}
}List tags
/tagsquery/tagscurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/tags"
{
"message": "Tags received.",
"data": {
"count": 1,
"objects": [
{
"id": 150,
"company_id": 88,
"name": "Summer Gala",
"is_expirable": true,
"archived_at": null,
"external_id": "E12345",
"org_unit_id": 21,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
]
}
}Get a tag
/tags/{tag_id}tag_id/tags/{tag_id}curl \
-H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
"$BASE_URL/tags/{tag_id}"{
"message": "Tag received.",
"data": {
"id": 150,
"company_id": 88,
"name": "Summer Gala",
"is_expirable": true,
"archived_at": null,
"external_id": "E12345",
"org_unit_id": 21,
"created_at": "2026-07-29T09:00:00Z",
"updated_at": "2026-07-29T09:00:00Z"
}
}Health check public
/healthLiveness probe. No authentication required.
/healthcurl \ "$BASE_URL/health"
{
"message": "ok",
"data": {
"status": "healthy"
}
}Cache stats
/cacheInspect the record cache (entry counts and size on disk).
/cachecurl \ -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \ "$BASE_URL/cache"
{
"message": "Cache stats.",
"data": {
"enabled": true,
"entries": 42,
"fresh": 40,
"expired": 2,
"bytes": 98304,
"database": "resources/cache/cache.db",
"directory": "resources/cache"
}
}