@dsptch-work/api-client 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -136,6 +136,12 @@ export const zProblem = z.object({
136
136
  *
137
137
  * The credential is valid, but this action on this record is refused by policy. The operation is not available to this principal.
138
138
  *
139
+ * ### forbidden_key
140
+ *
141
+ * **Field Not Writable By Key**
142
+ *
143
+ * The request body carries a field the operation accepts, but the user this user-scoped API key acts for may not write it, as their role could not in the DSPTCH app. Nothing was written. Remove the fields the detail names, or send the write with a key whose user may write them.
144
+ *
139
145
  * ### insufficient_api_key_scope
140
146
  *
141
147
  * **Insufficient API Key Scope**
@@ -364,6 +370,7 @@ export const zProblemTypeCatalog = z.enum([
364
370
  'unauthorized',
365
371
  'company_scoped_key_required',
366
372
  'forbidden',
373
+ 'forbidden_key',
367
374
  'insufficient_api_key_scope',
368
375
  'user_scoped_key_required',
369
376
  'not_found',
@@ -715,7 +722,7 @@ export const zApprenticeshipProgramEmployerParameters = z.object({
715
722
  require_timecard_allocation: z.boolean().optional()
716
723
  });
717
724
  /**
718
- * Update an employer authorization in a program. Send only the fields to change; only the program's sponsor may manage this roster, and an API key may change only the row naming its own company.
725
+ * Update an employer authorization in a program. Send only the fields to change; only the program's sponsor may manage this roster, and a company-scoped key may change only the row naming its own company.
719
726
  */
720
727
  export const zApprenticeshipProgramEmployerUpdateParameters = z.object({
721
728
  company_id: z.string().optional(),
@@ -1004,10 +1011,6 @@ export const zPeopleEmploymentUpdateParameters = z.object({
1004
1011
  payroll_id: z.string().nullish(),
1005
1012
  enrolled_in_t_and_a: z.boolean().optional()
1006
1013
  });
1007
- export const zPeopleEmploymentCustomFieldResponseObject = z.object({
1008
- custom_field_config_id: z.string(),
1009
- value: z.string().nullable()
1010
- });
1011
1014
  /**
1012
1015
  * Update stored custom-field values for one employment family in a single batch. The batch must contain at least one row. Omitted configurations keep their values, and an explicit null is stored.
1013
1016
  */
@@ -1748,7 +1751,7 @@ export const zPwaCompanyUserDetailsResponseObject = z.object({
1748
1751
  ])).nullable()
1749
1752
  });
1750
1753
  /**
1751
- * Create a worker's PWA compliance details at a company. The company is taken from the API key. user_id names the worker and is required; every other field is optional — send whichever your jurisdiction's certified-payroll export requires. Only the keys listed here are accepted — any other key is rejected with 400 unknown_key.
1754
+ * Create a worker's PWA compliance details at a company. The company is taken from the API key. user_id names the worker and is required; every other field is optional — send whichever your jurisdiction's certified-payroll export requires.
1752
1755
  */
1753
1756
  export const zPwaCompanyUserDetailsParameters = z.object({
1754
1757
  user_id: z.string(),
@@ -1841,7 +1844,7 @@ export const zPwaCompanyUserDetailsParameters = z.object({
1841
1844
  ])).nullish()
1842
1845
  });
1843
1846
  /**
1844
- * Update a worker's PWA compliance details. The company is taken from the API key. Every field is optional — send only what changes, and omitted fields are left unchanged. user_id is absent by design — the company/user pair is fixed at creation, so sending the key is rejected with 400 unknown_key, as is any other key not listed here.
1847
+ * Update a worker's PWA compliance details. The company is taken from the API key. Every field is optional — send only what changes, and omitted fields are left unchanged. The company/user pair is fixed at creation.
1845
1848
  */
1846
1849
  export const zPwaCompanyUserDetailsUpdateParameters = z.object({
1847
1850
  address1: z.string().nullish(),
@@ -2121,7 +2124,6 @@ export const zManagerTimeEntryApprovalParameters = z.object({
2121
2124
  * The time-entry body fields shared by the create and update bodies; each of those declares its own requiredness.
2122
2125
  */
2123
2126
  export const zTimeEntryParameters = z.object({
2124
- timekeeping_time_card_id: z.string().optional(),
2125
2127
  start_time: z.iso.datetime().optional(),
2126
2128
  end_time: z.iso.datetime().optional(),
2127
2129
  job_id: z.string().nullish(),
@@ -2132,9 +2134,10 @@ export const zTimeEntryParameters = z.object({
2132
2134
  feature_ids: z.array(z.string()).nullish()
2133
2135
  });
2134
2136
  /**
2135
- * Request body for creating a time entry — the time_entry_parameters fields, of which timekeeping_time_card_id, start_time, and end_time are required, plus the explicit "no feature" acknowledgement.
2137
+ * Request body for creating a time entry — the time_entry_parameters fields plus the time card and the explicit "no feature" acknowledgement. timekeeping_time_card_id, start_time, and end_time are required.
2136
2138
  */
2137
2139
  export const zTimeEntryCreateParameters = zTimeEntryParameters.and(z.object({
2140
+ timekeeping_time_card_id: z.string(),
2138
2141
  feature_allocation_acknowledged: z.boolean().nullish()
2139
2142
  }));
2140
2143
  /**
@@ -2143,6 +2146,25 @@ export const zTimeEntryCreateParameters = zTimeEntryParameters.and(z.object({
2143
2146
  export const zTimeEntryUpdateParameters = zTimeEntryParameters.and(z.object({
2144
2147
  confirm_allocation_conflict: z.boolean().nullish()
2145
2148
  }));
2149
+ /**
2150
+ * A form definition — a SurveyJS form template built and versioned in the web app's form builder. The same object the list door serializes. Read-only.
2151
+ */
2152
+ export const zFormDefinitionObject = z.object({
2153
+ id: z.string(),
2154
+ name: z.string(),
2155
+ description: z.string(),
2156
+ company_id: z.string(),
2157
+ modified_by_user_id: z.string().nullable(),
2158
+ tags: z.array(z.string()).nullable(),
2159
+ title_keys: z.array(z.string()).nullable(),
2160
+ editable: z.boolean(),
2161
+ always_visible: z.boolean(),
2162
+ sensitive_form: z.boolean(),
2163
+ allow_carry_forward: z.boolean(),
2164
+ current_revision: z.int().nullable(),
2165
+ json: z.record(z.string(), z.unknown()),
2166
+ created_at: z.iso.datetime()
2167
+ });
2146
2168
  /**
2147
2169
  * A single form submission — a user's completed SurveyJS form with the resolved answers (the fuller show representation). Read-only; submissions are created in the app.
2148
2170
  */
@@ -2379,6 +2401,13 @@ export const zCompanyParameters = z.intersection(z.union([
2379
2401
  naics_code: z.string().nullish(),
2380
2402
  linkedin_url: z.string().nullish()
2381
2403
  }));
2404
+ /**
2405
+ * A custom-field value stored on a record, addressed by the configuration it belongs to.
2406
+ */
2407
+ export const zCustomFieldResponseObject = z.object({
2408
+ custom_field_config_id: z.string(),
2409
+ value: z.string().nullable()
2410
+ });
2382
2411
  /**
2383
2412
  * A custom field definition — a company-defined attribute attached to one kind of record (jobs, workers, apprentices, or the company itself). Deleting one is blocked while any record still holds a value for it.
2384
2413
  */
@@ -2446,10 +2475,9 @@ export const zTimeCardStartDay = z.union([
2446
2475
  z.literal(6)
2447
2476
  ]);
2448
2477
  /**
2449
- * Fields shared by job creation and updates. Updates may omit any field to preserve its current value. The resulting job must still satisfy its schedule and PWA validation rules. Extra keys are accepted, including custom fields.
2478
+ * Fields shared by job creation and updates. Updates may omit any field to preserve its current value. The resulting job must still satisfy its schedule and PWA validation rules.
2450
2479
  */
2451
2480
  export const zJobParameters = z.object({
2452
- template_id: z.string().nullish(),
2453
2481
  name: z.string().nullish(),
2454
2482
  description: z.string().optional(),
2455
2483
  requested_by_company_id: z.string().optional(),
@@ -2508,10 +2536,6 @@ export const zJobParameters = z.object({
2508
2536
  verified: z.boolean().nullish(),
2509
2537
  label: z.string().nullish()
2510
2538
  }).nullish(),
2511
- custom_fields_attributes: z.array(z.object({
2512
- custom_field_config_id: z.string(),
2513
- value: z.string().nullish()
2514
- })).nullish(),
2515
2539
  pwa_details: z.object({
2516
2540
  contractor_type: z.enum(['prime_contractor', 'sub_contractor']).nullish(),
2517
2541
  pay_full_cash_fringe_by_default: z.boolean().optional(),
@@ -2532,18 +2556,28 @@ export const zJobParameters = z.object({
2532
2556
  }).optional()
2533
2557
  });
2534
2558
  /**
2535
- * Parameters for creating a job. `requested_by_company_id` and `created_by_user_id` are required. Sets the job's schedule, work types, address, and optional Prevailing Wage / Apprenticeship (PWA) compliance.
2559
+ * Parameters for creating a job. `requested_by_company_id` and `created_by_user_id` are required. Sets the job's schedule, work types, address, custom-field values, and optional Prevailing Wage / Apprenticeship (PWA) compliance.
2536
2560
  */
2537
- export const zJobCreateParameters = zJobParameters.and(z.record(z.string(), z.unknown()));
2561
+ export const zJobCreateParameters = zJobParameters.and(z.object({
2562
+ template_id: z.string().nullish(),
2563
+ custom_fields: z.array(z.object({
2564
+ custom_field_config_id: z.string(),
2565
+ value: z.string().nullable()
2566
+ })).optional()
2567
+ }));
2538
2568
  /**
2539
- * Parameters for updating an existing job. Every field is optional; omit a field to preserve its current value. The resulting job must still satisfy schedule and PWA validation rules. Accepts every shared job field plus a directly settable status.
2569
+ * Parameters for updating an existing job. Every field is optional; omit a field to preserve its current value. The resulting job must still satisfy schedule and PWA validation rules. Accepts every shared job field plus a directly settable status and custom-field changes.
2540
2570
  */
2541
2571
  export const zJobUpdateParameters = zJobParameters.and(z.object({
2542
2572
  status: z.enum([
2543
2573
  'completed',
2544
2574
  'cancelled',
2545
2575
  'disputed'
2546
- ]).optional()
2576
+ ]).optional(),
2577
+ custom_fields: z.array(z.object({
2578
+ custom_field_config_id: z.string(),
2579
+ value: z.string().nullable()
2580
+ })).optional()
2547
2581
  }));
2548
2582
  /**
2549
2583
  * One version of a worker's compensation at your company, effective from its start date until the next version begins.
@@ -2998,7 +3032,6 @@ export const zPayrollFringeBenefitPlanParameters = z.object({
2998
3032
  * Request body for updating a fringe-benefit plan. Send only the fields to change.
2999
3033
  */
3000
3034
  export const zPayrollFringeBenefitPlanUpdateParameters = z.object({
3001
- timekeeping_pay_period_config_id: z.string().optional(),
3002
3035
  name: z.string().optional(),
3003
3036
  plan_number: z.string().optional(),
3004
3037
  funded: z.boolean().optional(),
@@ -3143,7 +3176,7 @@ export const zPayrollRunResponseObject = z.object({
3143
3176
  updated_at: z.iso.datetime()
3144
3177
  });
3145
3178
  /**
3146
- * Create a payroll run. company_id, run_type, and run_date are required; an on-cycle run additionally requires timekeeping_pay_period_id. Only the keys listed here are accepted — any other key is rejected with 400 unknown_key.
3179
+ * Create a payroll run. company_id, run_type, and run_date are required; an on-cycle run additionally requires timekeeping_pay_period_id.
3147
3180
  */
3148
3181
  export const zPayrollRunParameters = z.object({
3149
3182
  company_id: z.string(),
@@ -3161,7 +3194,7 @@ export const zPayrollRunParameters = z.object({
3161
3194
  external_id: z.string().nullish()
3162
3195
  });
3163
3196
  /**
3164
- * Update a payroll run. Every field is optional — send only what changes. company_id is absent by design — the run's company is fixed at creation, so sending the key is rejected with 400 unknown_key, as is any other key not listed here.
3197
+ * Update a payroll run. Every field is optional — send only what changes. The run's company is fixed at creation.
3165
3198
  */
3166
3199
  export const zPayrollRunUpdateParameters = z.object({
3167
3200
  timekeeping_pay_period_id: z.string().nullish(),
@@ -3261,7 +3294,6 @@ export const zProjectUpdateParameters = z.object({
3261
3294
  external_id: z.string().nullish(),
3262
3295
  name: z.string().optional(),
3263
3296
  description: z.string().nullish(),
3264
- created_by_user_id: z.string().nullish(),
3265
3297
  parent_id: z.string().nullish(),
3266
3298
  participating_company_ids: z.array(z.string()).optional(),
3267
3299
  start_date: z.iso.date().nullish(),
@@ -3290,6 +3322,27 @@ export const zProjectUpdateParameters = z.object({
3290
3322
  beginning_of_construction_date: z.iso.date().nullish(),
3291
3323
  placed_in_service_date: z.iso.date().nullish()
3292
3324
  });
3325
+ /**
3326
+ * A project–site assignment: the join linking a project to a site, optionally scoping which of that site's features apply. Path `{id}` is this join's id, not the Site's. Not included on project GET.
3327
+ */
3328
+ export const zProjectSiteResponseObject = z.object({
3329
+ id: z.string(),
3330
+ site_id: z.string(),
3331
+ feature_ids: z.array(z.string())
3332
+ });
3333
+ /**
3334
+ * Request body for attaching a site to a project. `site_id` is required; `feature_ids` is optional. The project is taken from the path and is not part of the body.
3335
+ */
3336
+ export const zProjectSiteParameters = z.object({
3337
+ site_id: z.string(),
3338
+ feature_ids: z.array(z.string()).optional()
3339
+ });
3340
+ /**
3341
+ * Request body for replacing which of the site's features apply to this project. Every field is optional; omit a field to preserve its current value. `site_id` is create-only and an update that names it is rejected.
3342
+ */
3343
+ export const zProjectSiteUpdateParameters = z.object({
3344
+ feature_ids: z.array(z.string()).optional()
3345
+ });
3293
3346
  export const zSiteCheckInResponseObject = z.object({
3294
3347
  id: z.string(),
3295
3348
  site_id: z.string(),
@@ -3806,8 +3859,8 @@ export const zPaystubResponseObject = z.object({
3806
3859
  * Request body for creating a paystub. payrolls_payroll_run_id and user_id are required; timekeeping_time_card_id is required for an on-cycle run and disallowed for an off-cycle run.
3807
3860
  */
3808
3861
  export const zPaystubParameters = z.object({
3809
- payrolls_payroll_run_id: z.string(),
3810
3862
  user_id: z.string(),
3863
+ payrolls_payroll_run_id: z.string(),
3811
3864
  timekeeping_time_card_id: z.string().nullish(),
3812
3865
  external_id: z.string().nullish(),
3813
3866
  check_number: z.string().nullish()
@@ -3817,7 +3870,6 @@ export const zPaystubParameters = z.object({
3817
3870
  */
3818
3871
  export const zPaystubUpdateParameters = z.object({
3819
3872
  payrolls_payroll_run_id: z.string().optional(),
3820
- user_id: z.string().optional(),
3821
3873
  timekeeping_time_card_id: z.string().nullish(),
3822
3874
  external_id: z.string().nullish(),
3823
3875
  check_number: z.string().nullish()
@@ -3862,6 +3914,21 @@ export const zPriorPeriodAdjustmentParameters = z.object({
3862
3914
  notes: z.string().nullish(),
3863
3915
  pwa_compliance_eligible: z.boolean().optional()
3864
3916
  });
3917
+ /**
3918
+ * Request body for updating a prior period adjustment. Send only the fields to change. The time card is the path parent; payrolls_paystub_line_item_id, created_by_user_id, time_card_id, and adjustment_type are rejected.
3919
+ */
3920
+ export const zPriorPeriodAdjustmentUpdateParameters = z.object({
3921
+ amount_cents: z.string().optional(),
3922
+ rationale: z.enum([
3923
+ 'hours_correction',
3924
+ 'other',
3925
+ 'pwa_compliance',
3926
+ 'rate_correction'
3927
+ ]).optional(),
3928
+ job_id: z.string().nullish(),
3929
+ notes: z.string().nullish(),
3930
+ pwa_compliance_eligible: z.boolean().optional()
3931
+ });
3865
3932
  /**
3866
3933
  * What one PWA-tracked job on a time card still owes the worker, from the materialized prevailing-wage compliance view. Read-only.
3867
3934
  */
@@ -3998,6 +4065,27 @@ export const zPaystubLineItemUpdateParameters = z.object({
3998
4065
  contributor: z.enum(['employee', 'employer']).optional(),
3999
4066
  payrolls_external_map_id: z.string().optional()
4000
4067
  });
4068
+ /**
4069
+ * A job-site join — the Site attached to a Job, plus the subset of that site's features the job is working on. `{id}` is the join row, not the Site.
4070
+ */
4071
+ export const zJobSiteResponseObject = z.object({
4072
+ id: z.string(),
4073
+ site_id: z.string(),
4074
+ feature_ids: z.array(z.string())
4075
+ });
4076
+ /**
4077
+ * Request body for attaching a site to a job. `site_id` is required; `feature_ids` is optional and defaults to none.
4078
+ */
4079
+ export const zJobSiteParameters = z.object({
4080
+ site_id: z.string(),
4081
+ feature_ids: z.array(z.string()).optional()
4082
+ });
4083
+ /**
4084
+ * Request body for replacing the features on an existing job-site join. `site_id` cannot be changed; send a new join to attach a different site.
4085
+ */
4086
+ export const zJobSiteUpdateParameters = z.object({
4087
+ feature_ids: z.array(z.string()).optional()
4088
+ });
4001
4089
  /**
4002
4090
  * A company-owned collection of conditional wage and fringe adjustments, optionally scoped to a job.
4003
4091
  */
@@ -4072,8 +4160,8 @@ export const zProductionJobScopePriceResponseObject = z.object({
4072
4160
  job_id: z.string(),
4073
4161
  scope_kind: z.string(),
4074
4162
  unit_of_measure: z.string(),
4075
- unit_price: z.string(),
4076
- contracted_count: z.int().nullable(),
4163
+ unit_price: z.string().optional(),
4164
+ contracted_count: z.int().nullish(),
4077
4165
  created_at: z.iso.datetime(),
4078
4166
  updated_at: z.iso.datetime()
4079
4167
  });
@@ -4182,7 +4270,7 @@ export const zFormAssignmentTaskResponseObject = z.array(z.object({
4182
4270
  }))
4183
4271
  }));
4184
4272
  /**
4185
- * Request body for creating a certification — a named qualification a worker can hold. You can only manage your own company's certifications; global (platform) certifications are read-only. Only the keys listed here are accepted — any other key is rejected with 400 unknown_key.
4273
+ * Request body for creating a certification — a named qualification a worker can hold. You can only manage your own company's certifications; global (platform) certifications are read-only.
4186
4274
  */
4187
4275
  export const zCertificationParameters = z.object({
4188
4276
  company_id: z.string(),
@@ -4192,7 +4280,7 @@ export const zCertificationParameters = z.object({
4192
4280
  duration: z.string().nullish()
4193
4281
  });
4194
4282
  /**
4195
- * Request body for updating a certification — a named qualification a worker can hold. Include only the fields to change. You can only manage your own company's certifications; global (platform) certifications are read-only. company_id is absent by design — the certification's company is fixed at creation, so sending the key is rejected with 400 unknown_key, as is any other key not listed here.
4283
+ * Request body for updating a certification — a named qualification a worker can hold. Include only the fields to change. You can only manage your own company's certifications; global (platform) certifications are read-only. The certification's company is fixed at creation.
4196
4284
  */
4197
4285
  export const zCertificationUpdateParameters = z.object({
4198
4286
  name: z.string().optional(),
@@ -4215,7 +4303,7 @@ export const zCertificationPackageResponseObject = z.object({
4215
4303
  updated_at: z.iso.datetime()
4216
4304
  });
4217
4305
  /**
4218
- * Request body for creating a certification package — a named set of certifications a company requires together. The package belongs to the company that owns the API key. Only the keys listed here are accepted — any other key is rejected with 400 unknown_key.
4306
+ * Request body for creating a certification package — a named set of certifications a company requires together. The package belongs to the company that owns the API key.
4219
4307
  */
4220
4308
  export const zCertificationPackageParameters = z.object({
4221
4309
  name: z.string(),
@@ -4224,7 +4312,7 @@ export const zCertificationPackageParameters = z.object({
4224
4312
  performed_by_user_id: z.string()
4225
4313
  });
4226
4314
  /**
4227
- * Request body for updating a certification package — a named set of certifications a company requires together. Include only the fields to change. Any key not listed here is rejected with 400 unknown_key.
4315
+ * Request body for updating a certification package — a named set of certifications a company requires together. Include only the fields to change.
4228
4316
  */
4229
4317
  export const zCertificationPackageUpdateParameters = z.object({
4230
4318
  name: z.string().optional(),
@@ -4259,12 +4347,10 @@ export const zUserCertificationParameters = z.object({
4259
4347
  verified: z.boolean().optional(),
4260
4348
  expiration_date: z.iso.date().nullish(),
4261
4349
  credential_id: z.string().nullish(),
4262
- approved_by_user_id: z.string().nullish(),
4263
- archived_at: z.iso.datetime().nullish(),
4264
- approved_at: z.iso.datetime().nullish()
4350
+ archived_at: z.iso.datetime().nullish()
4265
4351
  });
4266
4352
  /**
4267
- * Request body for updating a certification held by a worker. Every field is optional; omit a field to preserve its current value. The resulting certification must still have a receipt date and verification state, and any expiry date must remain after its receipt date.
4353
+ * Request body for updating a certification held by a worker. Every field is optional; omit a field to preserve its current value. The resulting certification must still have a receipt date and verification state, and any expiry date must remain after its receipt date. Changing anything but verified revokes an approval; approve through the approval endpoint.
4268
4354
  */
4269
4355
  export const zUserCertificationUpdateParameters = z.object({
4270
4356
  user_id: z.string().optional(),
@@ -4277,9 +4363,13 @@ export const zUserCertificationUpdateParameters = z.object({
4277
4363
  verified: z.boolean().optional(),
4278
4364
  expiration_date: z.iso.date().nullish(),
4279
4365
  credential_id: z.string().nullish(),
4280
- approved_by_user_id: z.string().nullish(),
4281
- archived_at: z.iso.datetime().nullish(),
4282
- approved_at: z.iso.datetime().nullish()
4366
+ archived_at: z.iso.datetime().nullish()
4367
+ });
4368
+ /**
4369
+ * Request body for approving a certification held by a worker. A user key approves in its own user's name and sends no body.
4370
+ */
4371
+ export const zUserCertificationApprovalParameters = z.object({
4372
+ approved_by_user_id: z.string().optional()
4283
4373
  });
4284
4374
  /**
4285
4375
  * A certification held by a worker — the record that a worker earned a certification, with its receipt date, optional expiry, and verification state.
@@ -4386,7 +4476,8 @@ export const zJobResponseObject = z.object({
4386
4476
  'none',
4387
4477
  'feature',
4388
4478
  'quantity'
4389
- ])
4479
+ ]),
4480
+ custom_fields: z.array(zCustomFieldResponseObject)
4390
4481
  });
4391
4482
  /**
4392
4483
  * A spot to be filled on a job — one worker's assignment and the unit against which they track time, carrying the schedule window, assigned worker, function, and the planned pay and fringe rates (including PWA prevailing-wage compliance rates). Always accessed nested under a job.
@@ -4452,7 +4543,7 @@ export const zUserRoleResponse = z.object({
4452
4543
  */
4453
4544
  export const zUserCompanyType = z.enum(['EMPLOYEE', 'CONTRACTOR']).nullable();
4454
4545
  /**
4455
- * A worker as your company sees them: the cross-company person merged with their employment record at your company (title, pay, benefits, and accruals), their roles at your company, and optional prevailing-wage compliance details. Your company sees everyone it employs, everyone it has granted a role, and everyone it has invited, which is the same set the web app shows. A role holder or an invitee your company does not employ has no employment record to merge, so the employment fields (employment_id through employment_window, plus manager_user_id) are null for them, no employment custom fields are published for them, and employment_state reads none. There is no delete — removing a worker terminates their employment at the company (see the user-company endpoints), which sets termination_date and drops them from the default list.
4546
+ * A worker as your company sees them: the cross-company person merged with their employment record at your company (title, pay, benefits, and accruals), their roles at your company, and optional prevailing-wage compliance details. Your company sees everyone it employs, everyone it has granted a role, and everyone it has invited, which is the same set the web app shows. A role holder or an invitee your company does not employ has no employment record to merge, so the employment fields (employment_id through employment_window, plus manager_user_id and custom_fields) are null for them, and employment_state reads none. There is no delete — removing a worker terminates their employment at the company (see the user-company endpoints), which sets termination_date and drops them from the default list.
4456
4547
  */
4457
4548
  export const zUserResponseObject = z.object({
4458
4549
  id: z.string(),
@@ -4486,10 +4577,10 @@ export const zUserResponseObject = z.object({
4486
4577
  enrolled_in_t_and_a: z.boolean().nullable(),
4487
4578
  payroll_id: z.string().nullable(),
4488
4579
  compensation_type: z.string().nullable(),
4489
- hourly_rate: z.string().nullable(),
4490
- training_annual_amount: z.string().nullable(),
4491
- employer_combined_health_amount: z.string().nullable(),
4492
- employer_combined_savings: z.string().nullable(),
4580
+ hourly_rate: z.string().nullish(),
4581
+ training_annual_amount: z.string().nullish(),
4582
+ employer_combined_health_amount: z.string().nullish(),
4583
+ employer_combined_savings: z.string().nullish(),
4493
4584
  worked_annual_minutes: z.int().nullable(),
4494
4585
  pto_annual_minutes: z.int().nullable(),
4495
4586
  holiday_annual_minutes: z.int().nullable(),
@@ -4501,6 +4592,7 @@ export const zUserResponseObject = z.object({
4501
4592
  valid_to: z.iso.datetime().nullable()
4502
4593
  }).nullable(),
4503
4594
  manager_user_id: z.string().nullable(),
4595
+ custom_fields: z.array(zCustomFieldResponseObject).nullable(),
4504
4596
  roles: z.array(z.string()),
4505
4597
  company_user_pwa_info: z.object({
4506
4598
  id: z.string(),
@@ -4582,7 +4674,6 @@ export const zUserParameters = z.intersection(z.union([
4582
4674
  skip_invite: z.literal(true)
4583
4675
  })
4584
4676
  ]), z.object({
4585
- company_id: z.string().optional(),
4586
4677
  email: z.string().nullish(),
4587
4678
  personal_email: z.string().nullish(),
4588
4679
  phone_number: z.string().nullish(),
@@ -4607,6 +4698,7 @@ export const zUserParameters = z.intersection(z.union([
4607
4698
  manager_user_id: z.string().optional(),
4608
4699
  payroll_id: z.string().optional(),
4609
4700
  hourly_rate: z.string().optional(),
4701
+ compensation_type: z.enum(['hourly', 'salary']).optional(),
4610
4702
  overtime_eligible: z.string().optional(),
4611
4703
  enrolled_in_t_and_a: z.string().optional(),
4612
4704
  training_annual_amount: z.string().optional(),
@@ -4618,6 +4710,10 @@ export const zUserParameters = z.intersection(z.union([
4618
4710
  training_annual_minutes: z.string().optional(),
4619
4711
  hire_date: z.string().optional(),
4620
4712
  group_ids: z.array(z.int()).optional(),
4713
+ custom_fields: z.array(z.object({
4714
+ custom_field_config_id: z.string(),
4715
+ value: z.string().nullable()
4716
+ })).optional(),
4621
4717
  company_user_pwa_info: z.object({
4622
4718
  address1: z.string().nullish(),
4623
4719
  address2: z.string().nullish(),
@@ -4687,7 +4783,7 @@ export const zUserParameters = z.intersection(z.union([
4687
4783
  }).nullish()
4688
4784
  }));
4689
4785
  /**
4690
- * Request body for updating a worker's employment at your company. Corrects administrative fields (employment type, title, manager, payroll id, hire date, and time-and-attendance enrollment) across the whole employment history. For time-effective pay changes, use the scheduled-changes endpoints instead.
4786
+ * Request body for updating a worker's employment at your company. Corrects administrative fields (employment type, title, manager, payroll id, hire date, and time-and-attendance enrollment) across the whole employment history, and changes the custom-field values it lists. For time-effective pay changes, use the scheduled-changes endpoints instead.
4691
4787
  */
4692
4788
  export const zUserCompanyParameters = z.object({
4693
4789
  type: zUserCompanyType.optional(),
@@ -4695,10 +4791,14 @@ export const zUserCompanyParameters = z.object({
4695
4791
  manager_user_id: z.string().nullish(),
4696
4792
  payroll_id: z.string().nullish(),
4697
4793
  hire_date: z.string().nullish(),
4698
- enrolled_in_t_and_a: z.boolean().optional()
4794
+ enrolled_in_t_and_a: z.boolean().optional(),
4795
+ custom_fields: z.array(z.object({
4796
+ custom_field_config_id: z.string(),
4797
+ value: z.string().nullable()
4798
+ })).optional()
4699
4799
  });
4700
4800
  /**
4701
- * Request body for adding a worker to your company, creating their employment record. hire_date is required and sets when employment begins; the remaining fields seed the initial title, pay, benefits, and accruals. Returns the worker with the new employment flattened onto it.
4801
+ * Request body for adding a worker to your company, creating their employment record and its custom-field values. hire_date is required and sets when employment begins; the remaining fields seed the initial title, pay, benefits, and accruals. Returns the worker with the new employment flattened onto it.
4702
4802
  */
4703
4803
  export const zUserCompanyCreateParameters = z.object({
4704
4804
  hire_date: z.string(),
@@ -4716,7 +4816,11 @@ export const zUserCompanyCreateParameters = z.object({
4716
4816
  worked_annual_minutes: z.int().nullish(),
4717
4817
  pto_annual_minutes: z.int().nullish(),
4718
4818
  holiday_annual_minutes: z.int().nullish(),
4719
- training_annual_minutes: z.int().nullish()
4819
+ training_annual_minutes: z.int().nullish(),
4820
+ custom_fields: z.array(z.object({
4821
+ custom_field_config_id: z.string(),
4822
+ value: z.string().nullable()
4823
+ })).optional()
4720
4824
  });
4721
4825
  /**
4722
4826
  * Keyset pagination cursors for the collection.
@@ -4760,22 +4864,7 @@ export const zTimeEntryIndexObject = z.object({
4760
4864
  export const zFormDefinitionResponseObject = z.object({
4761
4865
  meta: zMeta,
4762
4866
  links: zLinks,
4763
- data: z.array(z.object({
4764
- id: z.string(),
4765
- name: z.string(),
4766
- description: z.string(),
4767
- company_id: z.string(),
4768
- modified_by_user_id: z.string().nullable(),
4769
- tags: z.array(z.string()).nullable(),
4770
- title_keys: z.array(z.string()).nullable(),
4771
- editable: z.boolean(),
4772
- always_visible: z.boolean(),
4773
- sensitive_form: z.boolean(),
4774
- allow_carry_forward: z.boolean(),
4775
- current_revision: z.int().nullable(),
4776
- json: z.record(z.string(), z.unknown()),
4777
- created_at: z.iso.datetime()
4778
- }))
4867
+ data: z.array(zFormDefinitionObject)
4779
4868
  });
4780
4869
  /**
4781
4870
  * A page of form submissions — the lighter list representation. A submission is a user's completed form; submissions are created in the app, so this API is read-only.
@@ -4885,6 +4974,14 @@ export const zPaystubLineItemsResponseObject = z.object({
4885
4974
  links: zLinks,
4886
4975
  data: z.array(zPaystubLineItemResponseObject)
4887
4976
  });
4977
+ /**
4978
+ * A page of a job's site joins, with pagination metadata and navigation links.
4979
+ */
4980
+ export const zJobSitesResponseObject = z.object({
4981
+ meta: zMeta,
4982
+ links: zLinks,
4983
+ data: z.array(zJobSiteResponseObject)
4984
+ });
4888
4985
  /**
4889
4986
  * A page of a job's positions, with pagination metadata and navigation links.
4890
4987
  */
@@ -6040,7 +6137,7 @@ export const zAssetsItemParameters = z.object({
6040
6137
  performed_by_user_id: z.string()
6041
6138
  });
6042
6139
  /**
6043
- * Update an asset item. All item fields are optional — send only what changes — but performed_by_user_id is required to record the updater and any placement. Omitted attributes retain their existing values.
6140
+ * Update an asset item. All item fields are optional — send only what changes — but performed_by_user_id is required to record the updater. Omitted attributes retain their existing values.
6044
6141
  */
6045
6142
  export const zAssetsItemUpdateParameters = z.object({
6046
6143
  name: z.string().min(1).optional(),
@@ -6053,10 +6150,6 @@ export const zAssetsItemUpdateParameters = z.object({
6053
6150
  external_id: z.string().optional(),
6054
6151
  external_system_url: z.string().optional(),
6055
6152
  images_attributes: z.array(zAssetsAttachmentParameters).optional(),
6056
- assets_site_id: z.string().optional(),
6057
- user_id: z.string().optional(),
6058
- container_item_id: z.string().optional(),
6059
- assets_sub_location_id: z.string().optional(),
6060
6153
  performed_by_user_id: z.string()
6061
6154
  });
6062
6155
  /**
@@ -6137,7 +6230,7 @@ export const zAssetsItemFormAssignmentResponseObject = z.object({
6137
6230
  }))
6138
6231
  });
6139
6232
  /**
6140
- * Create or update an item form assignment. form_definition_id and task_attributes are required, and task_attributes.created_by_user_id is required (a missing value returns 400). recurring gates the recurrence fields.
6233
+ * Create an item form assignment. form_definition_id and task_attributes are required, and task_attributes.created_by_user_id is required (a missing value returns 400). recurring gates the recurrence fields. An assignee outside the credential company returns 422, and a creator outside it returns 403.
6141
6234
  */
6142
6235
  export const zAssetsItemFormAssignmentParameters = z.object({
6143
6236
  form_definition_id: z.string(),
@@ -6146,7 +6239,6 @@ export const zAssetsItemFormAssignmentParameters = z.object({
6146
6239
  name: z.string().nullish(),
6147
6240
  description: z.string().nullish(),
6148
6241
  created_by_user_id: z.string(),
6149
- updated_by_user_id: z.string().nullish(),
6150
6242
  time_due: z.iso.datetime().nullish(),
6151
6243
  tz_name: z.string().nullish(),
6152
6244
  frequency: z.enum([
@@ -6203,7 +6295,7 @@ export const zAssetsItemFormAssignmentParameters = z.object({
6203
6295
  })
6204
6296
  });
6205
6297
  /**
6206
- * Update an item form assignment. All fields are optional — send only what changes. recurring gates the recurrence fields, and task_attributes.reminders_attributes replaces the existing reminder set when supplied.
6298
+ * Update an item form assignment. All fields are optional — send only what changes. recurring gates the recurrence fields, and task_attributes.reminders_attributes replaces the existing reminder set when supplied. A newly added assignee outside the credential company returns 422. The creator is set at creation and cannot be sent.
6207
6299
  */
6208
6300
  export const zAssetsItemFormAssignmentUpdateParameters = z.object({
6209
6301
  form_definition_id: z.string().optional(),
@@ -6211,8 +6303,6 @@ export const zAssetsItemFormAssignmentUpdateParameters = z.object({
6211
6303
  task_attributes: z.object({
6212
6304
  name: z.string().nullish(),
6213
6305
  description: z.string().nullish(),
6214
- created_by_user_id: z.string().optional(),
6215
- updated_by_user_id: z.string().nullish(),
6216
6306
  time_due: z.iso.datetime().nullish(),
6217
6307
  tz_name: z.string().nullish(),
6218
6308
  frequency: z.enum([
@@ -6823,6 +6913,14 @@ export const zDeleteEmployerPath = z.object({
6823
6913
  * Success
6824
6914
  */
6825
6915
  export const zDeleteEmployerResponse = zApprenticeshipProgramEmployerResponseObject;
6916
+ export const zGetEmployerPath = z.object({
6917
+ program_id: z.string(),
6918
+ id: z.string()
6919
+ });
6920
+ /**
6921
+ * Success
6922
+ */
6923
+ export const zGetEmployerResponse = zApprenticeshipProgramEmployerResponseObject;
6826
6924
  export const zUpdateEmployerBody = zApprenticeshipProgramEmployerUpdateParameters;
6827
6925
  export const zUpdateEmployerPath = z.object({
6828
6926
  program_id: z.string(),
@@ -6908,6 +7006,22 @@ export const zCreatePeriodPath = z.object({
6908
7006
  * Created
6909
7007
  */
6910
7008
  export const zCreatePeriodResponse = zApprenticeshipWageSchedulePeriodResponseObject;
7009
+ export const zDeletePeriodPath = z.object({
7010
+ wage_schedule_id: z.string(),
7011
+ id: z.string()
7012
+ });
7013
+ /**
7014
+ * No Content
7015
+ */
7016
+ export const zDeletePeriodResponse = z.void();
7017
+ export const zGetPeriodPath = z.object({
7018
+ wage_schedule_id: z.string(),
7019
+ id: z.string()
7020
+ });
7021
+ /**
7022
+ * Success
7023
+ */
7024
+ export const zGetPeriodResponse = zApprenticeshipWageSchedulePeriodResponseObject;
6911
7025
  export const zUpdatePeriodBody = zApprenticeshipWageSchedulePeriodUpdateParameters;
6912
7026
  export const zUpdatePeriodPath = z.object({
6913
7027
  wage_schedule_id: z.string(),
@@ -7897,6 +8011,21 @@ export const zUpdatePackagePath = z.object({
7897
8011
  * Success
7898
8012
  */
7899
8013
  export const zUpdatePackageResponse = zCertificationPackageResponseObject;
8014
+ export const zRevokeUserCertificationApprovalPath = z.object({
8015
+ user_certification_id: z.string()
8016
+ });
8017
+ /**
8018
+ * Success
8019
+ */
8020
+ export const zRevokeUserCertificationApprovalResponse = zUserCertificationResponseObject;
8021
+ export const zApproveUserCertificationBody = zUserCertificationApprovalParameters;
8022
+ export const zApproveUserCertificationPath = z.object({
8023
+ user_certification_id: z.string()
8024
+ });
8025
+ /**
8026
+ * Success
8027
+ */
8028
+ export const zApproveUserCertificationResponse = zUserCertificationResponseObject;
7900
8029
  export const zListUserCertificationsQuery = z.object({
7901
8030
  filter: z.string().optional(),
7902
8031
  'filter[unexpected]': z.string().optional(),
@@ -8185,6 +8314,13 @@ export const zListFormDefinitionsQuery = z.object({
8185
8314
  * Success
8186
8315
  */
8187
8316
  export const zListFormDefinitionsResponse = zFormDefinitionResponseObject;
8317
+ export const zGetFormDefinitionPath = z.object({
8318
+ id: z.string()
8319
+ });
8320
+ /**
8321
+ * Success
8322
+ */
8323
+ export const zGetFormDefinitionResponse = zFormDefinitionObject;
8188
8324
  export const zListFormSubmissionDeltasQuery = z.object({
8189
8325
  'filter[event]': z.enum([
8190
8326
  'create',
@@ -8418,6 +8554,53 @@ export const zGetRateRuleQuery = z.object({
8418
8554
  * Success
8419
8555
  */
8420
8556
  export const zGetRateRuleResponse = zRateRuleResponseObject;
8557
+ export const zListJobSitesPath = z.object({
8558
+ job_id: z.string()
8559
+ });
8560
+ export const zListJobSitesQuery = z.object({
8561
+ filter: z.string().optional(),
8562
+ 'filter[unexpected]': z.string().optional(),
8563
+ 'page[cursor]': z.string().optional(),
8564
+ 'page[limit]': z.int().gte(1).optional().default(20),
8565
+ page: z.string().optional()
8566
+ });
8567
+ /**
8568
+ * Success
8569
+ */
8570
+ export const zListJobSitesResponse = zJobSitesResponseObject;
8571
+ export const zCreateJobSiteBody = zJobSiteParameters;
8572
+ export const zCreateJobSitePath = z.object({
8573
+ job_id: z.string()
8574
+ });
8575
+ /**
8576
+ * Created
8577
+ */
8578
+ export const zCreateJobSiteResponse = zJobSiteResponseObject;
8579
+ export const zDeleteJobSitePath = z.object({
8580
+ job_id: z.string(),
8581
+ id: z.string()
8582
+ });
8583
+ /**
8584
+ * No Content
8585
+ */
8586
+ export const zDeleteJobSiteResponse = z.void();
8587
+ export const zGetJobSitePath = z.object({
8588
+ job_id: z.string(),
8589
+ id: z.string()
8590
+ });
8591
+ /**
8592
+ * Success
8593
+ */
8594
+ export const zGetJobSiteResponse = zJobSiteResponseObject;
8595
+ export const zUpdateJobSiteBody = zJobSiteUpdateParameters;
8596
+ export const zUpdateJobSitePath = z.object({
8597
+ job_id: z.string(),
8598
+ id: z.string()
8599
+ });
8600
+ /**
8601
+ * Success
8602
+ */
8603
+ export const zUpdateJobSiteResponse = zJobSiteResponseObject;
8421
8604
  export const zShiftJobWageDeterminationGenesisBody = zJobWageDeterminationGenesisParameters;
8422
8605
  export const zShiftJobWageDeterminationGenesisHeaders = z.object({
8423
8606
  'If-Match': z.string()
@@ -9429,7 +9612,7 @@ export const zListCustomFieldsPath = z.object({
9429
9612
  * Success
9430
9613
  */
9431
9614
  export const zListCustomFieldsResponse = z.object({
9432
- data: z.array(zPeopleEmploymentCustomFieldResponseObject)
9615
+ data: z.array(zCustomFieldResponseObject)
9433
9616
  });
9434
9617
  export const zUpdateCustomFieldBody = zPeopleEmploymentCustomFieldsUpdateParameters;
9435
9618
  export const zUpdateCustomFieldHeaders = z.object({
@@ -9442,7 +9625,7 @@ export const zUpdateCustomFieldPath = z.object({
9442
9625
  * Success
9443
9626
  */
9444
9627
  export const zUpdateCustomFieldResponse = z.object({
9445
- data: z.array(zPeopleEmploymentCustomFieldResponseObject)
9628
+ data: z.array(zCustomFieldResponseObject)
9446
9629
  });
9447
9630
  export const zUpdateGenesisBody = zPeopleEmploymentGenesisParameters;
9448
9631
  export const zUpdateGenesisHeaders = z.object({
@@ -9756,6 +9939,55 @@ export const zCreateProjectTradePath = z.object({
9756
9939
  * Created
9757
9940
  */
9758
9941
  export const zCreateProjectTradeResponse = zPwaTradeResponseObject;
9942
+ export const zListProjectSitesPath = z.object({
9943
+ project_id: z.string()
9944
+ });
9945
+ export const zListProjectSitesQuery = z.object({
9946
+ 'page[cursor]': z.string().optional(),
9947
+ 'page[limit]': z.int().gte(1).optional().default(20),
9948
+ page: z.string().optional()
9949
+ });
9950
+ /**
9951
+ * Success
9952
+ */
9953
+ export const zListProjectSitesResponse = z.object({
9954
+ meta: zMeta,
9955
+ links: zLinks,
9956
+ data: z.array(zProjectSiteResponseObject)
9957
+ });
9958
+ export const zCreateProjectSiteBody = zProjectSiteParameters;
9959
+ export const zCreateProjectSitePath = z.object({
9960
+ project_id: z.string()
9961
+ });
9962
+ /**
9963
+ * Created
9964
+ */
9965
+ export const zCreateProjectSiteResponse = zProjectSiteResponseObject;
9966
+ export const zDeleteProjectSitePath = z.object({
9967
+ project_id: z.string(),
9968
+ id: z.string()
9969
+ });
9970
+ /**
9971
+ * No Content
9972
+ */
9973
+ export const zDeleteProjectSiteResponse = z.void();
9974
+ export const zGetProjectSitePath = z.object({
9975
+ project_id: z.string(),
9976
+ id: z.string()
9977
+ });
9978
+ /**
9979
+ * Success
9980
+ */
9981
+ export const zGetProjectSiteResponse = zProjectSiteResponseObject;
9982
+ export const zUpdateProjectSiteBody = zProjectSiteUpdateParameters;
9983
+ export const zUpdateProjectSitePath = z.object({
9984
+ project_id: z.string(),
9985
+ id: z.string()
9986
+ });
9987
+ /**
9988
+ * Success
9989
+ */
9990
+ export const zUpdateProjectSiteResponse = zProjectSiteResponseObject;
9759
9991
  export const zListProjectsQuery = z.object({
9760
9992
  'filter[federal_pwa_mode]': z.enum([
9761
9993
  'all',
@@ -9867,6 +10099,14 @@ export const zDeleteApprenticeshipOccupationPath = z.object({
9867
10099
  * Success
9868
10100
  */
9869
10101
  export const zDeleteApprenticeshipOccupationResponse = zPwaTradeApprenticeshipOccupationResponseObject;
10102
+ export const zGetApprenticeshipOccupationPath = z.object({
10103
+ trade_id: z.string(),
10104
+ id: z.string()
10105
+ });
10106
+ /**
10107
+ * Success
10108
+ */
10109
+ export const zGetApprenticeshipOccupationResponse = zPwaTradeApprenticeshipOccupationResponseObject;
9870
10110
  export const zUpdateApprenticeshipOccupationBody = zPwaTradeApprenticeshipOccupationUpdateParameters;
9871
10111
  export const zUpdateApprenticeshipOccupationPath = z.object({
9872
10112
  trade_id: z.string(),
@@ -10176,6 +10416,15 @@ export const zGetPriorPeriodAdjustmentPath = z.object({
10176
10416
  * Success
10177
10417
  */
10178
10418
  export const zGetPriorPeriodAdjustmentResponse = zPriorPeriodAdjustmentResponseObject;
10419
+ export const zUpdatePriorPeriodAdjustmentBody = zPriorPeriodAdjustmentUpdateParameters;
10420
+ export const zUpdatePriorPeriodAdjustmentPath = z.object({
10421
+ time_card_id: z.string(),
10422
+ id: z.string()
10423
+ });
10424
+ /**
10425
+ * Success
10426
+ */
10427
+ export const zUpdatePriorPeriodAdjustmentResponse = zPriorPeriodAdjustmentResponseObject;
10179
10428
  export const zListPwaCompliancesPath = z.object({
10180
10429
  time_card_id: z.string()
10181
10430
  });
@@ -10760,6 +11009,7 @@ export const zListUsersQuery = z.object({
10760
11009
  'none',
10761
11010
  'all'
10762
11011
  ]).optional(),
11012
+ 'filter[name]': z.string().optional(),
10763
11013
  'page[cursor]': z.string().optional(),
10764
11014
  'page[limit]': z.int().gte(1).optional().default(20),
10765
11015
  page: z.string().optional(),