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.

Your toolsFabric, Power BI, cron, scripts
Nowsta SyncHydrate & cache data
Nowsta APIpaged, id-referenced REST
Figure 1 the service sits between your tooling and Nowsta, doing the assembly and caching.
Base URL https://nowsta.tpc-utils.net

How it works

Modules
server.pyWeb app & routes, inbound auth, request logging, JSON error handling.
api.pyThe Nowsta API client: authenticated calls, rate limiting, pagination, hydration, row builders.
cache.pyRecycled record cache, thread-safe and persistent.
utils.pyAuth/logging setup, rate limiter, and date-window parsing.

Request lifecycle

Callerrequest + token
Authchecks PUBLIC_TOKEN
Routeread params and orchestrate requests
Nowsta APIrate-limited, paged
Optimizecache, paginate
JSON Responsemessage + data
Figure 2 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

~2.0 m
Without Nowsta Sync
no optimization, uncached
~25.0 s
First request with full
parallelization, cold cache
~10.0 s
Follow up requests,
warm cache
Figure 3 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 · payrollNoCan change frequently (e.g. worker allocation, hours worked)
company_user · uniformYesChanges 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:

Power Query (M)
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
    result

Expand 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.

  1. Create an HTTP / REST connection to the service base URL; add header Authorization: Bearer <token>.
  2. In a Copy activity, set the relative URL to /schedule-data (append ?starts_at=…&ends_at=… for a window) and response format JSON.
  3. Set the source collection / records path to data.objects so each object becomes a row.
  4. 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.

PySpark notebook
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.objects for list endpoints, or data for single-record endpoints.
  • Let scheduled pulls use the cache (omit refresh), only pass ?refresh=true when 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.

Recurrenceschedule, e.g. every 25 min
HTTPGET the endpoint + bearer token
Parse JSONthe message / data envelope
Selectmap data.objects to columns
Create CSV tablefrom the Select output
Update filewrite CSV to SharePoint
Figure 4 a scheduled cloud flow: Recurrence → HTTP → Parse JSON → Select → Create CSV table → Update file.
  1. Recurrence set the schedule (for example, every 25 minutes).
  2. HTTP Method GET URI the endpoint (e.g. https://…/schedule-data?starts_at=…) add the header Authorization: Bearer <NOWSTA_PUBLIC_TOKEN>.
  3. Parse JSON Content = the HTTP Body. The payload is the standard envelope, so the rows live at data.objects.
  4. Select From = body('Parse_JSON')?['data']?['objects']; map the columns you want (the /schedule-data keys are already report-ready).
  5. Create CSV table From = the Select output; Columns = Automatic.
  6. Update file (SharePoint) write the Create CSV table output 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:

Scheduled shell job
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

GET/shifts
Query parameters
starts_at
string optional
Start of the window, ISO-8601 (e.g. 2026-07-29T00:00:00Z). Defaults to today 00:00 UTC.
ends_at
string optional
End of the window, ISO-8601. Defaults to 90 days after starts_at.
refresh
boolean optional
Force a re-fetch of the hydrated company_user records, bypassing the cache.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /shifts
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/shifts"
Response sample application/json
{
  "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

GET/schedule-data
Query parameters
starts_at
string optional
Start of the window, ISO-8601. Defaults to today 00:00 UTC.
ends_at
string optional
End of the window, ISO-8601. Defaults to +90 days.
refresh
boolean optional
Force a re-fetch of the hydrated worker / uniform / clothing records.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /schedule-data
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/schedule-data"
Response sample application/json
{
  "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

GET/worker-allocation
Query parameters
starts_at
string optional
Start of the window, ISO-8601. Defaults to today 00:00 UTC.
ends_at
string optional
End of the window, ISO-8601. Defaults to +90 days.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /worker-allocation
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/worker-allocation"
Response sample application/json
{
  "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

GET/shifts/{shift_id}/event_workers

The workers on one shift, each hydrated with the full company_user and event records.

Path parameters
shift_id
integer required
The shift id.
Query parameters
include_removed
boolean optional
Include workers that were removed from the shift.
refresh
boolean optional
Force a re-fetch of the hydrated records, bypassing the cache.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /shifts/{shift_id}/event_workers
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/shifts/{shift_id}/event_workers"
Response sample application/json
{
  "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

GET/payroll
Query parameters
starts_at
string optional
Start of the window, ISO-8601. Defaults to today 00:00 UTC.
ends_at
string optional
End of the window, ISO-8601. Defaults to +90 days.
item_mode
string optional
Optional Nowsta payroll item_mode filter.
row_split_mode
string optional
Optional Nowsta payroll row_split_mode filter.
include_unapproved
boolean optional
Include unapproved payroll items.
refresh
boolean optional
Force a re-fetch of the hydrated records, bypassing the cache.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /payroll
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/payroll"
Response sample application/json
{
  "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

GET/company_users
Query parameters
query
string optional
Free-text search.
payroll_id
string optional
Filter by payroll id.
include_archived
boolean optional
Include archived users.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /company_users
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/company_users"
Response sample application/json
{
  "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

GET/company_users/{company_user_id}
Path parameters
company_user_id
integer required
The company user id.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /company_users/{company_user_id}
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/company_users/{company_user_id}"
Response sample application/json
{
  "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

GET/company_users/{company_user_id}/clothing_sizes
Path parameters
company_user_id
integer required
The company user id.
Query parameters
refresh
boolean optional
Force a re-fetch of the hydrated record, bypassing the cache.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /company_users/{company_user_id}/clothing_sizes
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/company_users/{company_user_id}/clothing_sizes"
Response sample application/json
{
  "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

GET/events
Query parameters
starts_after
string optional
Only events starting after this ISO-8601 time. Defaults to today 00:00 UTC.
starts_before
string optional
Only events starting before this ISO-8601 time. Defaults to +90 days.
query
string optional
Free-text search.
external_id
string optional
Filter by external id.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /events
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/events"
Response sample application/json
{
  "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

GET/events/{event_id}
Path parameters
event_id
integer required
The event id.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /events/{event_id}
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/events/{event_id}"
Response sample application/json
{
  "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

GET/events/{event_id}/event_workers
Path parameters
event_id
integer required
The event id.
Query parameters
include_removed
boolean optional
Include workers that were removed.
refresh
boolean optional
Force a re-fetch of the hydrated records, bypassing the cache.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /events/{event_id}/event_workers
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/events/{event_id}/event_workers"
Response sample application/json
{
  "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

GET/clients
Query parameters
name
string optional
Filter clients by name.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /clients
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/clients"
Response sample application/json
{
  "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

GET/clients/{client_id}
Path parameters
client_id
integer required
The client id.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /clients/{client_id}
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/clients/{client_id}"
Response sample application/json
{
  "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

GET/venues
Query parameters
name
string optional
Filter by name.
zip_code
string optional
Filter by ZIP code.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /venues
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/venues"
Response sample application/json
{
  "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

GET/positions
Query parameters
name
string optional
Filter by name.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /positions
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/positions"
Response sample application/json
{
  "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

GET/departments
Query parameters
name
string optional
Filter by name.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /departments
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/departments"
Response sample application/json
{
  "message": "Departments received.",
  "data": {
    "count": 1,
    "objects": [
      {
        "id": 140,
        "company_id": 88,
        "name": "Summer Gala",
        "pay_code": "REG",
        "archived_at": null
      }
    ]
  }
}

List uniforms

GET/uniforms
Query parameters
name
string optional
Filter by name.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /uniforms
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/uniforms"
Response sample application/json
{
  "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

GET/uniforms/{uniform_id}
Path parameters
uniform_id
integer required
The uniform id.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /uniforms/{uniform_id}
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/uniforms/{uniform_id}"
Response sample application/json
{
  "message": "Uniform received.",
  "data": {
    "id": 796,
    "company_id": 88,
    "name": "Summer Gala",
    "description": "See details.",
    "archived_at": null
  }
}

List tags

GET/tags
Query parameters
query
string optional
Free-text search.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /tags
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/tags"
Response sample application/json
{
  "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

GET/tags/{tag_id}
Path parameters
tag_id
integer required
The tag id.
Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /tags/{tag_id}
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/tags/{tag_id}"
Response sample application/json
{
  "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

GET/health

Liveness probe. No authentication required.

Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /health
cURL
curl \
  "$BASE_URL/health"
Response sample application/json
{
  "message": "ok",
  "data": {
    "status": "healthy"
  }
}

Cache stats

GET/cache

Inspect the record cache (entry counts and size on disk).

Responses
200 Successful response
401 Unauthorized missing or invalid bearer token
4xx / 5xx Error envelope (see Errors)
Request
GET /cache
cURL
curl \
  -H "Authorization: Bearer $NOWSTA_PUBLIC_TOKEN" \
  "$BASE_URL/cache"
Response sample application/json
{
  "message": "Cache stats.",
  "data": {
    "enabled": true,
    "entries": 42,
    "fresh": 40,
    "expired": 2,
    "bytes": 98304,
    "database": "resources/cache/cache.db",
    "directory": "resources/cache"
  }
}