@dsptch-work/api-client 0.36.0 → 0.38.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.
@@ -287,7 +287,7 @@ export type Problem = {
287
287
  *
288
288
  * **Unparseable Date Value**
289
289
  *
290
- * A date-time value cannot be parsed, or falls outside the storable range. Format values as ISO 8601 (for example `2026-08-05` or `2026-08-05T14:30`).
290
+ * A date-time value cannot be parsed, falls outside the storable range, or has no UTC offset where one is required. Format values as ISO 8601 (for example `2026-08-05` or `2026-08-05T14:30`); a time entry's `start_time` and `end_time`, a timestamp filter bound, and an `as_of[]` coordinate need an offset (for example `2026-08-05T14:30:00-04:00` or `2026-08-05T18:30:00Z`).
291
291
  *
292
292
  * ### invalid_filter_value
293
293
  *
@@ -313,12 +313,6 @@ export type Problem = {
313
313
  *
314
314
  * An attachment signed id names no upload this endpoint can read. A signed id is issued for one `resource` and verifies only there, so an id for a different resource is indistinguishable from one that is malformed, expired, or tampered with, and all of them answer alike. The message names the resource the upload needed; upload the file again to the direct-uploads endpoint naming it, and pass the signed id that call returns.
315
315
  *
316
- * ### non_numeric_cents
317
- *
318
- * **Non-Numeric Money Value**
319
- *
320
- * A money parameter is not a numeric value in cents. Send money as a numeric cents value.
321
- *
322
316
  * ### nothing_to_cancel
323
317
  *
324
318
  * **Nothing To Cancel**
@@ -400,7 +394,7 @@ export type Problem = {
400
394
  * Another write to the same resource held it for longer than this request was willing to wait, or collided with it, so nothing was applied. The request itself is fine — resend it unchanged after the `Retry-After` window.
401
395
  *
402
396
  */
403
- export type ProblemTypeCatalog = 'blank_axis' | 'invalid_cursor' | 'invalid_filter_key' | 'invalid_limit' | 'invalid_signature' | 'malformed_body' | 'non_range_filter_value' | 'non_scalar_axis' | 'non_scalar_filter_value' | 'parameter_missing' | 'parameter_not_object' | 'unknown_axis' | 'unknown_key' | 'unsupported_axis' | 'valid_axis_on_timeline' | 'unauthorized' | 'company_scoped_key_required' | 'forbidden' | 'forbidden_key' | 'insufficient_api_key_scope' | 'user_scoped_key_required' | 'not_found' | 'already_subscribed' | 'already_terminated' | 'authorization_revoked' | 'import_in_progress' | 'pay_schedule_already_exists' | 'product_archived' | 'recorded_since_termination' | 'span_beyond_timeline_end' | 'version_overlap' | 'precondition_failed' | 'attachment_not_image' | 'company_not_employer' | 'confirm_apprenticeship_conflict' | 'destroy_restricted' | 'interval_too_wide' | 'invalid_date' | 'invalid_filter_value' | 'invalid_iso8601_duration' | 'invalid_placement_move' | 'invalid_signed_id' | 'non_numeric_cents' | 'nothing_to_cancel' | 'pagination_failed' | 'subtype_foreign_keys' | 'synced_determination' | 'user_not_company_member' | 'validation_failed' | 'wage_schedule_outside_program' | 'precondition_required' | 'too_many_requests' | 'internal_error' | 'database_timeout' | 'write_contended';
397
+ export type ProblemTypeCatalog = 'blank_axis' | 'invalid_cursor' | 'invalid_filter_key' | 'invalid_limit' | 'invalid_signature' | 'malformed_body' | 'non_range_filter_value' | 'non_scalar_axis' | 'non_scalar_filter_value' | 'parameter_missing' | 'parameter_not_object' | 'unknown_axis' | 'unknown_key' | 'unsupported_axis' | 'valid_axis_on_timeline' | 'unauthorized' | 'company_scoped_key_required' | 'forbidden' | 'forbidden_key' | 'insufficient_api_key_scope' | 'user_scoped_key_required' | 'not_found' | 'already_subscribed' | 'already_terminated' | 'authorization_revoked' | 'import_in_progress' | 'pay_schedule_already_exists' | 'product_archived' | 'recorded_since_termination' | 'span_beyond_timeline_end' | 'version_overlap' | 'precondition_failed' | 'attachment_not_image' | 'company_not_employer' | 'confirm_apprenticeship_conflict' | 'destroy_restricted' | 'interval_too_wide' | 'invalid_date' | 'invalid_filter_value' | 'invalid_iso8601_duration' | 'invalid_placement_move' | 'invalid_signed_id' | 'nothing_to_cancel' | 'pagination_failed' | 'subtype_foreign_keys' | 'synced_determination' | 'user_not_company_member' | 'validation_failed' | 'wage_schedule_outside_program' | 'precondition_required' | 'too_many_requests' | 'internal_error' | 'database_timeout' | 'write_contended';
404
398
  export type ApiKeyScopeResponseObject = {
405
399
  resource: string;
406
400
  action: 'read' | 'create' | 'update' | 'delete';
@@ -413,7 +407,7 @@ export type DirectUploadParameters = {
413
407
  /**
414
408
  * What the file is for, named as the endpoint that will attach it (for example `assets.vendors`). Required. It decides where the file is stored, and the signed ID this call returns is issued for that resource alone — it will not resolve at any other endpoint, so a vendor logo cannot be attached as an avatar, or an avatar as a logo.
415
409
  */
416
- resource: 'assets.items' | 'assets.items.documents' | 'assets.items.service_events' | 'assets.products' | 'assets.vendors' | 'compliance.checks' | 'internal.companies' | 'internal.company_todos' | 'internal.job_todos' | 'internal.project_todos' | 'pay_periods.imports.aggregate_times' | 'pay_periods.imports.dsptch_cprs' | 'pay_periods.imports.time_entries' | 'payrolls.payroll_runs.imports.paystubs' | 'payrolls.payroll_runs.imports.wide_paystubs' | 'projects.documents' | 'users';
410
+ resource: 'assets.items' | 'assets.items.documents' | 'assets.items.service_events' | 'assets.products' | 'assets.vendors' | 'compliance.checks' | 'internal.companies' | 'internal.company_todos' | 'internal.job_todos' | 'internal.project_todos' | 'jobs.documents' | 'pay_periods.imports.aggregate_times' | 'pay_periods.imports.dsptch_cprs' | 'pay_periods.imports.time_entries' | 'payrolls.payroll_runs.imports.paystubs' | 'payrolls.payroll_runs.imports.wide_paystubs' | 'projects.documents' | 'users';
417
411
  /**
418
412
  * Metadata describing the file being registered, before its bytes are uploaded.
419
413
  */
@@ -769,9 +763,9 @@ export type CompetencyCriterionResponseObject = {
769
763
  */
770
764
  evidence_note: string | null;
771
765
  /**
772
- * Suggested assessment method for this criterion; null when unset. An assessment does not have to use it.
766
+ * Suggested assessment methods for this criterion. Empty when none are suggested. An assessment does not have to use them.
773
767
  */
774
- assessment_method: 'direct_observation' | 'simulation' | 'oral_questioning' | 'written_questioning' | 'products_of_work' | 'recognized_prior_learning' | 'witness_testimony' | 'other' | null;
768
+ assessment_methods: Array<'direct_observation' | 'simulation' | 'oral_questioning' | 'written_questioning' | 'products_of_work' | 'recognized_prior_learning' | 'witness_testimony' | 'other'>;
775
769
  /**
776
770
  * When the criterion was created.
777
771
  */
@@ -798,9 +792,9 @@ export type CompetencyCriterionParameters = {
798
792
  */
799
793
  evidence_note?: string | null;
800
794
  /**
801
- * Suggested assessment method; optional, null to clear.
795
+ * Suggested assessment methods. Optional. Send an empty array to clear.
802
796
  */
803
- assessment_method?: 'direct_observation' | 'simulation' | 'oral_questioning' | 'written_questioning' | 'products_of_work' | 'recognized_prior_learning' | 'witness_testimony' | 'other' | null;
797
+ assessment_methods?: Array<'direct_observation' | 'simulation' | 'oral_questioning' | 'written_questioning' | 'products_of_work' | 'recognized_prior_learning' | 'witness_testimony' | 'other'>;
804
798
  };
805
799
  /**
806
800
  * Swap a draft catalog row with its neighbor. The row cannot move past either end of the list.
@@ -1019,9 +1013,9 @@ export type CompetencyAssessmentResponseObject = {
1019
1013
  updated_at: string;
1020
1014
  };
1021
1015
  /**
1022
- * One task line on an assessment. decision and qa_feedback are omitted, not null, when the caller is the candidate and the package is not yet decided.
1016
+ * One criterion line on an assessment. decision and qa_feedback are omitted, not null, when the caller is the candidate and the package is not yet decided.
1023
1017
  */
1024
- export type CompetencyAssessmentKeyActivityResponseObject = {
1018
+ export type CompetencyAssessmentCriterionResponseObject = {
1025
1019
  /**
1026
1020
  * ID of the line.
1027
1021
  */
@@ -1031,9 +1025,9 @@ export type CompetencyAssessmentKeyActivityResponseObject = {
1031
1025
  */
1032
1026
  competencies_assessment_id: string;
1033
1027
  /**
1034
- * ID of the catalog key activity snapshotted onto the line.
1028
+ * ID of the catalog criterion snapshotted onto the line.
1035
1029
  */
1036
- competencies_key_activity_id: string;
1030
+ competencies_criterion_id: string;
1037
1031
  /**
1038
1032
  * Methods the assessor recorded for this line. Empty when none have been recorded.
1039
1033
  */
@@ -1090,7 +1084,7 @@ export type CompetencyEvidenceItemResponseObject = {
1090
1084
  /**
1091
1085
  * ID of the assessment line this evidence is attached to.
1092
1086
  */
1093
- competencies_assessment_key_activity_id: string;
1087
+ competencies_assessment_criterion_id: string;
1094
1088
  /**
1095
1089
  * What the evidence points at: upload, form_submission, or certification.
1096
1090
  */
@@ -1706,7 +1700,7 @@ export type ApprenticeshipProgramEmployerUpdateParameters = {
1706
1700
  require_timecard_allocation?: boolean;
1707
1701
  };
1708
1702
  /**
1709
- * Create a period on a wage schedule; the wage schedule is taken from the URL path. wage_cents and fringe_cents are sent as integer cents. Omitting period_number, wage_percent, or wage_cents answers 400. A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those leaves it unset, but a period with none of min_minutes, max_minutes, or num_competencies answers 422.
1703
+ * Create a period on a wage schedule; the wage schedule is taken from the URL path. wage_percent and fringe_percent are sent as decimal strings (e.g. "62.5"), and wage_cents and fringe_cents as cents in a decimal string (e.g. "2800" or "2800.0"). Omitting period_number, wage_percent, or wage_cents answers 400. A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those leaves it unset, but a period with none of min_minutes, max_minutes, or num_competencies answers 422.
1710
1704
  */
1711
1705
  export type ApprenticeshipWageSchedulePeriodParameters = {
1712
1706
  /**
@@ -1730,24 +1724,24 @@ export type ApprenticeshipWageSchedulePeriodParameters = {
1730
1724
  */
1731
1725
  description?: string | null;
1732
1726
  /**
1733
- * Percentage of the journeyworker wage paid during this period (e.g. 75 for 75%). Required.
1727
+ * Percentage of the journeyworker wage paid during this period, as a decimal string (e.g. "75" or "75.0" for 75%). Required.
1734
1728
  */
1735
- wage_percent: number;
1729
+ wage_percent: string;
1736
1730
  /**
1737
- * Wage rate for this period, in cents; denominated in the parent schedule's wage_unit. Required.
1731
+ * Wage rate for this period, in cents as a decimal string (e.g. "3150" or "3150.0"); denominated in the parent schedule's wage_unit. Required.
1738
1732
  */
1739
- wage_cents: number;
1733
+ wage_cents: string;
1740
1734
  /**
1741
- * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges (e.g. 70 for 70%); optional, omit or send null when the period does not list fringe as a percentage. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1735
+ * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges, sent as a decimal string (e.g. "70" or "70.0" for 70%); optional, omit or send null when the period does not list fringe as a percentage. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1742
1736
  */
1743
- fringe_percent?: number | null;
1737
+ fringe_percent?: string | null;
1744
1738
  /**
1745
- * Fixed hourly apprentice fringe for this period, in cents, in the period's wage currency; optional, omit or send null when the period does not list a fixed fringe. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1739
+ * Fixed hourly apprentice fringe for this period, in cents as a decimal string (e.g. "450" or "450.0"), in the period's wage currency; optional, omit or send null when the period does not list a fixed fringe. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1746
1740
  */
1747
- fringe_cents?: number | null;
1741
+ fringe_cents?: string | null;
1748
1742
  };
1749
1743
  /**
1750
- * Update a period on a wage schedule. Send only the fields to change; the wage schedule is taken from the URL path, and wage_cents and fringe_cents are sent as integer cents. A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those clears it, but a period left with none of min_minutes, max_minutes, or num_competencies answers 422.
1744
+ * Update a period on a wage schedule. Send only the fields to change; the wage schedule is taken from the URL path, wage_percent and fringe_percent are sent as decimal strings (e.g. "62.5"), and wage_cents and fringe_cents as cents in a decimal string (e.g. "2800" or "2800.0"). A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those clears it, but a period left with none of min_minutes, max_minutes, or num_competencies answers 422.
1751
1745
  */
1752
1746
  export type ApprenticeshipWageSchedulePeriodUpdateParameters = {
1753
1747
  /**
@@ -1771,24 +1765,24 @@ export type ApprenticeshipWageSchedulePeriodUpdateParameters = {
1771
1765
  */
1772
1766
  description?: string | null;
1773
1767
  /**
1774
- * Percentage of the journeyworker wage paid during this period (e.g. 75 for 75%); omit to leave it unchanged.
1768
+ * Percentage of the journeyworker wage paid during this period, as a decimal string (e.g. "75" or "75.0" for 75%); omit to leave it unchanged.
1775
1769
  */
1776
- wage_percent?: number;
1770
+ wage_percent?: string;
1777
1771
  /**
1778
- * Wage rate for this period, in cents; omit to leave it unchanged.
1772
+ * Wage rate for this period, in cents as a decimal string (e.g. "3150" or "3150.0"); omit to leave it unchanged.
1779
1773
  */
1780
- wage_cents?: number;
1774
+ wage_cents?: string;
1781
1775
  /**
1782
- * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges (e.g. 70 for 70%); omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a fixed amount sends fringe_cents with fringe_percent null; a request that leaves both set is rejected with a 422.
1776
+ * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges, sent as a decimal string (e.g. "70" or "70.0" for 70%); omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a fixed amount sends fringe_cents with fringe_percent null; a request that leaves both set is rejected with a 422.
1783
1777
  */
1784
- fringe_percent?: number | null;
1778
+ fringe_percent?: string | null;
1785
1779
  /**
1786
- * Fixed hourly apprentice fringe for this period, in cents; omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a percentage sends fringe_percent with fringe_cents null; a request that leaves both set is rejected with a 422.
1780
+ * Fixed hourly apprentice fringe for this period, in cents as a decimal string (e.g. "450" or "450.0"); omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a percentage sends fringe_percent with fringe_cents null; a request that leaves both set is rejected with a 422.
1787
1781
  */
1788
- fringe_cents?: number | null;
1782
+ fringe_cents?: string | null;
1789
1783
  };
1790
1784
  /**
1791
- * Create a wage schedule for an occupation; the occupation is taken from the URL path. Money is sent as integer cents; periods may be created inline via periods_attributes. Omitting name, wage_unit, journeyworker_wage_unit, or period_unit answers 400. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those leaves the field unset.
1785
+ * Create a wage schedule for an occupation; the occupation is taken from the URL path. Money is sent as cents in a decimal string (e.g. "2800" or "2800.0"); periods may be created inline via periods_attributes. Omitting name, wage_unit, journeyworker_wage_unit, or period_unit answers 400. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those leaves the field unset.
1792
1786
  */
1793
1787
  export type ApprenticeshipWageScheduleParameters = {
1794
1788
  /**
@@ -1812,17 +1806,17 @@ export type ApprenticeshipWageScheduleParameters = {
1812
1806
  */
1813
1807
  period_unit: 'hours' | 'weeks' | 'months' | 'quarter' | 'semi_annual' | 'year';
1814
1808
  /**
1815
- * The journeyworker wage to progress toward, in cents; denominated in journeyworker_wage_unit; optional, defaults to 0.
1809
+ * The journeyworker wage to progress toward, in cents as a decimal string (e.g. "5000" or "5000.0"); denominated in journeyworker_wage_unit; optional, defaults to 0.
1816
1810
  */
1817
- journeyworker_wage_cents?: number;
1811
+ journeyworker_wage_cents?: string;
1818
1812
  /**
1819
- * The journeyworker fringe that percentage-listed periods are authored against, in cents; an authoring reference only, never priced; optional, omit or send null to leave it unset.
1813
+ * The journeyworker fringe that percentage-listed periods are authored against, in cents as a decimal string (e.g. "2000" or "2000.0"); an authoring reference only, never priced; optional, omit or send null to leave it unset.
1820
1814
  */
1821
- journeyworker_fringe_cents?: number | null;
1815
+ journeyworker_fringe_cents?: string | null;
1822
1816
  /**
1823
- * Wage at the end of the progression (100% of the journeyworker wage), in cents; denominated in wage_unit; optional, defaults to 0.
1817
+ * Wage at the end of the progression (100% of the journeyworker wage), in cents as a decimal string (e.g. "4200" or "4200.0"); denominated in wage_unit; optional, defaults to 0.
1824
1818
  */
1825
- end_wage_cents?: number;
1819
+ end_wage_cents?: string;
1826
1820
  /**
1827
1821
  * Periods to create, update, or remove alongside the schedule, as a list of row objects; omit a period's id to add one, include its id to update it, or send its id with _destroy true to remove it; optional. In a row, an unknown key, a wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those leaves it unset, but a period with none of min_minutes, max_minutes, or num_competencies answers 422.
1828
1822
  */
@@ -1852,21 +1846,21 @@ export type ApprenticeshipWageScheduleParameters = {
1852
1846
  */
1853
1847
  description?: string | null;
1854
1848
  /**
1855
- * Percentage of the journeyworker wage paid during this period (e.g. 75 for 75%). Required.
1849
+ * Percentage of the journeyworker wage paid during this period, as a decimal string (e.g. "75" or "75.0" for 75%). Required.
1856
1850
  */
1857
- wage_percent?: number;
1851
+ wage_percent?: string;
1858
1852
  /**
1859
- * Wage rate for this period, in cents; denominated in the parent schedule's wage_unit. Required.
1853
+ * Wage rate for this period, in cents as a decimal string (e.g. "3150" or "3150.0"); denominated in the parent schedule's wage_unit. Required.
1860
1854
  */
1861
- wage_cents?: number;
1855
+ wage_cents?: string;
1862
1856
  /**
1863
- * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges (e.g. 70 for 70%); optional, omit or send null when the period does not list fringe as a percentage. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1857
+ * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges, sent as a decimal string (e.g. "70" or "70.0" for 70%); optional, omit or send null when the period does not list fringe as a percentage. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1864
1858
  */
1865
- fringe_percent?: number | null;
1859
+ fringe_percent?: string | null;
1866
1860
  /**
1867
- * Fixed hourly apprentice fringe for this period, in cents, in the period's wage currency; optional, omit or send null when the period does not list a fixed fringe. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1861
+ * Fixed hourly apprentice fringe for this period, in cents as a decimal string (e.g. "450" or "450.0"), in the period's wage currency; optional, omit or send null when the period does not list a fixed fringe. A period lists fringe one way at most, so sending both fringe_percent and fringe_cents non-null is rejected with a 422.
1868
1862
  */
1869
- fringe_cents?: number | null;
1863
+ fringe_cents?: string | null;
1870
1864
  /**
1871
1865
  * Set to true, together with the period's id, to remove that period from the schedule.
1872
1866
  */
@@ -1874,7 +1868,7 @@ export type ApprenticeshipWageScheduleParameters = {
1874
1868
  }>;
1875
1869
  };
1876
1870
  /**
1877
- * Update a wage schedule for an occupation. Send only the fields to change; money is sent as integer cents and periods may be created, updated, or removed inline via periods_attributes. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those clears the field.
1871
+ * Update a wage schedule for an occupation. Send only the fields to change; money is sent as cents in a decimal string (e.g. "2800" or "2800.0") and periods may be created, updated, or removed inline via periods_attributes. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those clears the field.
1878
1872
  */
1879
1873
  export type ApprenticeshipWageScheduleUpdateParameters = {
1880
1874
  /**
@@ -1898,17 +1892,17 @@ export type ApprenticeshipWageScheduleUpdateParameters = {
1898
1892
  */
1899
1893
  period_unit?: 'hours' | 'weeks' | 'months' | 'quarter' | 'semi_annual' | 'year';
1900
1894
  /**
1901
- * Journeyworker wage to progress toward, in cents; omit to leave it unchanged.
1895
+ * Journeyworker wage to progress toward, in cents as a decimal string (e.g. "5000" or "5000.0"); omit to leave it unchanged.
1902
1896
  */
1903
- journeyworker_wage_cents?: number;
1897
+ journeyworker_wage_cents?: string;
1904
1898
  /**
1905
- * The journeyworker fringe that percentage-listed periods are authored against, in cents; an authoring reference only, never priced; omit to leave it unchanged, or send null to clear.
1899
+ * The journeyworker fringe that percentage-listed periods are authored against, in cents as a decimal string (e.g. "2000" or "2000.0"); an authoring reference only, never priced; omit to leave it unchanged, or send null to clear.
1906
1900
  */
1907
- journeyworker_fringe_cents?: number | null;
1901
+ journeyworker_fringe_cents?: string | null;
1908
1902
  /**
1909
- * Wage at the end of the progression, in cents; omit to leave it unchanged.
1903
+ * Wage at the end of the progression, in cents as a decimal string (e.g. "4200" or "4200.0"); omit to leave it unchanged.
1910
1904
  */
1911
- end_wage_cents?: number;
1905
+ end_wage_cents?: string;
1912
1906
  /**
1913
1907
  * Periods to create, update, or remove alongside the schedule, as a list of row objects; omit a period's id to add one, include its id to update it, or send its id with _destroy true to remove it; omit the list to leave every period unchanged. In a row, an unknown key, a wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those clears it, but a period left with none of min_minutes, max_minutes, or num_competencies answers 422.
1914
1908
  */
@@ -1938,21 +1932,21 @@ export type ApprenticeshipWageScheduleUpdateParameters = {
1938
1932
  */
1939
1933
  description?: string | null;
1940
1934
  /**
1941
- * Percentage of the journeyworker wage paid during this period (e.g. 75 for 75%); omit to leave it unchanged.
1935
+ * Percentage of the journeyworker wage paid during this period, as a decimal string (e.g. "75" or "75.0" for 75%); omit to leave it unchanged.
1942
1936
  */
1943
- wage_percent?: number;
1937
+ wage_percent?: string;
1944
1938
  /**
1945
- * Wage rate for this period, in cents; omit to leave it unchanged.
1939
+ * Wage rate for this period, in cents as a decimal string (e.g. "3150" or "3150.0"); omit to leave it unchanged.
1946
1940
  */
1947
- wage_cents?: number;
1941
+ wage_cents?: string;
1948
1942
  /**
1949
- * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges (e.g. 70 for 70%); omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a fixed amount sends fringe_cents with fringe_percent null; a request that leaves both set is rejected with a 422.
1943
+ * Apprentice fringe for this period, as a percentage of the fringe on the wage determination the apprentice charges, sent as a decimal string (e.g. "70" or "70.0" for 70%); omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a fixed amount sends fringe_cents with fringe_percent null; a request that leaves both set is rejected with a 422.
1950
1944
  */
1951
- fringe_percent?: number | null;
1945
+ fringe_percent?: string | null;
1952
1946
  /**
1953
- * Fixed hourly apprentice fringe for this period, in cents; omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a percentage sends fringe_percent with fringe_cents null; a request that leaves both set is rejected with a 422.
1947
+ * Fixed hourly apprentice fringe for this period, in cents as a decimal string (e.g. "450" or "450.0"); omit to leave it unchanged, or send null to clear. A period lists fringe one way at most, so switching to a percentage sends fringe_percent with fringe_cents null; a request that leaves both set is rejected with a 422.
1954
1948
  */
1955
- fringe_cents?: number | null;
1949
+ fringe_cents?: string | null;
1956
1950
  /**
1957
1951
  * Set to true, together with the period's id, to remove that period from the schedule.
1958
1952
  */
@@ -2546,7 +2540,7 @@ export type TimecodeHistoryVersionObject = {
2546
2540
  */
2547
2541
  export type TimecodeParameters = {
2548
2542
  /**
2549
- * When the new timecode becomes effective. Defaults to the time of the request. Accepted on create only.
2543
+ * The day the new timecode becomes effective, as a calendar date (`YYYY-MM-DD`). It applies from 00:00 UTC on that day, the same as the web. A value with a time of day is refused with `422`. Defaults to the time of the request. Accepted on create only.
2550
2544
  */
2551
2545
  effective_date?: string;
2552
2546
  /**
@@ -2615,11 +2609,11 @@ export type TimecodeParameters = {
2615
2609
  */
2616
2610
  export type TimecodeCorrectionParameters = {
2617
2611
  /**
2618
- * Where the correction starts applying. Defaults to the addressed version's own start.
2612
+ * Where the correction starts applying, as a date-time with a UTC offset (`Z` or `-04:00`). Defaults to the addressed version's own start. A time without an offset answers 422 invalid_date at its pointer, showing the time fixed in UTC. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
2619
2613
  */
2620
2614
  effective_from?: string;
2621
2615
  /**
2622
- * Where the correction stops applying; it must be later than `effective_from`. Omit to correct through the end of the segment containing `effective_from`, preserving later scheduled changes.
2616
+ * Where the correction stops applying, as a date-time with a UTC offset (`Z` or `-04:00`); it must be later than `effective_from`. Omit to correct through the end of the segment containing `effective_from`, preserving later scheduled changes. A time without an offset answers 422 invalid_date at its pointer, showing the time fixed in UTC. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
2623
2617
  */
2624
2618
  effective_to?: string;
2625
2619
  /**
@@ -2688,7 +2682,7 @@ export type TimecodeCorrectionParameters = {
2688
2682
  */
2689
2683
  export type TimecodeGenesisParameters = {
2690
2684
  /**
2691
- * The new beginning of the timecode's valid-time timeline. Required; the shift is refused if it would orphan recorded time or leave no coverage.
2685
+ * The new first day of the timecode's valid-time timeline, as a calendar date (`YYYY-MM-DD`). The timeline begins at 00:00 UTC on that day, the same as the web. A value with a time of day is refused with `422`. Required; the shift is refused if it would orphan recorded time or leave no coverage.
2692
2686
  */
2693
2687
  effective_date: string;
2694
2688
  };
@@ -2706,7 +2700,7 @@ export type TimecodeScheduledTerminationParameters = {
2706
2700
  */
2707
2701
  export type TimecodeScheduledChangeParameters = {
2708
2702
  /**
2709
- * When the scheduled change takes effect. Must be on or after the timecode's valid_from.
2703
+ * The day the change takes effect, as a calendar date (`YYYY-MM-DD`). It applies from 00:00 UTC on that day, the same as the web; on the day the timecode began, it applies from that beginning instead. A value with a time of day is refused with `422`. Must be on or after the day the timecode began.
2710
2704
  */
2711
2705
  effective_date: string;
2712
2706
  /**
@@ -4631,62 +4625,69 @@ export type PwaJobDetailsResponseObject = {
4631
4625
  ny_dol_prc_number?: string | null;
4632
4626
  } | null;
4633
4627
  /**
4634
- * 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.
4628
+ * Parameters for creating a job. Sets the job's schedule, work types, address, custom-field values, and optional Prevailing Wage / Apprenticeship (PWA) compliance. `requested_by_company_id` and `created_by_user_id` are required unless `template_id` names a template, whose copy keeps both. Undeclared body keys return 400, and a null for a field that is not nullable or a wrongly typed value returns 422 at its pointer, before any job or relationship is saved.
4635
4629
  */
4636
- export type JobParameters = {
4630
+ export type JobCreateParameters = {
4631
+ /**
4632
+ * ID of the user creating the job; the creator cannot be changed afterward. A copy of a template keeps the template's creator when this is omitted. Null, a blank ID, or a wrong type answers 422.
4633
+ */
4634
+ created_by_user_id?: string;
4635
+ /**
4636
+ * ID of a job template to copy this job from; when set, the new job is created from that template. Null or omit to start from a blank job; a blank ID or a wrong type answers 422.
4637
+ */
4638
+ template_id?: string | null;
4637
4639
  /**
4638
4640
  * Human-readable job name, unique within the creating company; null when unset.
4639
4641
  */
4640
4642
  name?: string | null;
4641
4643
  /**
4642
- * Free-text description of the job.
4644
+ * Free-text description of the job. Null or a wrong type answers 422.
4643
4645
  */
4644
4646
  description?: string;
4645
4647
  /**
4646
- * ID of the company that requested the job (for example a general contractor). Required on create; omit on update to preserve the existing requester.
4648
+ * ID of the company that requested the job (for example a general contractor). Omit on update to preserve the existing requester. Null, a blank ID, or a wrong type answers 422.
4647
4649
  */
4648
4650
  requested_by_company_id?: string;
4649
- /**
4650
- * Complete desired set of unique nonblank manager user IDs. Omit to preserve the set; send an empty array to clear it. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before any job or relationship is saved.
4651
- */
4652
- manager_user_ids?: Array<string>;
4653
4651
  /**
4654
4652
  * Purchase order number for the job; null when unset.
4655
4653
  */
4656
4654
  purchase_order_number?: string | null;
4657
4655
  /**
4658
- * ID of the project this job belongs to; null when the job is not part of a project.
4656
+ * ID of the project this job belongs to; null when the job is not part of a project. A blank ID or a wrong type answers 422.
4659
4657
  */
4660
4658
  project_id?: string | null;
4661
4659
  /**
4662
- * ID of a department belonging to the job's provider company. Retrieve department IDs from GET /api/v1/companies/departments. Send null to clear the assignment; omit on update to preserve it, or on create to preserve a copied template's assignment. A new job without a template starts unassigned.
4660
+ * ID of a department belonging to the job's provider company. Retrieve department IDs from GET /api/v1/companies/departments. Send null to clear the assignment; omit on update to preserve it, or on create to preserve a copied template's assignment. A new job without a template starts unassigned. A blank ID or a wrong type answers 422.
4663
4661
  */
4664
4662
  companies_department_id?: string | null;
4665
4663
  /**
4666
- * Federal prevailing-wage / apprenticeship (PWA) tracking mode: one of all (both prevailing wage and apprenticeship), pw_only, ap_only, or none.
4664
+ * Federal prevailing-wage / apprenticeship (PWA) tracking mode: one of all (both prevailing wage and apprenticeship), pw_only, ap_only, or none. Null or any other value returns 422.
4667
4665
  */
4668
4666
  federal_pwa_mode?: 'all' | 'pw_only' | 'ap_only' | 'none';
4669
4667
  /**
4670
- * Regional (state) prevailing-wage / apprenticeship tracking mode: one of all (both prevailing wage and apprenticeship), pw_only, ap_only, or none.
4668
+ * Regional (state) prevailing-wage / apprenticeship tracking mode, with the same values as federal_pwa_mode; null or any other value returns 422.
4671
4669
  */
4672
4670
  regional_pwa_mode?: 'all' | 'pw_only' | 'ap_only' | 'none';
4673
4671
  /**
4674
4672
  * Two-letter state code (e.g. CA, IL, NY) that selects which regional prevailing-wage fields under pwa_details apply.
4675
4673
  */
4676
- region?: string;
4674
+ region?: string | null;
4677
4675
  /**
4678
- * Start of the job's scheduled window (ISO 8601); the date is anchored to the start of that day in tz_name. Null to leave the job unscheduled.
4676
+ * Start of the job's scheduled window (ISO 8601); the date is anchored to the start of that day in tz_name. Null to leave the job unscheduled; any other non-string, false included, answers 422.
4679
4677
  */
4680
4678
  start_time?: string | null;
4681
4679
  /**
4682
- * End of the job's scheduled window (ISO 8601); the date is anchored to the start of that day in tz_name. Null to leave the job unscheduled.
4680
+ * End of the job's scheduled window (ISO 8601); the date is anchored to the start of that day in tz_name. Null to leave the job unscheduled; any other non-string, false included, answers 422.
4683
4681
  */
4684
4682
  end_time?: string | null;
4685
4683
  /**
4686
- * Time zone the job's schedule and time tracking are anchored to (e.g. US/Central); defaults to US/Central when unset.
4684
+ * Time zone the job's schedule and time tracking are anchored to (e.g. US/Central); defaults to US/Central when unset. Null, a blank or unlisted name, or a wrong type answers 422.
4687
4685
  */
4688
4686
  tz_name?: string;
4689
- time_card_start_day?: TimeCardStartDay;
4687
+ /**
4688
+ * Day of the week the job's workweek and time cards start on, as an integer: 0 (Sunday) through 6 (Saturday). Any other value, a numeric string included, answers 422.
4689
+ */
4690
+ time_card_start_day?: number;
4690
4691
  /**
4691
4692
  * Clock-in enforcement level: one of none (no guidance), warning (manual time entries fail the clock-in compliance check), or required (a technician's own time on the job must come from clocking in on DSPTCH Mobile; the technician's own web and user-API-key time-entry writes are refused). A time entry whose time code, as of the entry's start time, is PTO, holiday, or restricted to non-job time entries is exempt at every level. Time-entry writes made with a company API key are not gated. While the creating company requires clock-in company-wide, a create stores `required` whatever value is sent, and lowering an open job returns 422 with the error at `#/clock_in_requirement`. Omit the field to leave the current value unchanged.
4692
4693
  */
@@ -4696,31 +4697,276 @@ export type JobParameters = {
4696
4697
  */
4697
4698
  send_geofence_reminders?: boolean | null;
4698
4699
  /**
4699
- * Whether customers granted access can view this job.
4700
+ * Whether customers granted access can view this job. A boolean; null or any other type returns 422.
4700
4701
  */
4701
4702
  allow_customer_access?: boolean;
4703
+ /**
4704
+ * Whether the feature-allocation selector is shown for this job. A boolean; null or any other type returns 422.
4705
+ */
4706
+ tracks_feature_allocations?: boolean;
4707
+ /**
4708
+ * Whether applicable time entries on this job must carry a feature allocation. A boolean; null or any other type returns 422.
4709
+ */
4710
+ requires_feature_allocation?: boolean;
4711
+ /**
4712
+ * Whether time entries on this job are capped at one feature allocation. A boolean; null or any other type returns 422.
4713
+ */
4714
+ max_one_feature_allocation?: boolean;
4715
+ /**
4716
+ * How this job records production completions: one of none (opts out), feature (per site feature, e.g. a turbine), or quantity (a unit count, e.g. modules). Locked once any completion exists. Omit the field to leave the current value unchanged.
4717
+ */
4718
+ production_tracking_kind?: 'none' | 'feature' | 'quantity';
4719
+ /**
4720
+ * Complete desired set of unique nonblank manager user IDs. Omit to preserve the set; send an empty array to clear it. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before any job or relationship is saved.
4721
+ */
4722
+ manager_user_ids?: Array<string>;
4702
4723
  /**
4703
4724
  * Complete desired set of unique nonblank timecode IDs. Omit to preserve the set; send an empty array to clear it. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before any job or relationship is saved.
4704
4725
  */
4705
4726
  timekeeping_timecode_ids?: Array<string>;
4706
4727
  /**
4707
- * Whether the feature-allocation selector is shown for this job; null when unset.
4728
+ * Work types (trade or scope categories) to associate with the job, one row each. Null, a non-array, or a row that is not an object answers 422.
4708
4729
  */
4709
- tracks_feature_allocations?: boolean | null;
4730
+ job_work_types_attributes?: Array<{
4731
+ /**
4732
+ * Whether this is the job's primary work type.
4733
+ */
4734
+ primary?: boolean;
4735
+ /**
4736
+ * ID of the work type to associate with the job.
4737
+ */
4738
+ work_type_id?: string;
4739
+ }>;
4710
4740
  /**
4711
- * Whether applicable time entries on this job must carry a feature allocation; null when unset.
4741
+ * The job's structured street address. Null or a non-object answers 422; an unknown key inside it answers 422 at its pointer.
4712
4742
  */
4713
- requires_feature_allocation?: boolean | null;
4743
+ job_address_attributes?: {
4744
+ /**
4745
+ * ID of an existing address to update; null to create a new address.
4746
+ */
4747
+ id?: string | null;
4748
+ /**
4749
+ * Secondary address designator such as an apartment or suite number; null when unset.
4750
+ */
4751
+ sub_address_number?: string | null;
4752
+ /**
4753
+ * Street number of the address; null when unset.
4754
+ */
4755
+ address_number?: string | null;
4756
+ /**
4757
+ * Neighborhood of the address; null when unset.
4758
+ */
4759
+ neighborhood?: string | null;
4760
+ /**
4761
+ * City or municipality of the address; null when unset.
4762
+ */
4763
+ municipality?: string | null;
4764
+ /**
4765
+ * County or other sub-region of the address; null when unset.
4766
+ */
4767
+ sub_region?: string | null;
4768
+ /**
4769
+ * State or region of the address; null when unset.
4770
+ */
4771
+ region?: string | null;
4772
+ /**
4773
+ * Postal or ZIP code of the address; null when unset.
4774
+ */
4775
+ postal_code?: string | null;
4776
+ /**
4777
+ * Country of the address; null when unset.
4778
+ */
4779
+ country?: string | null;
4780
+ /**
4781
+ * Time zone of the address (e.g. US/Central); null when unset. A blank or unlisted name answers 422.
4782
+ */
4783
+ timezone?: string | null;
4784
+ /**
4785
+ * Whether the address has been verified. A boolean; null or any other type returns 422.
4786
+ */
4787
+ verified?: boolean;
4788
+ /**
4789
+ * Human-readable one-line address label; null derives it from the other fields.
4790
+ */
4791
+ label?: string | null;
4792
+ };
4714
4793
  /**
4715
- * Whether time entries on this job are capped at one feature allocation; null when unset.
4794
+ * Values for the job's custom fields, as a list of configurations and their values. Each configuration may appear only once. Every visible configuration gets a stored value; one left out of the list, or an omitted or empty list, stores null.
4716
4795
  */
4717
- max_one_feature_allocation?: boolean | null;
4796
+ custom_fields?: Array<{
4797
+ /**
4798
+ * ID of a visible custom-field configuration owned by the credential company and applicable to jobs.
4799
+ */
4800
+ custom_field_config_id: string;
4801
+ /**
4802
+ * Value as text or null.
4803
+ */
4804
+ value: string | null;
4805
+ }>;
4806
+ /**
4807
+ * Prevailing-wage / apprenticeship (PWA) compliance details to set on the job. Omit or send an empty object to make no PWA-details changes. Null or a non-object answers 422, and so does an unknown key or a wrongly typed field inside it, at its pointer. The accepted regional keys depend on the effective region and regional PWA mode.
4808
+ */
4809
+ pwa_details?: {
4810
+ /**
4811
+ * Role of the company on this job for PWA reporting: one of prime_contractor or sub_contractor; null when unset.
4812
+ */
4813
+ contractor_type?: 'prime_contractor' | 'sub_contractor' | null;
4814
+ /**
4815
+ * Whether new positions on the job default to paying the full fringe as cash. Omit to retain the current value (or use the database default on create); when sent, the value must be JSON true or false.
4816
+ */
4817
+ pay_full_cash_fringe_by_default?: boolean;
4818
+ /**
4819
+ * California DIR (Department of Industrial Relations) awarding-body ID; null when not applicable.
4820
+ */
4821
+ dir_awarding_body_id?: string | null;
4822
+ /**
4823
+ * California DIR project registration ID (an 11-digit number); null when not applicable.
4824
+ */
4825
+ dir_project_id?: string | null;
4826
+ /**
4827
+ * California DIR project name; null when not applicable.
4828
+ */
4829
+ dir_project_name?: string | null;
4830
+ /**
4831
+ * California DIR contract ID; null when not applicable.
4832
+ */
4833
+ dir_contract_id?: string | null;
4834
+ /**
4835
+ * California DIR awarding-body name; null when not applicable.
4836
+ */
4837
+ dir_project_awarding_body_name?: string | null;
4838
+ /**
4839
+ * California DIR project number; null when not applicable.
4840
+ */
4841
+ dir_project_number?: string | null;
4842
+ /**
4843
+ * Illinois DOL (Department of Labor) project ID; null when not applicable.
4844
+ */
4845
+ il_dol_project_id?: string | null;
4846
+ /**
4847
+ * Whether the Illinois project is funded with state capital funds, as JSON true or false; null when not applicable.
4848
+ */
4849
+ il_dol_state_capital_funds?: boolean | null;
4850
+ /**
4851
+ * Illinois DOL public-body name; null when not applicable.
4852
+ */
4853
+ il_dol_public_body_name?: string | null;
4854
+ /**
4855
+ * ID of the Illinois DOL public-body contact; null when not applicable.
4856
+ */
4857
+ il_dol_public_body_contact_id?: string | null;
4858
+ /**
4859
+ * ID of the Illinois DOL public-body address; null when not applicable.
4860
+ */
4861
+ il_dol_public_body_address_id?: string | null;
4862
+ /**
4863
+ * Illinois DOL contract number; null when not applicable.
4864
+ */
4865
+ il_dol_contract_number?: string | null;
4866
+ /**
4867
+ * Illinois SHINES project ID; null when not applicable.
4868
+ */
4869
+ il_shines_project_id?: string | null;
4870
+ /**
4871
+ * New York DOL prevailing-rate-case (PRC) number, a 10-digit identifier; null when not applicable.
4872
+ */
4873
+ ny_dol_prc_number?: string | null;
4874
+ };
4875
+ };
4876
+ /**
4877
+ * 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. Sending `created_by_user_id` returns 400 unknown_key, including when it matches the existing creator or is null. Undeclared body keys return 400, and a null for a field that is not nullable or a wrongly typed value returns 422 at its pointer, before any job or relationship changes.
4878
+ */
4879
+ export type JobUpdateParameters = {
4880
+ /**
4881
+ * Human-readable job name, unique within the creating company; null when unset.
4882
+ */
4883
+ name?: string | null;
4884
+ /**
4885
+ * Free-text description of the job. Null or a wrong type answers 422.
4886
+ */
4887
+ description?: string;
4888
+ /**
4889
+ * ID of the company that requested the job (for example a general contractor). Omit on update to preserve the existing requester. Null, a blank ID, or a wrong type answers 422.
4890
+ */
4891
+ requested_by_company_id?: string;
4892
+ /**
4893
+ * Purchase order number for the job; null when unset.
4894
+ */
4895
+ purchase_order_number?: string | null;
4896
+ /**
4897
+ * ID of the project this job belongs to; null when the job is not part of a project. A blank ID or a wrong type answers 422.
4898
+ */
4899
+ project_id?: string | null;
4900
+ /**
4901
+ * ID of a department belonging to the job's provider company. Retrieve department IDs from GET /api/v1/companies/departments. Send null to clear the assignment; omit on update to preserve it, or on create to preserve a copied template's assignment. A new job without a template starts unassigned. A blank ID or a wrong type answers 422.
4902
+ */
4903
+ companies_department_id?: string | null;
4904
+ /**
4905
+ * Federal prevailing-wage / apprenticeship (PWA) tracking mode: one of all (both prevailing wage and apprenticeship), pw_only, ap_only, or none. Null or any other value returns 422.
4906
+ */
4907
+ federal_pwa_mode?: 'all' | 'pw_only' | 'ap_only' | 'none';
4908
+ /**
4909
+ * Regional (state) prevailing-wage / apprenticeship tracking mode, with the same values as federal_pwa_mode; null or any other value returns 422.
4910
+ */
4911
+ regional_pwa_mode?: 'all' | 'pw_only' | 'ap_only' | 'none';
4912
+ /**
4913
+ * Two-letter state code (e.g. CA, IL, NY) that selects which regional prevailing-wage fields under pwa_details apply.
4914
+ */
4915
+ region?: string | null;
4916
+ /**
4917
+ * Start of the job's scheduled window (ISO 8601); the date is anchored to the start of that day in tz_name. Null to leave the job unscheduled; any other non-string, false included, answers 422.
4918
+ */
4919
+ start_time?: string | null;
4920
+ /**
4921
+ * End of the job's scheduled window (ISO 8601); the date is anchored to the start of that day in tz_name. Null to leave the job unscheduled; any other non-string, false included, answers 422.
4922
+ */
4923
+ end_time?: string | null;
4924
+ /**
4925
+ * Time zone the job's schedule and time tracking are anchored to (e.g. US/Central); defaults to US/Central when unset. Null, a blank or unlisted name, or a wrong type answers 422.
4926
+ */
4927
+ tz_name?: string;
4928
+ /**
4929
+ * Day of the week the job's workweek and time cards start on, as an integer: 0 (Sunday) through 6 (Saturday). Any other value, a numeric string included, answers 422.
4930
+ */
4931
+ time_card_start_day?: number;
4932
+ /**
4933
+ * Clock-in enforcement level: one of none (no guidance), warning (manual time entries fail the clock-in compliance check), or required (a technician's own time on the job must come from clocking in on DSPTCH Mobile; the technician's own web and user-API-key time-entry writes are refused). A time entry whose time code, as of the entry's start time, is PTO, holiday, or restricted to non-job time entries is exempt at every level. Time-entry writes made with a company API key are not gated. While the creating company requires clock-in company-wide, a create stores `required` whatever value is sent, and lowering an open job returns 422 with the error at `#/clock_in_requirement`. Omit the field to leave the current value unchanged.
4934
+ */
4935
+ clock_in_requirement?: 'none' | 'warning' | 'required';
4936
+ /**
4937
+ * Whether to send geofence-based clock-in/out reminders for this job; null when unset.
4938
+ */
4939
+ send_geofence_reminders?: boolean | null;
4940
+ /**
4941
+ * Whether customers granted access can view this job. A boolean; null or any other type returns 422.
4942
+ */
4943
+ allow_customer_access?: boolean;
4944
+ /**
4945
+ * Whether the feature-allocation selector is shown for this job. A boolean; null or any other type returns 422.
4946
+ */
4947
+ tracks_feature_allocations?: boolean;
4948
+ /**
4949
+ * Whether applicable time entries on this job must carry a feature allocation. A boolean; null or any other type returns 422.
4950
+ */
4951
+ requires_feature_allocation?: boolean;
4952
+ /**
4953
+ * Whether time entries on this job are capped at one feature allocation. A boolean; null or any other type returns 422.
4954
+ */
4955
+ max_one_feature_allocation?: boolean;
4718
4956
  /**
4719
4957
  * How this job records production completions: one of none (opts out), feature (per site feature, e.g. a turbine), or quantity (a unit count, e.g. modules). Locked once any completion exists. Omit the field to leave the current value unchanged.
4720
4958
  */
4721
4959
  production_tracking_kind?: 'none' | 'feature' | 'quantity';
4722
4960
  /**
4723
- * Work types (trade or scope categories) to associate with the job; null when none.
4961
+ * Complete desired set of unique nonblank manager user IDs. Omit to preserve the set; send an empty array to clear it. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before any job or relationship is saved.
4962
+ */
4963
+ manager_user_ids?: Array<string>;
4964
+ /**
4965
+ * Complete desired set of unique nonblank timecode IDs. Omit to preserve the set; send an empty array to clear it. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before any job or relationship is saved.
4966
+ */
4967
+ timekeeping_timecode_ids?: Array<string>;
4968
+ /**
4969
+ * Work types (trade or scope categories) to associate with the job, one row each. Null, a non-array, or a row that is not an object answers 422.
4724
4970
  */
4725
4971
  job_work_types_attributes?: Array<{
4726
4972
  /**
@@ -4731,9 +4977,9 @@ export type JobParameters = {
4731
4977
  * ID of the work type to associate with the job.
4732
4978
  */
4733
4979
  work_type_id?: string;
4734
- }> | null;
4980
+ }>;
4735
4981
  /**
4736
- * The job's structured street address; null when unset.
4982
+ * The job's structured street address. Null or a non-object answers 422; an unknown key inside it answers 422 at its pointer.
4737
4983
  */
4738
4984
  job_address_attributes?: {
4739
4985
  /**
@@ -4773,20 +5019,33 @@ export type JobParameters = {
4773
5019
  */
4774
5020
  country?: string | null;
4775
5021
  /**
4776
- * IANA time zone of the address (e.g. America/Chicago); null when unset.
5022
+ * Time zone of the address (e.g. US/Central); null when unset. A blank or unlisted name answers 422.
4777
5023
  */
4778
5024
  timezone?: string | null;
4779
5025
  /**
4780
- * Whether the address has been verified; null when unset.
5026
+ * Whether the address has been verified. A boolean; null or any other type returns 422.
4781
5027
  */
4782
- verified?: boolean | null;
5028
+ verified?: boolean;
4783
5029
  /**
4784
- * Human-readable one-line address label; null when unset.
5030
+ * Human-readable one-line address label; null derives it from the other fields.
4785
5031
  */
4786
5032
  label?: string | null;
4787
- } | null;
5033
+ };
5034
+ /**
5035
+ * Custom-field values to change, as a list of configurations and their replacement values. Each configuration may appear only once. Only the listed configurations change; every other configuration keeps its stored value, and an omitted or empty list changes none.
5036
+ */
5037
+ custom_fields?: Array<{
5038
+ /**
5039
+ * ID of a custom-field configuration owned by the credential company and applicable to jobs. A hidden configuration may be updated only when the job already stores its value.
5040
+ */
5041
+ custom_field_config_id: string;
5042
+ /**
5043
+ * Replacement value as text or null. Null stores a value rather than removing the row.
5044
+ */
5045
+ value: string | null;
5046
+ }>;
4788
5047
  /**
4789
- * Prevailing-wage / apprenticeship (PWA) compliance details to set on the job. Omit or send an empty object to make no PWA-details changes; null and non-object values are rejected. The accepted regional keys depend on the effective region and regional PWA mode.
5048
+ * Prevailing-wage / apprenticeship (PWA) compliance details to set on the job. Omit or send an empty object to make no PWA-details changes. Null or a non-object answers 422, and so does an unknown key or a wrongly typed field inside it, at its pointer. The accepted regional keys depend on the effective region and regional PWA mode.
4790
5049
  */
4791
5050
  pwa_details?: {
4792
5051
  /**
@@ -4794,7 +5053,7 @@ export type JobParameters = {
4794
5053
  */
4795
5054
  contractor_type?: 'prime_contractor' | 'sub_contractor' | null;
4796
5055
  /**
4797
- * Whether new positions on the job default to paying the full fringe as cash. Omit to retain the current value (or use the database default on create); when sent, the value must be true or false.
5056
+ * Whether new positions on the job default to paying the full fringe as cash. Omit to retain the current value (or use the database default on create); when sent, the value must be JSON true or false.
4798
5057
  */
4799
5058
  pay_full_cash_fringe_by_default?: boolean;
4800
5059
  /**
@@ -4826,7 +5085,7 @@ export type JobParameters = {
4826
5085
  */
4827
5086
  il_dol_project_id?: string | null;
4828
5087
  /**
4829
- * Whether the Illinois project is funded with state capital funds; null when not applicable.
5088
+ * Whether the Illinois project is funded with state capital funds, as JSON true or false; null when not applicable.
4830
5089
  */
4831
5090
  il_dol_state_capital_funds?: boolean | null;
4832
5091
  /**
@@ -4854,54 +5113,10 @@ export type JobParameters = {
4854
5113
  */
4855
5114
  ny_dol_prc_number?: string | null;
4856
5115
  };
4857
- };
4858
- /**
4859
- * 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.
4860
- */
4861
- export type JobCreateParameters = JobParameters & {
4862
- /**
4863
- * ID of the user creating the job. Required on create; the creator cannot be changed afterward.
4864
- */
4865
- created_by_user_id: string;
4866
- /**
4867
- * ID of a job template to copy this job from; when set, the new job is created from that template. Null or omit to start from a blank job.
4868
- */
4869
- template_id?: string | null;
4870
5116
  /**
4871
- * Values for the job's custom fields, as a list of configurations and their values. Each configuration may appear only once. Every visible configuration gets a stored value; one left out of the list, or an omitted or empty list, stores null.
4872
- */
4873
- custom_fields?: Array<{
4874
- /**
4875
- * ID of a visible custom-field configuration owned by the credential company and applicable to jobs.
4876
- */
4877
- custom_field_config_id: string;
4878
- /**
4879
- * Value as text or null.
4880
- */
4881
- value: string | null;
4882
- }>;
4883
- };
4884
- /**
4885
- * 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. Sending `created_by_user_id` returns 400 unknown_key, including when it matches the existing creator or is null.
4886
- */
4887
- export type JobUpdateParameters = JobParameters & {
4888
- /**
4889
- * Settable status values. Other statuses are derived from job and position state and cannot be set directly.
5117
+ * Settable status values. Other statuses are derived from job and position state and cannot be set directly; null or any other value returns 422.
4890
5118
  */
4891
5119
  status?: 'completed' | 'cancelled' | 'disputed';
4892
- /**
4893
- * Custom-field values to change, as a list of configurations and their replacement values. Each configuration may appear only once. Only the listed configurations change; every other configuration keeps its stored value, and an omitted or empty list changes none.
4894
- */
4895
- custom_fields?: Array<{
4896
- /**
4897
- * ID of a custom-field configuration owned by the credential company and applicable to jobs. A hidden configuration may be updated only when the job already stores its value.
4898
- */
4899
- custom_field_config_id: string;
4900
- /**
4901
- * Replacement value as text or null. Null stores a value rather than removing the row.
4902
- */
4903
- value: string | null;
4904
- }>;
4905
5120
  };
4906
5121
  /**
4907
5122
  * A reusable job template — a saved job pattern for quickly creating new jobs with the same setup. Read-only through the API (listing only).
@@ -5065,21 +5280,21 @@ export type UserResponseObject = {
5065
5280
  */
5066
5281
  compensation_type: 'hourly' | 'salary' | null;
5067
5282
  /**
5068
- * Base pay rate, formatted as a currency string in the company's currency. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset.
5283
+ * Base hourly pay in cents as a decimal string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset.
5069
5284
  */
5070
- hourly_rate?: string | null;
5285
+ hourly_rate_cents?: string | null;
5071
5286
  /**
5072
- * Annual training-fund contribution for the worker, formatted as a currency string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset. Used in prevailing-wage fringe calculations.
5287
+ * Annual training-fund contribution for the worker in cents as a decimal string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset. Used in prevailing-wage fringe calculations.
5073
5288
  */
5074
- training_annual_amount?: string | null;
5289
+ training_annual_amount_cents?: string | null;
5075
5290
  /**
5076
- * Employer-paid annual combined health benefit, formatted as a currency string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset. Used in prevailing-wage fringe calculations.
5291
+ * Employer-paid annual combined health benefit in cents as a decimal string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset. Used in prevailing-wage fringe calculations.
5077
5292
  */
5078
- employer_combined_health_amount?: string | null;
5293
+ employer_combined_health_amount_cents?: string | null;
5079
5294
  /**
5080
- * Employer-paid annual combined savings and retirement benefit, formatted as a currency string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset. Used in prevailing-wage fringe calculations.
5295
+ * Employer-paid annual combined savings and retirement benefit in cents as a decimal string. Present for company keys, company administrators, and the employed person, and omitted otherwise; null when authorized but unset. Used in prevailing-wage fringe calculations.
5081
5296
  */
5082
- employer_combined_savings?: string | null;
5297
+ employer_combined_savings_cents?: string | null;
5083
5298
  /**
5084
5299
  * Annualized minutes the worker is expected to work, used to annualize fringe benefits. Null to fall back to the standard full-time year.
5085
5300
  */
@@ -5228,15 +5443,15 @@ export type UserResponseObject = {
5228
5443
  */
5229
5444
  export type UserUpdateParameters = {
5230
5445
  /**
5231
- * Work email address.
5446
+ * Work email address. Once verified, changes only through the user's confirmation; sending the current value is accepted.
5232
5447
  */
5233
5448
  email?: string | null;
5234
5449
  /**
5235
- * Personal (non-work) email address.
5450
+ * Personal (non-work) email address. Once verified, changes only through the user's confirmation; sending the current value is accepted.
5236
5451
  */
5237
5452
  personal_email?: string | null;
5238
5453
  /**
5239
- * Contact phone number.
5454
+ * Contact phone number. Once verified, changes only through the user's confirmation; sending the current value is accepted.
5240
5455
  */
5241
5456
  phone_number?: string | null;
5242
5457
  /**
@@ -5276,22 +5491,10 @@ export type UserUpdateParameters = {
5276
5491
  */
5277
5492
  avatar_signed_id?: string | null;
5278
5493
  };
5279
- export type UserParameters = ({
5280
- /**
5281
- * Work email address; the worker signs in and receives their invite here. Null when the worker has none. Required to send an invite unless a phone number is given.
5282
- */
5283
- email: string;
5284
- } | {
5285
- /**
5286
- * Contact phone number. Null when the worker has none. Required to send an invite unless a work email is given.
5287
- */
5288
- phone_number: string;
5289
- } | {
5290
- /**
5291
- * Non-stored field. If true, no invite is created and work email / phone are not required.
5292
- */
5293
- skip_invite: true;
5294
- }) & {
5494
+ /**
5495
+ * Request body for onboarding a worker into your company. In one call it creates the person (if new), their employment record and its custom-field values, roles, group memberships, an optional invite, and optional compliance details. first_name and last_name are required, and omitting either answers 400. Unless skip_invite is true, the invite needs a work email or a phone number, and a request with neither answers 422 at both fields. An unlisted key answers 400. A value of the wrong JSON type, a null for a field that is not nullable, or a value outside a listed set answers 422 at its pointer, and nothing is written.
5496
+ */
5497
+ export type UserParameters = {
5295
5498
  /**
5296
5499
  * Work email address; the worker signs in and receives their invite here. Null when the worker has none. Required to send an invite unless a phone number is given.
5297
5500
  */
@@ -5305,11 +5508,11 @@ export type UserParameters = ({
5305
5508
  */
5306
5509
  phone_number?: string | null;
5307
5510
  /**
5308
- * Legal first name. Used for compliance and other exports.
5511
+ * Legal first name. Used for compliance and other exports. Null or blank text answers 422.
5309
5512
  */
5310
5513
  first_name: string;
5311
5514
  /**
5312
- * Legal last name. Used for compliance and other exports.
5515
+ * Legal last name. Used for compliance and other exports. Null or blank text answers 422.
5313
5516
  */
5314
5517
  last_name: string;
5315
5518
  /**
@@ -5323,116 +5526,115 @@ export type UserParameters = ({
5323
5526
  /**
5324
5527
  * City of the worker's contact address.
5325
5528
  */
5326
- city?: string;
5529
+ city?: string | null;
5327
5530
  /**
5328
5531
  * Two-letter US state code of the worker's contact address.
5329
5532
  */
5330
- state?: string;
5533
+ state?: string | null;
5331
5534
  /**
5332
- * Date of birth (YYYY-MM-DD).
5535
+ * Date of birth as a YYYY-MM-DD calendar date; any other form answers 422.
5333
5536
  */
5334
- birth_date?: string;
5537
+ birth_date?: string | null;
5335
5538
  /**
5336
5539
  * US Department of Labor apprentice number, when the worker is a registered apprentice.
5337
5540
  */
5338
- dol_apprentice_no?: string;
5541
+ dol_apprentice_no?: string | null;
5339
5542
  /**
5340
5543
  * GWO WINDA training record id (Global Wind Organisation), formatted as two letters, six digits, then two letters.
5341
5544
  */
5342
- winda_id?: string;
5545
+ winda_id?: string | null;
5343
5546
  /**
5344
5547
  * URL of the worker's LinkedIn profile.
5345
5548
  */
5346
- linkedin_url?: string;
5549
+ linkedin_url?: string | null;
5347
5550
  /**
5348
- * Roles to grant the worker at your company, as an array of role strings such as TECHNICIAN, FIELD_LEAD, MANAGER, SAFETY_MANAGER, and ADMIN.
5551
+ * Roles to grant the worker at your company, as an array of role strings such as TECHNICIAN, FIELD_LEAD, MANAGER, SAFETY_MANAGER, and ADMIN. Omit or send an empty array to grant none. Null, a non-string, blank or repeated role answers 422.
5349
5552
  */
5350
- roles?: Array<string> | null;
5553
+ roles?: Array<string>;
5351
5554
  /**
5352
5555
  * Signed ID of a direct-upload blob to attach as the profile picture. Obtain it by first uploading the image to POST /api/v1/direct_uploads. Null creates the worker without one; a blank string answers 422.
5353
5556
  */
5354
5557
  avatar_signed_id?: string | null;
5355
5558
  /**
5356
- * Id of the internal user recorded as the creator of the worker's invite, and named to the recipient as the person inviting them. A user key always records its own user and answers 403 if the body names one; a company key must name a user your company can see, or the request answers 404. Ignored when skip_invite is set.
5559
+ * Id of the internal user recorded as the creator of the worker's invite, and named to the recipient as the person inviting them. A user key always records its own user and answers 403 if the body names one; a company key must name a user your company can see, or the request answers 404. Omit or send null to record none; blank text answers 422. Ignored when skip_invite is set.
5357
5560
  */
5358
- created_by_user_id?: string;
5561
+ created_by_user_id?: string | null;
5359
5562
  /**
5360
5563
  * Id of the internal user recorded as having last sent the worker's invite, and named as the sender on that person's in-app notification. Read like created_by_user_id. Null, and ignored, when skip_invite is set.
5361
5564
  */
5362
5565
  last_sent_by_user_id?: string | null;
5363
5566
  /**
5364
- * Non-stored field. If true will not send an invite notification.
5567
+ * Non-stored field. If true, the invite is created without notifying the worker. Null is not accepted.
5365
5568
  */
5366
5569
  skip_notify?: boolean;
5367
5570
  /**
5368
- * Non-stored field. If true, no invite is created and work email / phone are not required.
5571
+ * Non-stored field. If true, no invite is created and work email / phone are not required. Null is not accepted.
5369
5572
  */
5370
5573
  skip_invite?: boolean;
5371
- type?: UserCompanyType;
5372
5574
  /**
5373
- * Job title at your company.
5575
+ * First day of employment (YYYY-MM-DD). Sets the start of the employment record; defaults to today when omitted. Null, blank text, or any other form answers 422.
5374
5576
  */
5375
- title?: string;
5577
+ hire_date?: string;
5376
5578
  /**
5377
- * Id of the worker's manager at your company (another user).
5579
+ * Whether the worker is an `EMPLOYEE` (W-2) or a `CONTRACTOR` (1099), in upper case. Omit to use `EMPLOYEE`; null is not accepted.
5378
5580
  */
5379
- manager_user_id?: string;
5581
+ type?: 'EMPLOYEE' | 'CONTRACTOR';
5380
5582
  /**
5381
- * The worker's identifier in your payroll system of record.
5583
+ * Job title at your company.
5382
5584
  */
5383
- payroll_id?: string;
5585
+ title?: string | null;
5384
5586
  /**
5385
- * Base pay rate as a decimal string (for example "32.50"), in the company's currency.
5587
+ * Id of the worker's manager at your company (another user). Omit or send null for no manager; blank text answers 422.
5386
5588
  */
5387
- hourly_rate?: string;
5589
+ manager_user_id?: string | null;
5388
5590
  /**
5389
- * How the worker is paid: `hourly` or `salary`. Omit to use `hourly`; null is not accepted.
5591
+ * The worker's identifier in your payroll system of record.
5390
5592
  */
5391
- compensation_type?: 'hourly' | 'salary';
5593
+ payroll_id?: string | null;
5392
5594
  /**
5393
- * Whether the worker is eligible for overtime pay.
5595
+ * Whether to enroll the worker in Time and Attendance (time tracking). Omit to use true; null is not accepted.
5394
5596
  */
5395
- overtime_eligible?: string;
5597
+ enrolled_in_t_and_a?: boolean;
5396
5598
  /**
5397
- * Whether to enroll the worker in Time and Attendance (time tracking).
5599
+ * How the worker is paid: `hourly` or `salary`, in lower case. Omit to use `hourly`; null is not accepted.
5398
5600
  */
5399
- enrolled_in_t_and_a?: string;
5601
+ compensation_type?: 'hourly' | 'salary';
5400
5602
  /**
5401
- * Annual training-fund contribution as a decimal string. Used in prevailing-wage fringe calculations.
5603
+ * Base hourly pay in cents as a decimal string (for example "3250" for 32.50). Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422; send the amount as a string.
5402
5604
  */
5403
- training_annual_amount?: string;
5605
+ hourly_rate_cents?: string | null;
5404
5606
  /**
5405
- * Employer-paid annual combined health benefit as a decimal string. Null to leave unset.
5607
+ * Annual training-fund contribution in cents as a decimal string. Used in prevailing-wage fringe calculations. Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422.
5406
5608
  */
5407
- employer_combined_health_amount?: string | null;
5609
+ training_annual_amount_cents?: string | null;
5408
5610
  /**
5409
- * Employer-paid annual combined savings and retirement benefit as a decimal string. Null to leave unset.
5611
+ * Employer-paid annual combined health benefit in cents as a decimal string. Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422.
5410
5612
  */
5411
- employer_combined_savings?: string | null;
5613
+ employer_combined_health_amount_cents?: string | null;
5412
5614
  /**
5413
- * Annualized minutes the worker is expected to work, used to annualize fringe benefits.
5615
+ * Employer-paid annual combined savings and retirement benefit in cents as a decimal string. Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422.
5414
5616
  */
5415
- worked_annual_minutes?: string;
5617
+ employer_combined_savings_cents?: string | null;
5416
5618
  /**
5417
- * Paid time off accrued for the year, in minutes.
5619
+ * Whether the worker is eligible for overtime pay. Omit to use true; null is not accepted.
5418
5620
  */
5419
- pto_annual_minutes?: string;
5621
+ overtime_eligible?: boolean;
5420
5622
  /**
5421
- * Holiday time accrued for the year, in minutes.
5623
+ * Annualized minutes the worker is expected to work, used to annualize fringe benefits, as a whole number.
5422
5624
  */
5423
- holiday_annual_minutes?: string;
5625
+ worked_annual_minutes?: number | null;
5424
5626
  /**
5425
- * Paid training time for the year, in minutes.
5627
+ * Paid time off accrued for the year, in whole minutes.
5426
5628
  */
5427
- training_annual_minutes?: string;
5629
+ pto_annual_minutes?: number | null;
5428
5630
  /**
5429
- * First day of employment (YYYY-MM-DD). Sets the start of the employment record; defaults to today when omitted.
5631
+ * Holiday time accrued for the year, in whole minutes.
5430
5632
  */
5431
- hire_date?: string;
5633
+ holiday_annual_minutes?: number | null;
5432
5634
  /**
5433
- * Unique nonblank IDs of the groups at your company to add the worker to. Omit or send an empty array to add the worker to none. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before the worker is created.
5635
+ * Paid training time for the year, in whole minutes.
5434
5636
  */
5435
- group_ids?: Array<string>;
5637
+ training_annual_minutes?: number | null;
5436
5638
  /**
5437
5639
  * Values for the employment's custom fields, as a list of configurations and their values. Each configuration may appear only once. Every visible configuration gets a stored value; one left out of the list, or an omitted or empty list, stores null.
5438
5640
  */
@@ -5447,7 +5649,11 @@ export type UserParameters = ({
5447
5649
  value: string | null;
5448
5650
  }>;
5449
5651
  /**
5450
- * Prevailing-wage and apprenticeship compliance details to create for the worker (home address, demographics, and jurisdiction-specific reporting fields). Omit when the worker has no compliance record.
5652
+ * Unique nonblank IDs of the groups at your company to add the worker to. Omit or send an empty array to add the worker to none. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before the worker is created.
5653
+ */
5654
+ group_ids?: Array<string>;
5655
+ /**
5656
+ * Prevailing-wage and apprenticeship compliance details to create for the worker (home address, demographics, and jurisdiction-specific reporting fields). Omit it, or send an empty object, when the worker has no compliance record; null answers 422.
5451
5657
  */
5452
5658
  company_user_pwa_info?: {
5453
5659
  /**
@@ -5534,7 +5740,7 @@ export type UserParameters = ({
5534
5740
  * Oregon BOLI race classification, as an array of codes such as white, asian, hispanic_or_latino, and black_or_african_american.
5535
5741
  */
5536
5742
  or_boli_race?: Array<'american_indian_or_alaska_native' | 'asian' | 'hispanic_or_latino' | 'black_or_african_american' | 'native_hawaiian_or_pacific_islander' | 'white' | 'portuguese_or_brazilian'>;
5537
- } | null;
5743
+ };
5538
5744
  };
5539
5745
  /**
5540
5746
  * A page of time entries, with pagination metadata and navigation links.
@@ -5633,11 +5839,11 @@ export type TimeEntryResponseObject = {
5633
5839
  */
5634
5840
  timekeeping_pay_period_id: string;
5635
5841
  /**
5636
- * ISO8601 timestamp when work began; falls on a whole-minute boundary.
5842
+ * ISO8601 timestamp in UTC (`Z`) when work began; falls on a whole-minute boundary.
5637
5843
  */
5638
5844
  start_time: string;
5639
5845
  /**
5640
- * ISO8601 timestamp when work ended; falls on a whole-minute boundary.
5846
+ * ISO8601 timestamp in UTC (`Z`) when work ended; falls on a whole-minute boundary.
5641
5847
  */
5642
5848
  end_time: string;
5643
5849
  /**
@@ -5713,11 +5919,11 @@ export type TimeEntryCreateParameters = {
5713
5919
  */
5714
5920
  timekeeping_time_card_id: string;
5715
5921
  /**
5716
- * Start of the work as a timestamp string, rounded to the nearest second. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5922
+ * Start of the work as a date-time with a UTC offset (`Z` or `-04:00`), rounded to the nearest second. The offset decides the instant, daylight saving included, so either occurrence of a time the clocks repeat when they fall back can be sent (`01:30:00-04:00` or `01:30:00-05:00`). A time without an offset answers 422 invalid_date at its pointer, showing the time fixed with the offset of the time card's pay schedule zone (`tz_name`) and in UTC. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5717
5923
  */
5718
5924
  start_time: string;
5719
5925
  /**
5720
- * End of the work as a timestamp string, rounded to the nearest second. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5926
+ * End of the work as a date-time with a UTC offset (`Z` or `-04:00`), rounded to the nearest second. The offset decides the instant, daylight saving included, so either occurrence of a time the clocks repeat when they fall back can be sent (`01:30:00-04:00` or `01:30:00-05:00`). A time without an offset answers 422 invalid_date at its pointer, showing the time fixed with the offset of the time card's pay schedule zone (`tz_name`) and in UTC. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5721
5927
  */
5722
5928
  end_time: string;
5723
5929
  /**
@@ -5754,11 +5960,11 @@ export type TimeEntryCreateParameters = {
5754
5960
  */
5755
5961
  export type TimeEntryUpdateParameters = {
5756
5962
  /**
5757
- * Start of the work as a timestamp string, rounded to the nearest second. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5963
+ * Start of the work as a date-time with a UTC offset (`Z` or `-04:00`), rounded to the nearest second. The offset decides the instant, daylight saving included, so either occurrence of a time the clocks repeat when they fall back can be sent (`01:30:00-04:00` or `01:30:00-05:00`). A time without an offset answers 422 invalid_date at its pointer, showing the time fixed with the offset of the time card's pay schedule zone (`tz_name`) and in UTC. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5758
5964
  */
5759
5965
  start_time?: string;
5760
5966
  /**
5761
- * End of the work as a timestamp string, rounded to the nearest second. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5967
+ * End of the work as a date-time with a UTC offset (`Z` or `-04:00`), rounded to the nearest second. The offset decides the instant, daylight saving included, so either occurrence of a time the clocks repeat when they fall back can be sent (`01:30:00-04:00` or `01:30:00-05:00`). A time without an offset answers 422 invalid_date at its pointer, showing the time fixed with the offset of the time card's pay schedule zone (`tz_name`) and in UTC. Null or a non-string answers 422 at its pointer; a string that does not parse as a date and time answers 422 invalid_date.
5762
5968
  */
5763
5969
  end_time?: string;
5764
5970
  /**
@@ -5852,6 +6058,12 @@ export type FormDefinitionObject = {
5852
6058
  json: {
5853
6059
  [key: string]: unknown;
5854
6060
  };
6061
+ /**
6062
+ * OpenAPI 3.0 schema for the submission json. Object properties name the answers, and array items describe each row or value. Descriptions document choice values. Unanswered fields may be omitted or set to null.
6063
+ */
6064
+ submission_shape: {
6065
+ [key: string]: unknown;
6066
+ };
5855
6067
  /**
5856
6068
  * When the record was created (ISO 8601).
5857
6069
  */
@@ -5904,6 +6116,10 @@ export type FormSubmissionIndexObject = {
5904
6116
  * 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.
5905
6117
  */
5906
6118
  export type FormSubmissionResponseObject = {
6119
+ /**
6120
+ * Unique identifier.
6121
+ */
6122
+ id: string;
5907
6123
  /**
5908
6124
  * The submitting user.
5909
6125
  */
@@ -6027,25 +6243,25 @@ export type UserCompanyCreateParameters = {
6027
6243
  */
6028
6244
  compensation_type?: 'hourly' | 'salary';
6029
6245
  /**
6030
- * Base pay rate as a decimal string (for example "32.50"), in the company's currency. A JSON number answers 422; send the amount as a string.
6246
+ * Base hourly pay in cents as a decimal string (for example "3250" for 32.50). Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422; send the amount as a string.
6031
6247
  */
6032
- hourly_rate?: string | null;
6248
+ hourly_rate_cents?: string | null;
6033
6249
  /**
6034
- * Whether the worker is eligible for overtime pay. Omit to use true; null is not accepted.
6250
+ * Annual training-fund contribution in cents as a decimal string. Used in prevailing-wage fringe calculations. Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422.
6035
6251
  */
6036
- overtime_eligible?: boolean;
6252
+ training_annual_amount_cents?: string | null;
6037
6253
  /**
6038
- * Annual training-fund contribution as a decimal string. Used in prevailing-wage fringe calculations. A JSON number answers 422.
6254
+ * Employer-paid annual combined health benefit in cents as a decimal string. Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422.
6039
6255
  */
6040
- training_annual_amount?: string | null;
6256
+ employer_combined_health_amount_cents?: string | null;
6041
6257
  /**
6042
- * Employer-paid annual combined health benefit as a decimal string. A JSON number answers 422.
6258
+ * Employer-paid annual combined savings and retirement benefit in cents as a decimal string. Omit or send null to leave it unset; send "0" for zero. A JSON number answers 422.
6043
6259
  */
6044
- employer_combined_health_amount?: string | null;
6260
+ employer_combined_savings_cents?: string | null;
6045
6261
  /**
6046
- * Employer-paid annual combined savings and retirement benefit as a decimal string. A JSON number answers 422.
6262
+ * Whether the worker is eligible for overtime pay. Omit to use true; null is not accepted.
6047
6263
  */
6048
- employer_combined_savings?: string | null;
6264
+ overtime_eligible?: boolean;
6049
6265
  /**
6050
6266
  * Annualized minutes the worker is expected to work, used to annualize fringe benefits.
6051
6267
  */
@@ -6099,29 +6315,29 @@ export type UserCompanyScheduledChangesParameters = {
6099
6315
  */
6100
6316
  effective_date: string;
6101
6317
  /**
6102
- * Base pay rate as a decimal string (for example "32.50"), in the company's currency.
6318
+ * Base hourly pay in cents as a decimal string (for example "3250" for 32.50). Omit to carry forward the preceding version, or send null to clear it; send "0" for zero.
6103
6319
  */
6104
- hourly_rate?: string | null;
6320
+ hourly_rate_cents?: string | null;
6105
6321
  /**
6106
- * How the worker is paid: hourly or salary.
6322
+ * Annual training-fund contribution in cents as a decimal string. Omit to carry forward the preceding version, or send null to clear it; send "0" for zero.
6107
6323
  */
6108
- compensation_type?: 'hourly' | 'salary';
6324
+ training_annual_amount_cents?: string | null;
6109
6325
  /**
6110
- * Whether the worker is eligible for overtime pay.
6326
+ * Employer-paid annual combined health benefit in cents as a decimal string. Omit to carry forward the preceding version, or send null to clear it; send "0" for zero.
6111
6327
  */
6112
- overtime_eligible?: boolean;
6328
+ employer_combined_health_amount_cents?: string | null;
6113
6329
  /**
6114
- * Annual training-fund contribution as a decimal string.
6330
+ * Employer-paid annual combined savings and retirement benefit in cents as a decimal string. Omit to carry forward the preceding version, or send null to clear it; send "0" for zero.
6115
6331
  */
6116
- training_annual_amount?: string | null;
6332
+ employer_combined_savings_cents?: string | null;
6117
6333
  /**
6118
- * Employer-paid annual combined health benefit as a decimal string.
6334
+ * How the worker is paid: hourly or salary.
6119
6335
  */
6120
- employer_combined_health_amount?: string | null;
6336
+ compensation_type?: 'hourly' | 'salary';
6121
6337
  /**
6122
- * Employer-paid annual combined savings and retirement benefit as a decimal string.
6338
+ * Whether the worker is eligible for overtime pay.
6123
6339
  */
6124
- employer_combined_savings?: string | null;
6340
+ overtime_eligible?: boolean;
6125
6341
  /**
6126
6342
  * Annualized minutes the worker is expected to work, used to annualize fringe benefits.
6127
6343
  */
@@ -6501,9 +6717,9 @@ export type UserCompanyScheduledChange = {
6501
6717
  */
6502
6718
  start_date: string;
6503
6719
  /**
6504
- * Base pay rate for this version, formatted as a currency string; null when unset.
6720
+ * Base hourly pay for this version in cents as a decimal string; null when unset.
6505
6721
  */
6506
- hourly_rate: string | null;
6722
+ hourly_rate_cents: string | null;
6507
6723
  /**
6508
6724
  * How the worker is paid: hourly or salary.
6509
6725
  */
@@ -6513,17 +6729,17 @@ export type UserCompanyScheduledChange = {
6513
6729
  */
6514
6730
  overtime_eligible: boolean;
6515
6731
  /**
6516
- * Annual training-fund contribution, formatted as a currency string; null when unset.
6732
+ * Annual training-fund contribution in cents as a decimal string; null when unset.
6517
6733
  */
6518
- training_annual_amount: string | null;
6734
+ training_annual_amount_cents: string | null;
6519
6735
  /**
6520
- * Employer-paid annual combined health benefit, formatted as a currency string; null when unset.
6736
+ * Employer-paid annual combined health benefit in cents as a decimal string; null when unset.
6521
6737
  */
6522
- employer_combined_health_amount: string | null;
6738
+ employer_combined_health_amount_cents: string | null;
6523
6739
  /**
6524
- * Employer-paid annual combined savings and retirement benefit, formatted as a currency string; null when unset.
6740
+ * Employer-paid annual combined savings and retirement benefit in cents as a decimal string; null when unset.
6525
6741
  */
6526
- employer_combined_savings: string | null;
6742
+ employer_combined_savings_cents: string | null;
6527
6743
  /**
6528
6744
  * Annualized minutes the worker is expected to work in this version; null when unset.
6529
6745
  */
@@ -6865,7 +7081,7 @@ export type TimeEntryImportResponseObject = {
6865
7081
  updated_at: string;
6866
7082
  };
6867
7083
  /**
6868
- * Submit a spreadsheet of time entries for a pay period. All seven of payroll_id, start_time, end_time, timecode, job_id, state and description must be present as column headers, or the file is refused naming the ones missing. Of those, payroll_id, start_time, end_time, timecode and state must also carry a value on every row. features, federal_labor_classification and regional_labor_classification are read when present. Header matching ignores case and treats spaces as underscores, and column order does not matter. Any other column is refused: a name this import does not read would be dropped without trace, so the file is rejected naming it rather than applied in part.
7084
+ * Submit a spreadsheet of time entries for a pay period. All six of payroll_id, start_time, end_time, timecode, job_id and description must be present as column headers, or the file is refused naming the ones missing. The payroll_id, start_time, end_time and timecode columns must carry a value on every row. The state column may be omitted, or its cells left blank, when the row's Job resolves a recognized state through its operating region, address, then oldest qualifying Site address. A valid explicit state overrides this fallback; an invalid supplied state fails. Missing or blank state without a Job, unresolved geography, or an unrecognized address region rejects the whole file with row-specific errors. The original file retains omissions and blank values, so background processing resolves current Job geography again. features, federal_labor_classification and regional_labor_classification are read when present. Header matching ignores case and treats spaces as underscores, and column order does not matter. Any other column is refused: a name this import does not read would be dropped without trace, so the file is rejected naming it rather than applied in part.
6869
7085
  *
6870
7086
  * Because acceptance is synchronous but the write happens in the background, only one import at a time is accepted for a pay period: while an earlier one is still `pending` or `processing`, a second answers 409 naming `import_in_progress`, and nothing is written. Poll the earlier import until it reports, then submit again.
6871
7087
  */
@@ -8047,11 +8263,11 @@ export type ProjectResponseObject = {
8047
8263
  /**
8048
8264
  * Project budget as a money amount in cents, serialized as a decimal string (e.g. "500000.0" for a $5,000 budget), or null.
8049
8265
  */
8050
- budget_cents: string | null;
8266
+ budget_cents?: string | null;
8051
8267
  /**
8052
8268
  * ISO 4217 currency code for the budget, or null; defaults to "USD".
8053
8269
  */
8054
- budget_currency: string | null;
8270
+ budget_currency?: string | null;
8055
8271
  /**
8056
8272
  * Schedule start date as an ISO8601 date (YYYY-MM-DD), or null.
8057
8273
  */
@@ -8150,9 +8366,9 @@ export type ProjectParameters = {
8150
8366
  */
8151
8367
  administrator_phone?: string | null;
8152
8368
  /**
8153
- * Decimal string (e.g. "5000.0"), or null to clear it; a JSON number or any other type returns 422. Applies only while `federal_pwa_mode` is not `none` — sending it while federal tracking is off, even as null, returns 422, and switching to `none` clears the stored value.
8369
+ * Budget in cents as a decimal string (e.g. "500000" or the read form "500000.0" for $5,000), or null to clear it; a JSON number or any other type returns 422, and a fraction rounds to two decimal places. Applies only while `federal_pwa_mode` is not `none` — sending it while federal tracking is off, even as null, returns 422, and switching to `none` clears the stored value.
8154
8370
  */
8155
- budget?: string | null;
8371
+ budget_cents?: string | null;
8156
8372
  /**
8157
8373
  * Prevailing-wage lock-in date as an ISO8601 date (YYYY-MM-DD); any other string, a timestamp included, answers 422. Applies only while `federal_pwa_mode` is not `none` — sending it while federal tracking is off, even as null, returns 422, and switching to `none` clears the stored value.
8158
8374
  */
@@ -8239,9 +8455,9 @@ export type ProjectUpdateParameters = {
8239
8455
  */
8240
8456
  administrator_phone?: string | null;
8241
8457
  /**
8242
- * Decimal string (e.g. "5000.0"), or null to clear it; a JSON number or any other type returns 422. Applies only while `federal_pwa_mode` is not `none` — sending it while federal tracking is off, even as null, returns 422, and switching to `none` clears the stored value.
8458
+ * Budget in cents as a decimal string (e.g. "500000" or the read form "500000.0" for $5,000), or null to clear it; a JSON number or any other type returns 422, and a fraction rounds to two decimal places. Applies only while `federal_pwa_mode` is not `none` — sending it while federal tracking is off, even as null, returns 422, and switching to `none` clears the stored value.
8243
8459
  */
8244
- budget?: string | null;
8460
+ budget_cents?: string | null;
8245
8461
  /**
8246
8462
  * Prevailing-wage lock-in date as an ISO8601 date (YYYY-MM-DD); any other string, a timestamp included, answers 422. Applies only while `federal_pwa_mode` is not `none` — sending it while federal tracking is off, even as null, returns 422, and switching to `none` clears the stored value.
8247
8463
  */
@@ -8294,6 +8510,40 @@ export type ProjectSiteUpdateParameters = {
8294
8510
  */
8295
8511
  feature_ids?: Array<string>;
8296
8512
  };
8513
+ /**
8514
+ * A project–user visibility join: names one person on one project. Path `{id}` is this join's id. Not included on project GET.
8515
+ */
8516
+ export type ProjectUserVisibilityResponseObject = {
8517
+ /**
8518
+ * Unique identifier.
8519
+ */
8520
+ id: string;
8521
+ /**
8522
+ * ID of the project this row names a person on. Taken from the path.
8523
+ */
8524
+ project_id: string;
8525
+ /**
8526
+ * ID of the named user. Must hold a manager, safety manager, or field lead role at the project's owner.
8527
+ */
8528
+ user_id: string;
8529
+ /**
8530
+ * When the record was created (ISO 8601).
8531
+ */
8532
+ created_at: string;
8533
+ /**
8534
+ * When the record was last updated (ISO 8601).
8535
+ */
8536
+ updated_at: string;
8537
+ };
8538
+ /**
8539
+ * Request body for naming a person on a project. `user_id` is required. The project is taken from the path and is not part of the body. There is no update body — `user_id` and `project_id` are readonly after create.
8540
+ */
8541
+ export type ProjectUserVisibilityParameters = {
8542
+ /**
8543
+ * ID of a user visible to the API key who holds a manager, safety manager, or field lead role at the project's owner. Duplicate (project, user) pairs are rejected. Omission answers 400; supplied null, a blank ID, or a wrong type answers 422. A user the key cannot see answers 404.
8544
+ */
8545
+ user_id: string;
8546
+ };
8297
8547
  /**
8298
8548
  * A file attached to a project. Uploaded through the direct-upload flow. `name` is always "document" and is not client-writable.
8299
8549
  */
@@ -8441,6 +8691,10 @@ export type SiteCheckInResponseObject = {
8441
8691
  longitude: number | null;
8442
8692
  start_time: string;
8443
8693
  end_time: string | null;
8694
+ /**
8695
+ * Whole minutes between start_time and end_time, rounded to the nearest minute; null while the check-in is still open.
8696
+ */
8697
+ duration_minutes: number | null;
8444
8698
  verified_at: string | null;
8445
8699
  created_at: string;
8446
8700
  updated_at: string;
@@ -8868,7 +9122,7 @@ export type ComplianceCheckParameters = {
8868
9122
  */
8869
9123
  status?: 'dismissed' | 'pending';
8870
9124
  /**
8871
- * When the check is due, as an ISO 8601 date-time; send null to clear it, or omit to leave it unchanged. A value that is not a string answers 422.
9125
+ * The day the check is due, as a calendar date (`YYYY-MM-DD`). It is stored as 00:00 UTC on that day, the same as the web. A value with a time of day is refused with `422`. Send null to clear it, or omit to leave it unchanged.
8872
9126
  */
8873
9127
  time_due?: string | null;
8874
9128
  /**
@@ -8905,6 +9159,8 @@ export type TodoInboxTodoResponseObject = {
8905
9159
  created_by_user_id: string;
8906
9160
  updated_by_user_id: string;
8907
9161
  completed: boolean;
9162
+ priority: 'critical' | 'high' | 'medium' | 'low' | null;
9163
+ category: 'apprenticeship' | 'certified_payroll' | 'company' | 'job' | 'payroll' | 'project' | 'regional' | 'tax_credit' | 'timekeeping' | 'worker';
8908
9164
  task_assignee_user_ids: Array<string>;
8909
9165
  description: RichTextObject;
8910
9166
  time_due: string | null;
@@ -9584,7 +9840,7 @@ export type PaystubLineItemResponseObject = {
9584
9840
  updated_at: string;
9585
9841
  };
9586
9842
  /**
9587
- * Request body for creating a paystub line item. All four fields are required. Undeclared body keys are rejected with 400; references outside the authenticated company return 404.
9843
+ * Request body for creating a paystub line item. All four fields are required. Undeclared body keys or an omitted field answer 400; a null or blank value, or any wrong-typed value, answers 422; references outside the authenticated company return 404.
9588
9844
  */
9589
9845
  export type PaystubLineItemParameters = {
9590
9846
  /**
@@ -9592,7 +9848,7 @@ export type PaystubLineItemParameters = {
9592
9848
  */
9593
9849
  payrolls_paystub_id: string;
9594
9850
  /**
9595
- * Amount of this line, in cents as a decimal string (e.g. "5000.0" is $50.00). Required.
9851
+ * Amount of this line, in cents as a decimal string (e.g. "5000.0" is $50.00); a JSON number answers 422. Required.
9596
9852
  */
9597
9853
  amount_cents: string;
9598
9854
  /**
@@ -9605,7 +9861,7 @@ export type PaystubLineItemParameters = {
9605
9861
  payrolls_external_map_id: string;
9606
9862
  };
9607
9863
  /**
9608
- * Request body for updating a paystub line item. Send only the fields to change. Undeclared body keys are rejected with 400; newly supplied references outside the authenticated company return 404.
9864
+ * Request body for updating a paystub line item. Send only the fields to change. Undeclared body keys are rejected with 400; a null or blank value, or any wrong-typed value, answers 422; newly supplied references outside the authenticated company return 404.
9609
9865
  */
9610
9866
  export type PaystubLineItemUpdateParameters = {
9611
9867
  /**
@@ -9613,7 +9869,7 @@ export type PaystubLineItemUpdateParameters = {
9613
9869
  */
9614
9870
  payrolls_paystub_id?: string;
9615
9871
  /**
9616
- * Amount of this line, in cents as a decimal string (e.g. "5000.0" is $50.00). Omit to leave it unchanged.
9872
+ * Amount of this line, in cents as a decimal string (e.g. "5000.0" is $50.00); a JSON number answers 422. Omit to leave it unchanged.
9617
9873
  */
9618
9874
  amount_cents?: string;
9619
9875
  /**
@@ -9675,6 +9931,137 @@ export type JobSiteUpdateParameters = {
9675
9931
  */
9676
9932
  feature_ids?: Array<string>;
9677
9933
  };
9934
+ /**
9935
+ * A document attached to a job — either an uploaded file or an external URL, never both. Includes PWA documentation when the caller may see it.
9936
+ */
9937
+ export type JobDocumentResponseObject = {
9938
+ /**
9939
+ * Id of the job document.
9940
+ */
9941
+ id: string;
9942
+ /**
9943
+ * Id of the job this document belongs to. Taken from the path on writes.
9944
+ */
9945
+ job_id: string;
9946
+ /**
9947
+ * Human-readable document name.
9948
+ */
9949
+ name: string;
9950
+ /**
9951
+ * Document type code from the DocumentType catalog, including `PWA_DOCUMENTATION`.
9952
+ */
9953
+ type: 'CERTIFICATIONS' | 'CHECKLIST' | 'MAP' | 'MSA' | 'ONSITE_POSTER' | 'OTHER' | 'PARTS_INSTRUCTIONS' | 'PHOTO' | 'PO' | 'PWA_DOCUMENTATION' | 'RESUME' | 'WO';
9954
+ /**
9955
+ * Optional description; null when absent.
9956
+ */
9957
+ description: string | null;
9958
+ /**
9959
+ * True when only callers with job financial access may see the document. PWA documentation is always true.
9960
+ */
9961
+ admin_only: boolean;
9962
+ /**
9963
+ * External link when the document is a URL rather than an uploaded file; null when a file is attached.
9964
+ */
9965
+ url: string | null;
9966
+ /**
9967
+ * The attached file's filename, content type, size, and URL; null when the document is a URL.
9968
+ */
9969
+ file: {
9970
+ /**
9971
+ * Stored name of the uploaded file.
9972
+ */
9973
+ filename: string;
9974
+ /**
9975
+ * MIME type of the file; null when not recorded.
9976
+ */
9977
+ content_type: string | null;
9978
+ /**
9979
+ * Size of the file in bytes.
9980
+ */
9981
+ byte_size: number;
9982
+ /**
9983
+ * A URL to download the file.
9984
+ */
9985
+ url: string;
9986
+ } | null;
9987
+ /**
9988
+ * When the document was created.
9989
+ */
9990
+ created_at: string;
9991
+ /**
9992
+ * When the document was last updated.
9993
+ */
9994
+ updated_at: string;
9995
+ };
9996
+ /**
9997
+ * A page of a job's documents, with pagination metadata and navigation links.
9998
+ */
9999
+ export type JobDocumentsResponseObject = {
10000
+ meta: Meta;
10001
+ links: Links;
10002
+ /**
10003
+ * The page of job documents.
10004
+ */
10005
+ data: Array<JobDocumentResponseObject>;
10006
+ };
10007
+ /**
10008
+ * Request body for creating a job document. The job is taken from the path and is not part of the body. Supply exactly one of `url` or `file`.
10009
+ */
10010
+ export type JobDocumentParameters = {
10011
+ /**
10012
+ * Document type code from the DocumentType catalog. Omission or a blank value answers 422. `PWA_DOCUMENTATION` is persisted as admin-only.
10013
+ */
10014
+ type?: string;
10015
+ /**
10016
+ * Human-readable document name. Omission or a blank value answers 422.
10017
+ */
10018
+ name?: string;
10019
+ /**
10020
+ * Optional description. Null clears it on create to absent.
10021
+ */
10022
+ description?: string | null;
10023
+ /**
10024
+ * A signed_id from POST /api/v1/direct_uploads identifying the uploaded blob to attach. Register the upload naming `jobs.documents` — a signed_id issued for any other resource will not resolve here. Omit when supplying `url`. Null and a blank string answer 422.
10025
+ */
10026
+ file?: string;
10027
+ /**
10028
+ * When true, only callers with job financial access may see the document. Forced true when `type` is `PWA_DOCUMENTATION`.
10029
+ */
10030
+ admin_only?: boolean;
10031
+ /**
10032
+ * External https URL. Omit when supplying `file`. Sending both `url` and `file`, or neither, answers 422.
10033
+ */
10034
+ url?: string | null;
10035
+ };
10036
+ /**
10037
+ * Request body for updating a job document. Every field is optional; omit a field to preserve its current value. The resulting document must still be exactly one of `url` or `file`.
10038
+ */
10039
+ export type JobDocumentUpdateParameters = {
10040
+ /**
10041
+ * Replacement document type code from the DocumentType catalog. `PWA_DOCUMENTATION` is persisted as admin-only.
10042
+ */
10043
+ type?: string;
10044
+ /**
10045
+ * Replacement human-readable document name. A blank value answers 422.
10046
+ */
10047
+ name?: string;
10048
+ /**
10049
+ * Replacement description. Null clears it.
10050
+ */
10051
+ description?: string | null;
10052
+ /**
10053
+ * A signed_id from POST /api/v1/direct_uploads identifying a replacement blob. Register the upload naming `jobs.documents` — a signed_id issued for any other resource will not resolve here. Null removes the attachment; the document must then have a `url`.
10054
+ */
10055
+ file?: string | null;
10056
+ /**
10057
+ * When true, only callers with job financial access may see the document. Forced true when `type` is `PWA_DOCUMENTATION`.
10058
+ */
10059
+ admin_only?: boolean;
10060
+ /**
10061
+ * Replacement external https URL. Null clears it; the document must then have a file.
10062
+ */
10063
+ url?: string | null;
10064
+ };
9678
10065
  /**
9679
10066
  * A good-faith-effort exception on a job — a record that the employer requested apprentices from a registered program and did not receive the full request, or that no qualifying program existed. Read-only. Does not include supporting document slots.
9680
10067
  */
@@ -10497,69 +10884,69 @@ export type PositionsResponseObject = {
10497
10884
  data: Array<PositionResponseObject>;
10498
10885
  };
10499
10886
  /**
10500
- * Request body for creating or updating a position on a job. The job is taken from the URL path.
10887
+ * Request body for creating or updating a position on a job. The job is taken from the URL path. Send only the fields to set; omitted fields keep their stored values. An undeclared key answers 400; a wrong type, null where it is not accepted, or a blank ID answers 422 at the field's pointer.
10501
10888
  */
10502
10889
  export type PositionParameters = {
10503
10890
  /**
10504
- * ID of the worker to assign; cannot be changed once the position has tracked time.
10891
+ * ID of the worker to assign, or null to leave the position unfilled; cannot be changed once the position has tracked time.
10505
10892
  */
10506
10893
  fulfilled_by_user_id?: string | null;
10507
10894
  /**
10508
- * The position's first day, as a calendar date (`YYYY-MM-DD`) in the job's tz_name. Required when the job has a schedule, and must fall within it. A time is refused with `422`. On update, null leaves the stored date unchanged.
10895
+ * The position's first day, as a calendar date (`YYYY-MM-DD`) in the job's tz_name. Required when the job has a schedule, and must fall within it. Omit both dates on create to leave the position unscheduled, and on update to keep the stored days; null, a blank, or a time answers 422.
10509
10896
  */
10510
- start_time?: string | null;
10897
+ start_time?: string;
10511
10898
  /**
10512
- * The position's last day, as a calendar date (`YYYY-MM-DD`) in the job's tz_name. Required when the job has a schedule, and must be on or after start_time and within it. A time is refused with `422`. On update, null leaves the stored date unchanged.
10899
+ * The position's last day, as a calendar date (`YYYY-MM-DD`) in the job's tz_name. Required when the job has a schedule, and must be on or after start_time and within it. Omit both dates on create to leave the position unscheduled, and on update to keep the stored days; null, a blank, or a time answers 422.
10513
10900
  */
10514
- end_time?: string | null;
10901
+ end_time?: string;
10515
10902
  /**
10516
10903
  * ID of the position function (role) to assign; null for none. Must be a global function or one of the job's company.
10517
10904
  */
10518
10905
  position_function_id?: string | null;
10519
10906
  /**
10520
- * ID of the per diem to apply; its rate and currency are copied onto the position. Must belong to the job's company.
10907
+ * ID of the per diem to apply, or null for none; the position takes its rate and currency on every save. Must belong to the job's company.
10521
10908
  */
10522
10909
  per_diem_id?: string | null;
10523
10910
  /**
10524
- * Per-diem amount in cents; the effective rate is derived from the chosen per diem.
10911
+ * ID of a selectable pay-rate rule package scoped to this job, or null to clear it. Omit on create to leave the assignment unset — the job's default is not copied. A package the key cannot see, scoped to another job, or not selectable answers 404. A package with cash-fringe rules on a non-PWA position answers 422.
10525
10912
  */
10526
- per_diem_rate_cents?: number | null;
10913
+ pay_rates_rule_package_id?: string | null;
10527
10914
  /**
10528
10915
  * Whether the position tracks PWA compliance; must be true to attach wage determinations or set the PWA rate fields.
10529
10916
  */
10530
10917
  pwa?: boolean;
10531
10918
  /**
10532
- * Desired hourly cash-fringe rate in cents. Admin only on user-scoped keys.
10919
+ * Desired hourly cash-fringe rate in cents, as a decimal string like the response's. Admin only on user-scoped keys; another user's key sending it answers 403.
10533
10920
  */
10534
- cash_fringe_rate_cents?: number | null;
10921
+ cash_fringe_rate_cents?: string | null;
10535
10922
  /**
10536
- * Desired base hourly rate in cents. Admin only on user-scoped keys.
10923
+ * Desired base hourly rate in cents, as a decimal string like the response's. Admin only on user-scoped keys; another user's key sending it answers 403.
10537
10924
  */
10538
- hourly_rate_cents?: number | null;
10925
+ hourly_rate_cents?: string | null;
10539
10926
  /**
10540
- * Desired PWA wage-pay rate in cents (PWA positions only). Admin only on user-scoped keys.
10927
+ * Desired PWA wage-pay rate in cents, as a decimal string like the response's (PWA positions only). Admin only on user-scoped keys; another user's key sending it answers 403.
10541
10928
  */
10542
- pwa_wage_pay_rate_cents?: number | null;
10929
+ pwa_wage_pay_rate_cents?: string | null;
10543
10930
  /**
10544
- * Desired hourly wage-adder rate in cents. Admin only on user-scoped keys.
10931
+ * Desired hourly wage-adder rate in cents, as a decimal string like the response's. Admin only on user-scoped keys; another user's key sending it answers 403.
10545
10932
  */
10546
- wage_adder_rate_cents?: number | null;
10933
+ wage_adder_rate_cents?: string | null;
10547
10934
  /**
10548
10935
  * The complete desired set of unique nonblank job wage determination IDs. On PATCH, this replaces the current set; omit the field to leave assignments unchanged. Required federal and regional assignments cannot be removed from a PWA position. Null, null members, wrong types, blank IDs, and duplicate IDs answer 422 before any changes are written.
10549
10936
  */
10550
10937
  job_wage_determination_ids?: Array<string>;
10551
10938
  /**
10552
- * PWA classification detail to set; skill_level sets the apprenticeship or skill classification.
10939
+ * The position's PWA classification detail. Sending it replaces the stored detail with one carrying skill_level; omit it to keep the stored detail.
10553
10940
  */
10554
10941
  pwa_details_attributes?: {
10555
10942
  /**
10556
- * The apprenticeship or skill classification to set.
10943
+ * The Illinois skill classification, `journeyman` or `foreman`; null records none. Required whenever pwa_details_attributes is sent.
10557
10944
  */
10558
- skill_level?: string | null;
10945
+ skill_level: 'journeyman' | 'foreman' | null;
10559
10946
  };
10560
10947
  };
10561
10948
  /**
10562
- * Parameters for creating a per-unit scope price on a job. `scope_kind` and `unit_price` are required; omitting either answers 400, and a null or wrong-typed value answers 422.
10949
+ * Parameters for creating a per-unit scope price on a job. `scope_kind` and `unit_price_cents` are required; omitting either answers 400, and a null or wrong-typed value answers 422.
10563
10950
  */
10564
10951
  export type ProductionJobScopePriceParameters = {
10565
10952
  /**
@@ -10567,9 +10954,9 @@ export type ProductionJobScopePriceParameters = {
10567
10954
  */
10568
10955
  scope_kind: string;
10569
10956
  /**
10570
- * Billing rate per unit, as a decimal string in the company's currency. A JSON number answers 422.
10957
+ * Billing rate per unit in cents, as a decimal string (e.g. "120000" or the read form "120000.0" for $1,200.00, or "3.5" for $0.035); a fraction of a cent is kept exactly and bills exactly. A negative value or a JSON number answers 422.
10571
10958
  */
10572
- unit_price: string;
10959
+ unit_price_cents: string;
10573
10960
  /**
10574
10961
  * Contracted number of units expected for this scope on the job, as an integer; null when no target is set.
10575
10962
  */
@@ -10588,9 +10975,9 @@ export type ProductionJobScopePriceUpdateParameters = {
10588
10975
  */
10589
10976
  scope_kind?: string;
10590
10977
  /**
10591
- * Billing rate per unit, as a decimal string in the company's currency. A JSON number answers 422.
10978
+ * Billing rate per unit in cents, as a decimal string (e.g. "120000" or the read form "120000.0" for $1,200.00, or "3.5" for $0.035); a fraction of a cent is kept exactly and bills exactly. A negative value or a JSON number answers 422.
10592
10979
  */
10593
- unit_price?: string;
10980
+ unit_price_cents?: string;
10594
10981
  /**
10595
10982
  * Contracted number of units expected for this scope on the job, as an integer; null when no target is set.
10596
10983
  */
@@ -10621,9 +11008,9 @@ export type ProductionJobScopePriceResponseObject = {
10621
11008
  */
10622
11009
  unit_of_measure: string;
10623
11010
  /**
10624
- * Billing rate per unit, as a decimal string in the company's currency. Present for company keys and for administrators, managers, safety managers, and field leads of the company that owns the job; omitted for other user keys.
11011
+ * Billing rate per unit in cents, as a decimal string (e.g. "120000.0" is $1,200.00 and "3.5" is $0.035); a fraction of a cent is kept exactly. Present for company keys and for administrators, managers, safety managers, and field leads of the company that owns the job; omitted for other user keys.
10625
11012
  */
10626
- unit_price?: string;
11013
+ unit_price_cents?: string;
10627
11014
  /**
10628
11015
  * Contracted number of units expected for this scope on the job; null when no target is set. Present for company keys and for administrators, managers, safety managers, and field leads of the company that owns the job; omitted for other user keys.
10629
11016
  */
@@ -11075,7 +11462,7 @@ export type UserCertificationParameters = {
11075
11462
  */
11076
11463
  certification_id: string;
11077
11464
  /**
11078
- * When the worker earned the certification (ISO 8601). Required.
11465
+ * When the worker earned the certification, as a calendar date (`YYYY-MM-DD`) stored as midnight UTC. A time sent with it is kept, not dropped, and is read as UTC unless it carries an offset (`Z` or `-05:00`). Required.
11079
11466
  */
11080
11467
  received_at: string;
11081
11468
  /**
@@ -11117,7 +11504,7 @@ export type UserCertificationUpdateParameters = {
11117
11504
  */
11118
11505
  certification_id?: string;
11119
11506
  /**
11120
- * When the worker earned the certification (ISO 8601). Omit to preserve the current receipt date.
11507
+ * When the worker earned the certification, as a calendar date (`YYYY-MM-DD`) stored as midnight UTC. A time sent with it is kept, not dropped, and is read as UTC unless it carries an offset (`Z` or `-05:00`). Omit to preserve the current receipt date.
11121
11508
  */
11122
11509
  received_at?: string;
11123
11510
  /**
@@ -13484,11 +13871,11 @@ export type AssetsItemResponseObject = {
13484
13871
  */
13485
13872
  status: 'available' | 'assigned' | null;
13486
13873
  /**
13487
- * When the item was purchased (ISO 8601).
13874
+ * When the item was purchased (ISO 8601); null when not recorded.
13488
13875
  */
13489
13876
  purchase_date: string | null;
13490
13877
  /**
13491
- * Purchase price in cents, in the item's currency.
13878
+ * Purchase price in cents as a decimal string (e.g. "12345.0" is $123.45), in the item's currency.
13492
13879
  */
13493
13880
  purchase_price_cents: string | null;
13494
13881
  /**
@@ -13576,13 +13963,13 @@ export type AssetsItemParameters = {
13576
13963
  */
13577
13964
  status?: 'available' | 'assigned';
13578
13965
  /**
13579
- * When the item was purchased (ISO 8601).
13966
+ * The day the item was purchased, as a calendar date (`YYYY-MM-DD`). It is stored as 00:00 UTC on that day, the same as the web. A value with a time of day is refused with `422`. Send null to clear it.
13580
13967
  */
13581
13968
  purchase_date?: string | null;
13582
13969
  /**
13583
- * Purchase price in cents, in the item's currency.
13970
+ * Purchase price in cents as a decimal string (e.g. "12345.0" is $123.45), in the item's currency.
13584
13971
  */
13585
- purchase_price_cents?: number | null;
13972
+ purchase_price_cents?: string | null;
13586
13973
  /**
13587
13974
  * Identifier for this item in an external system.
13588
13975
  */
@@ -13671,13 +14058,13 @@ export type AssetsItemUpdateParameters = {
13671
14058
  */
13672
14059
  status?: 'available' | 'assigned';
13673
14060
  /**
13674
- * When the item was purchased (ISO 8601).
14061
+ * The day the item was purchased, as a calendar date (`YYYY-MM-DD`). It is stored as 00:00 UTC on that day, the same as the web. A value with a time of day is refused with `422`. Send null to clear it.
13675
14062
  */
13676
14063
  purchase_date?: string | null;
13677
14064
  /**
13678
- * Purchase price in cents, in the item's currency.
14065
+ * Purchase price in cents as a decimal string (e.g. "12345.0" is $123.45), in the item's currency.
13679
14066
  */
13680
- purchase_price_cents?: number | null;
14067
+ purchase_price_cents?: string | null;
13681
14068
  /**
13682
14069
  * Identifier for this item in an external system.
13683
14070
  */
@@ -13904,7 +14291,7 @@ export type AssetsFormAssignmentTriggerResponseObject = {
13904
14291
  */
13905
14292
  time_of_day_due: string;
13906
14293
  /**
13907
- * IDs of the users the generated form is assigned to. Used only when assign_to is custom; cleared for the other modes.
14294
+ * IDs of the users the generated form is assigned to. Used only when assign_to is custom; any other mode stores none.
13908
14295
  */
13909
14296
  assigned_user_ids: Array<string>;
13910
14297
  /**
@@ -13965,7 +14352,7 @@ export type AssetsFormAssignmentTriggerParameters = {
13965
14352
  */
13966
14353
  time_of_day_due: string;
13967
14354
  /**
13968
- * IDs of the users the generated form is assigned to. Used only when assign_to is custom; cleared for the other modes.
14355
+ * IDs of the users the generated form is assigned to. Used only when assign_to is custom; any other mode stores none.
13969
14356
  */
13970
14357
  assigned_user_ids?: Array<string>;
13971
14358
  /**
@@ -14018,7 +14405,7 @@ export type AssetsFormAssignmentTriggerUpdateParameters = {
14018
14405
  */
14019
14406
  time_of_day_due?: string;
14020
14407
  /**
14021
- * IDs of the users the generated form is assigned to. Used only when assign_to is custom; cleared for the other modes.
14408
+ * IDs of the users the generated form is assigned to. Used only when assign_to is custom; any other mode stores none.
14022
14409
  */
14023
14410
  assigned_user_ids?: Array<string>;
14024
14411
  /**
@@ -18035,9 +18422,9 @@ export type DeleteDocumentErrors = {
18035
18422
  export type DeleteDocumentError = DeleteDocumentErrors[keyof DeleteDocumentErrors];
18036
18423
  export type DeleteDocumentResponses = {
18037
18424
  /**
18038
- * Success
18425
+ * No Content
18039
18426
  */
18040
- 200: AssetsDocumentResponseObject;
18427
+ 204: void;
18041
18428
  };
18042
18429
  export type DeleteDocumentResponse = DeleteDocumentResponses[keyof DeleteDocumentResponses];
18043
18430
  export type GetDocumentData = {
@@ -20407,7 +20794,7 @@ export type GetAssessmentResponses = {
20407
20794
  200: CompetencyAssessmentResponseObject;
20408
20795
  };
20409
20796
  export type GetAssessmentResponse = GetAssessmentResponses[keyof GetAssessmentResponses];
20410
- export type ListAssessmentKeyActivitiesData = {
20797
+ export type ListAssessmentCriteriaData = {
20411
20798
  body?: never;
20412
20799
  path: {
20413
20800
  assessment_id: string;
@@ -20416,9 +20803,9 @@ export type ListAssessmentKeyActivitiesData = {
20416
20803
  filter?: string;
20417
20804
  'filter[unexpected]'?: string;
20418
20805
  };
20419
- url: '/api/v1/competencies/assessments/{assessment_id}/key_activities';
20806
+ url: '/api/v1/competencies/assessments/{assessment_id}/criteria';
20420
20807
  };
20421
- export type ListAssessmentKeyActivitiesErrors = {
20808
+ export type ListAssessmentCriteriaErrors = {
20422
20809
  /**
20423
20810
  * Bad Request
20424
20811
  */
@@ -20428,46 +20815,46 @@ export type ListAssessmentKeyActivitiesErrors = {
20428
20815
  */
20429
20816
  403: Problem;
20430
20817
  };
20431
- export type ListAssessmentKeyActivitiesError = ListAssessmentKeyActivitiesErrors[keyof ListAssessmentKeyActivitiesErrors];
20432
- export type ListAssessmentKeyActivitiesResponses = {
20818
+ export type ListAssessmentCriteriaError = ListAssessmentCriteriaErrors[keyof ListAssessmentCriteriaErrors];
20819
+ export type ListAssessmentCriteriaResponses = {
20433
20820
  /**
20434
20821
  * Candidate sees a decided review
20435
20822
  */
20436
20823
  200: {
20437
20824
  meta: Meta;
20438
20825
  links: Links;
20439
- data: Array<CompetencyAssessmentKeyActivityResponseObject>;
20826
+ data: Array<CompetencyAssessmentCriterionResponseObject>;
20440
20827
  };
20441
20828
  };
20442
- export type ListAssessmentKeyActivitiesResponse = ListAssessmentKeyActivitiesResponses[keyof ListAssessmentKeyActivitiesResponses];
20443
- export type GetAssessmentKeyActivityData = {
20829
+ export type ListAssessmentCriteriaResponse = ListAssessmentCriteriaResponses[keyof ListAssessmentCriteriaResponses];
20830
+ export type GetAssessmentCriterionData = {
20444
20831
  body?: never;
20445
20832
  path: {
20446
20833
  assessment_id: string;
20447
20834
  id: string;
20448
20835
  };
20449
20836
  query?: never;
20450
- url: '/api/v1/competencies/assessments/{assessment_id}/key_activities/{id}';
20837
+ url: '/api/v1/competencies/assessments/{assessment_id}/criteria/{id}';
20451
20838
  };
20452
- export type GetAssessmentKeyActivityErrors = {
20839
+ export type GetAssessmentCriterionErrors = {
20453
20840
  /**
20454
20841
  * Forbidden
20455
20842
  */
20456
20843
  403: Problem;
20457
20844
  };
20458
- export type GetAssessmentKeyActivityError = GetAssessmentKeyActivityErrors[keyof GetAssessmentKeyActivityErrors];
20459
- export type GetAssessmentKeyActivityResponses = {
20845
+ export type GetAssessmentCriterionError = GetAssessmentCriterionErrors[keyof GetAssessmentCriterionErrors];
20846
+ export type GetAssessmentCriterionResponses = {
20460
20847
  /**
20461
20848
  * Candidate sees a decided review
20462
20849
  */
20463
- 200: CompetencyAssessmentKeyActivityResponseObject;
20850
+ 200: CompetencyAssessmentCriterionResponseObject;
20464
20851
  };
20465
- export type GetAssessmentKeyActivityResponse = GetAssessmentKeyActivityResponses[keyof GetAssessmentKeyActivityResponses];
20852
+ export type GetAssessmentCriterionResponse = GetAssessmentCriterionResponses[keyof GetAssessmentCriterionResponses];
20466
20853
  export type ListEvidenceItemsData = {
20467
20854
  body?: never;
20468
20855
  path: {
20469
20856
  assessment_id: string;
20470
- key_activity_id: string;
20857
+ criterion_id: string;
20471
20858
  };
20472
20859
  query?: {
20473
20860
  /**
@@ -20477,7 +20864,7 @@ export type ListEvidenceItemsData = {
20477
20864
  filter?: string;
20478
20865
  'filter[unexpected]'?: string;
20479
20866
  };
20480
- url: '/api/v1/competencies/assessments/{assessment_id}/key_activities/{key_activity_id}/evidence_items';
20867
+ url: '/api/v1/competencies/assessments/{assessment_id}/criteria/{criterion_id}/evidence_items';
20481
20868
  };
20482
20869
  export type ListEvidenceItemsErrors = {
20483
20870
  /**
@@ -20505,11 +20892,11 @@ export type GetEvidenceItemData = {
20505
20892
  body?: never;
20506
20893
  path: {
20507
20894
  assessment_id: string;
20508
- key_activity_id: string;
20895
+ criterion_id: string;
20509
20896
  id: string;
20510
20897
  };
20511
20898
  query?: never;
20512
- url: '/api/v1/competencies/assessments/{assessment_id}/key_activities/{key_activity_id}/evidence_items/{id}';
20899
+ url: '/api/v1/competencies/assessments/{assessment_id}/criteria/{criterion_id}/evidence_items/{id}';
20513
20900
  };
20514
20901
  export type GetEvidenceItemErrors = {
20515
20902
  /**
@@ -22581,6 +22968,140 @@ export type UpdateGroupResponses = {
22581
22968
  200: GroupResponseObject;
22582
22969
  };
22583
22970
  export type UpdateGroupResponse = UpdateGroupResponses[keyof UpdateGroupResponses];
22971
+ export type ListJobDocumentsData = {
22972
+ body?: never;
22973
+ path: {
22974
+ job_id: string;
22975
+ };
22976
+ query?: {
22977
+ /**
22978
+ * Returns documents whose type is any of the given DocumentType values. Comma-separate to match multiple (e.g. `PWA_DOCUMENTATION,OTHER`).
22979
+ */
22980
+ 'filter[type]'?: Array<'CERTIFICATIONS' | 'CHECKLIST' | 'MAP' | 'MSA' | 'ONSITE_POSTER' | 'OTHER' | 'PARTS_INSTRUCTIONS' | 'PHOTO' | 'PO' | 'PWA_DOCUMENTATION' | 'RESUME' | 'WO'>;
22981
+ };
22982
+ url: '/api/v1/jobs/{job_id}/documents';
22983
+ };
22984
+ export type ListJobDocumentsErrors = {
22985
+ /**
22986
+ * Forbidden
22987
+ */
22988
+ 403: Problem;
22989
+ /**
22990
+ * Not Found
22991
+ */
22992
+ 404: Problem;
22993
+ };
22994
+ export type ListJobDocumentsError = ListJobDocumentsErrors[keyof ListJobDocumentsErrors];
22995
+ export type ListJobDocumentsResponses = {
22996
+ /**
22997
+ * Success
22998
+ */
22999
+ 200: JobDocumentsResponseObject;
23000
+ };
23001
+ export type ListJobDocumentsResponse = ListJobDocumentsResponses[keyof ListJobDocumentsResponses];
23002
+ export type CreateJobDocumentData = {
23003
+ body: JobDocumentParameters;
23004
+ path: {
23005
+ job_id: string;
23006
+ };
23007
+ query?: never;
23008
+ url: '/api/v1/jobs/{job_id}/documents';
23009
+ };
23010
+ export type CreateJobDocumentErrors = {
23011
+ /**
23012
+ * Forbidden
23013
+ */
23014
+ 403: Problem;
23015
+ /**
23016
+ * Unprocessable Content
23017
+ */
23018
+ 422: Problem;
23019
+ };
23020
+ export type CreateJobDocumentError = CreateJobDocumentErrors[keyof CreateJobDocumentErrors];
23021
+ export type CreateJobDocumentResponses = {
23022
+ /**
23023
+ * Created
23024
+ */
23025
+ 201: JobDocumentResponseObject;
23026
+ };
23027
+ export type CreateJobDocumentResponse = CreateJobDocumentResponses[keyof CreateJobDocumentResponses];
23028
+ export type DeleteJobDocumentData = {
23029
+ body?: never;
23030
+ path: {
23031
+ job_id: string;
23032
+ id: string;
23033
+ };
23034
+ query?: never;
23035
+ url: '/api/v1/jobs/{job_id}/documents/{id}';
23036
+ };
23037
+ export type DeleteJobDocumentErrors = {
23038
+ /**
23039
+ * Forbidden
23040
+ */
23041
+ 403: Problem;
23042
+ };
23043
+ export type DeleteJobDocumentError = DeleteJobDocumentErrors[keyof DeleteJobDocumentErrors];
23044
+ export type DeleteJobDocumentResponses = {
23045
+ /**
23046
+ * No Content
23047
+ */
23048
+ 204: void;
23049
+ };
23050
+ export type DeleteJobDocumentResponse = DeleteJobDocumentResponses[keyof DeleteJobDocumentResponses];
23051
+ export type GetJobDocumentData = {
23052
+ body?: never;
23053
+ path: {
23054
+ job_id: string;
23055
+ id: string;
23056
+ };
23057
+ query?: never;
23058
+ url: '/api/v1/jobs/{job_id}/documents/{id}';
23059
+ };
23060
+ export type GetJobDocumentErrors = {
23061
+ /**
23062
+ * Forbidden
23063
+ */
23064
+ 403: Problem;
23065
+ /**
23066
+ * Not Found
23067
+ */
23068
+ 404: Problem;
23069
+ };
23070
+ export type GetJobDocumentError = GetJobDocumentErrors[keyof GetJobDocumentErrors];
23071
+ export type GetJobDocumentResponses = {
23072
+ /**
23073
+ * Success
23074
+ */
23075
+ 200: JobDocumentResponseObject;
23076
+ };
23077
+ export type GetJobDocumentResponse = GetJobDocumentResponses[keyof GetJobDocumentResponses];
23078
+ export type UpdateJobDocumentData = {
23079
+ body: JobDocumentUpdateParameters;
23080
+ path: {
23081
+ job_id: string;
23082
+ id: string;
23083
+ };
23084
+ query?: never;
23085
+ url: '/api/v1/jobs/{job_id}/documents/{id}';
23086
+ };
23087
+ export type UpdateJobDocumentErrors = {
23088
+ /**
23089
+ * Forbidden
23090
+ */
23091
+ 403: Problem;
23092
+ /**
23093
+ * Not Found
23094
+ */
23095
+ 404: Problem;
23096
+ };
23097
+ export type UpdateJobDocumentError = UpdateJobDocumentErrors[keyof UpdateJobDocumentErrors];
23098
+ export type UpdateJobDocumentResponses = {
23099
+ /**
23100
+ * Success
23101
+ */
23102
+ 200: JobDocumentResponseObject;
23103
+ };
23104
+ export type UpdateJobDocumentResponse = UpdateJobDocumentResponses[keyof UpdateJobDocumentResponses];
22584
23105
  export type ListJobFormAssignmentTasksData = {
22585
23106
  body?: never;
22586
23107
  path: {
@@ -23124,7 +23645,7 @@ export type ListRateRulesData = {
23124
23645
  };
23125
23646
  query?: {
23126
23647
  /**
23127
- * Read the version valid at this point in time. Defaults to now.
23648
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
23128
23649
  */
23129
23650
  'as_of[valid]'?: string;
23130
23651
  as_of?: string;
@@ -23204,7 +23725,7 @@ export type GetRateRuleData = {
23204
23725
  };
23205
23726
  query?: {
23206
23727
  /**
23207
- * Read the version valid at this point in time. Defaults to now.
23728
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
23208
23729
  */
23209
23730
  'as_of[valid]'?: string;
23210
23731
  };
@@ -23717,7 +24238,7 @@ export type ListJobWageDeterminationsData = {
23717
24238
  };
23718
24239
  query?: {
23719
24240
  /**
23720
- * Read the version valid at this point in time. Defaults to now.
24241
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
23721
24242
  */
23722
24243
  'as_of[valid]'?: string;
23723
24244
  as_of?: string;
@@ -23840,7 +24361,7 @@ export type GetJobWageDeterminationData = {
23840
24361
  };
23841
24362
  query?: {
23842
24363
  /**
23843
- * Read the version valid at this point in time. Defaults to now.
24364
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
23844
24365
  */
23845
24366
  'as_of[valid]'?: string;
23846
24367
  };
@@ -24842,7 +25363,7 @@ export type ListOvertimeRulesData = {
24842
25363
  };
24843
25364
  query?: {
24844
25365
  /**
24845
- * Read the version valid at this point in time. Defaults to now.
25366
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
24846
25367
  */
24847
25368
  'as_of[valid]'?: string;
24848
25369
  as_of?: string;
@@ -24973,7 +25494,7 @@ export type GetOvertimeRuleData = {
24973
25494
  };
24974
25495
  query?: {
24975
25496
  /**
24976
- * Read the version valid at this point in time. Defaults to now.
25497
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
24977
25498
  */
24978
25499
  'as_of[valid]'?: string;
24979
25500
  };
@@ -25411,7 +25932,7 @@ export type ListPayRateRulesData = {
25411
25932
  };
25412
25933
  query?: {
25413
25934
  /**
25414
- * Read the version valid at this point in time. Defaults to now.
25935
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
25415
25936
  */
25416
25937
  'as_of[valid]'?: string;
25417
25938
  as_of?: string;
@@ -25548,7 +26069,7 @@ export type GetPayRateRuleData = {
25548
26069
  };
25549
26070
  query?: {
25550
26071
  /**
25551
- * Read the version valid at this point in time. Defaults to now.
26072
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
25552
26073
  */
25553
26074
  'as_of[valid]'?: string;
25554
26075
  };
@@ -26342,7 +26863,7 @@ export type ListExternalMapHistoryData = {
26342
26863
  };
26343
26864
  query?: {
26344
26865
  /**
26345
- * Read the timeline as it was recorded at this moment — the corrections nested under each version stop at the same point, and each version publishes the `transaction_to` it had then, so one corrected since still reads as open. `version_status` is always relative to now. Defaults to now.
26866
+ * Read the timeline as it was recorded at this moment — the corrections nested under each version stop at the same point, and each version publishes the `transaction_to` it had then, so one corrected since still reads as open. `version_status` is always relative to now. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
26346
26867
  */
26347
26868
  'as_of[transaction]'?: string;
26348
26869
  'as_of[valid]'?: string;
@@ -26404,11 +26925,11 @@ export type ListExternalMapsData = {
26404
26925
  'page[limit]'?: number;
26405
26926
  page?: string;
26406
26927
  /**
26407
- * Read the version valid at this point in time. Defaults to now.
26928
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
26408
26929
  */
26409
26930
  'as_of[valid]'?: string;
26410
26931
  /**
26411
- * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now.
26932
+ * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
26412
26933
  */
26413
26934
  'as_of[transaction]'?: string;
26414
26935
  as_of?: string;
@@ -26450,11 +26971,11 @@ export type GetExternalMapData = {
26450
26971
  };
26451
26972
  query?: {
26452
26973
  /**
26453
- * Read the version valid at this point in time. Defaults to now.
26974
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
26454
26975
  */
26455
26976
  'as_of[valid]'?: string;
26456
26977
  /**
26457
- * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now.
26978
+ * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
26458
26979
  */
26459
26980
  'as_of[transaction]'?: string;
26460
26981
  };
@@ -27939,7 +28460,7 @@ export type ListEmploymentsData = {
27939
28460
  filter?: string;
27940
28461
  'filter[unexpected]'?: string;
27941
28462
  /**
27942
- * Read the version valid at this point in time. Defaults to now.
28463
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
27943
28464
  */
27944
28465
  'as_of[valid]'?: string;
27945
28466
  as_of?: string;
@@ -28074,7 +28595,7 @@ export type GetEmploymentData = {
28074
28595
  };
28075
28596
  query?: {
28076
28597
  /**
28077
- * Read the version valid at this point.
28598
+ * Read the version valid at this point. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
28078
28599
  */
28079
28600
  'as_of[valid]'?: string;
28080
28601
  };
@@ -28990,7 +29511,7 @@ export type ListProjectWageDeterminationRateRulesData = {
28990
29511
  };
28991
29512
  query?: {
28992
29513
  /**
28993
- * Read the version valid at this point in time. Defaults to now.
29514
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
28994
29515
  */
28995
29516
  'as_of[valid]'?: string;
28996
29517
  as_of?: string;
@@ -29066,7 +29587,7 @@ export type GetProjectWageDeterminationRateRuleData = {
29066
29587
  };
29067
29588
  query?: {
29068
29589
  /**
29069
- * Read the version valid at this point in time. Defaults to now.
29590
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
29070
29591
  */
29071
29592
  'as_of[valid]'?: string;
29072
29593
  };
@@ -29258,6 +29779,141 @@ export type UpdateProjectSiteResponses = {
29258
29779
  200: ProjectSiteResponseObject;
29259
29780
  };
29260
29781
  export type UpdateProjectSiteResponse = UpdateProjectSiteResponses[keyof UpdateProjectSiteResponses];
29782
+ export type ListUserVisibilitiesData = {
29783
+ body?: never;
29784
+ path: {
29785
+ project_id: string;
29786
+ };
29787
+ query?: {
29788
+ /**
29789
+ * This pagination cursor corresponds to the cursor value found in the response in
29790
+ * `meta.page.next_cursor`.
29791
+ */
29792
+ 'page[cursor]'?: string;
29793
+ /**
29794
+ * Maximum number of records to return per page. Defaults to 20. A value above 100 is capped to 100 rather than rejected; a value that is zero, negative, or not an integer is rejected with a `400`.
29795
+ */
29796
+ 'page[limit]'?: number;
29797
+ page?: string;
29798
+ filter?: string;
29799
+ 'filter[unexpected]'?: string;
29800
+ };
29801
+ url: '/api/v1/projects/{project_id}/user_visibilities';
29802
+ };
29803
+ export type ListUserVisibilitiesErrors = {
29804
+ /**
29805
+ * Bad Request
29806
+ */
29807
+ 400: Problem;
29808
+ /**
29809
+ * Forbidden
29810
+ */
29811
+ 403: Problem;
29812
+ /**
29813
+ * Not Found
29814
+ */
29815
+ 404: Problem;
29816
+ };
29817
+ export type ListUserVisibilitiesError = ListUserVisibilitiesErrors[keyof ListUserVisibilitiesErrors];
29818
+ export type ListUserVisibilitiesResponses = {
29819
+ /**
29820
+ * Success
29821
+ */
29822
+ 200: {
29823
+ meta: Meta;
29824
+ links: Links;
29825
+ data: Array<ProjectUserVisibilityResponseObject>;
29826
+ };
29827
+ };
29828
+ export type ListUserVisibilitiesResponse = ListUserVisibilitiesResponses[keyof ListUserVisibilitiesResponses];
29829
+ export type CreateUserVisibilityData = {
29830
+ body: ProjectUserVisibilityParameters;
29831
+ path: {
29832
+ project_id: string;
29833
+ };
29834
+ query?: never;
29835
+ url: '/api/v1/projects/{project_id}/user_visibilities';
29836
+ };
29837
+ export type CreateUserVisibilityErrors = {
29838
+ /**
29839
+ * Bad Request
29840
+ */
29841
+ 400: Problem;
29842
+ /**
29843
+ * Forbidden
29844
+ */
29845
+ 403: Problem;
29846
+ /**
29847
+ * Not Found
29848
+ */
29849
+ 404: Problem;
29850
+ /**
29851
+ * Unprocessable Content
29852
+ */
29853
+ 422: Problem;
29854
+ };
29855
+ export type CreateUserVisibilityError = CreateUserVisibilityErrors[keyof CreateUserVisibilityErrors];
29856
+ export type CreateUserVisibilityResponses = {
29857
+ /**
29858
+ * Created
29859
+ */
29860
+ 201: ProjectUserVisibilityResponseObject;
29861
+ };
29862
+ export type CreateUserVisibilityResponse = CreateUserVisibilityResponses[keyof CreateUserVisibilityResponses];
29863
+ export type DeleteUserVisibilityData = {
29864
+ body?: never;
29865
+ path: {
29866
+ project_id: string;
29867
+ id: string;
29868
+ };
29869
+ query?: never;
29870
+ url: '/api/v1/projects/{project_id}/user_visibilities/{id}';
29871
+ };
29872
+ export type DeleteUserVisibilityErrors = {
29873
+ /**
29874
+ * Forbidden
29875
+ */
29876
+ 403: Problem;
29877
+ /**
29878
+ * Not Found
29879
+ */
29880
+ 404: Problem;
29881
+ };
29882
+ export type DeleteUserVisibilityError = DeleteUserVisibilityErrors[keyof DeleteUserVisibilityErrors];
29883
+ export type DeleteUserVisibilityResponses = {
29884
+ /**
29885
+ * No Content
29886
+ */
29887
+ 204: void;
29888
+ };
29889
+ export type DeleteUserVisibilityResponse = DeleteUserVisibilityResponses[keyof DeleteUserVisibilityResponses];
29890
+ export type GetUserVisibilityData = {
29891
+ body?: never;
29892
+ path: {
29893
+ project_id: string;
29894
+ id: string;
29895
+ };
29896
+ query?: never;
29897
+ url: '/api/v1/projects/{project_id}/user_visibilities/{id}';
29898
+ };
29899
+ export type GetUserVisibilityErrors = {
29900
+ /**
29901
+ * Forbidden
29902
+ */
29903
+ 403: Problem;
29904
+ /**
29905
+ * Not Found
29906
+ */
29907
+ 404: Problem;
29908
+ };
29909
+ export type GetUserVisibilityError = GetUserVisibilityErrors[keyof GetUserVisibilityErrors];
29910
+ export type GetUserVisibilityResponses = {
29911
+ /**
29912
+ * Success
29913
+ */
29914
+ 200: ProjectUserVisibilityResponseObject;
29915
+ };
29916
+ export type GetUserVisibilityResponse = GetUserVisibilityResponses[keyof GetUserVisibilityResponses];
29261
29917
  export type ShiftProjectWageDeterminationGenesisData = {
29262
29918
  body: ProjectWageDeterminationGenesisParameters;
29263
29919
  headers: {
@@ -29581,7 +30237,7 @@ export type ListProjectWageDeterminationsData = {
29581
30237
  };
29582
30238
  query?: {
29583
30239
  /**
29584
- * Read the version valid at this point in time. Defaults to now.
30240
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
29585
30241
  */
29586
30242
  'as_of[valid]'?: string;
29587
30243
  as_of?: string;
@@ -29704,7 +30360,7 @@ export type GetProjectWageDeterminationData = {
29704
30360
  };
29705
30361
  query?: {
29706
30362
  /**
29707
- * Read the version valid at this point in time. Defaults to now.
30363
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
29708
30364
  */
29709
30365
  'as_of[valid]'?: string;
29710
30366
  };
@@ -31604,7 +32260,7 @@ export type ListTimecodeHistoryData = {
31604
32260
  };
31605
32261
  query?: {
31606
32262
  /**
31607
- * Read the timeline as it was recorded at this moment — the corrections nested under each version stop at the same point, and each version publishes the `transaction_to` it had then, so one corrected since still reads as open. `version_status` is always relative to now. Defaults to now.
32263
+ * Read the timeline as it was recorded at this moment — the corrections nested under each version stop at the same point, and each version publishes the `transaction_to` it had then, so one corrected since still reads as open. `version_status` is always relative to now. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
31608
32264
  */
31609
32265
  'as_of[transaction]'?: string;
31610
32266
  'as_of[valid]'?: string;
@@ -31876,11 +32532,11 @@ export type ListTimecodesData = {
31876
32532
  'page[limit]'?: number;
31877
32533
  page?: string;
31878
32534
  /**
31879
- * Read the version valid at this point in time. Defaults to now.
32535
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
31880
32536
  */
31881
32537
  'as_of[valid]'?: string;
31882
32538
  /**
31883
- * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now.
32539
+ * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
31884
32540
  */
31885
32541
  'as_of[transaction]'?: string;
31886
32542
  as_of?: string;
@@ -31953,11 +32609,11 @@ export type GetTimecodeData = {
31953
32609
  };
31954
32610
  query?: {
31955
32611
  /**
31956
- * Read the version valid at this point in time. Defaults to now.
32612
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
31957
32613
  */
31958
32614
  'as_of[valid]'?: string;
31959
32615
  /**
31960
- * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now.
32616
+ * Read the version as it was recorded at this point in transaction time. Its `transaction_to` is published as of that point, so a version corrected since still reads as open. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
31961
32617
  */
31962
32618
  'as_of[transaction]'?: string;
31963
32619
  };
@@ -32481,7 +33137,7 @@ export type ListPayPeriodConfigsData = {
32481
33137
  'page[limit]'?: number;
32482
33138
  page?: string;
32483
33139
  /**
32484
- * Read the version valid at this point in time. Defaults to now.
33140
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
32485
33141
  */
32486
33142
  'as_of[valid]'?: string;
32487
33143
  as_of?: string;
@@ -32556,7 +33212,7 @@ export type GetPayPeriodConfigData = {
32556
33212
  };
32557
33213
  query?: {
32558
33214
  /**
32559
- * Read the version valid at this point in time. Defaults to now.
33215
+ * Read the version valid at this point in time. Defaults to now. Needs a UTC offset (`2026-03-01T00:00:00Z`); a value without one is a `422`.
32560
33216
  */
32561
33217
  'as_of[valid]'?: string;
32562
33218
  };
@@ -33182,6 +33838,12 @@ export type CreateCompanyResponses = {
33182
33838
  export type CreateCompanyResponse = CreateCompanyResponses[keyof CreateCompanyResponses];
33183
33839
  export type RemoveUserFromCompanyData = {
33184
33840
  body?: never;
33841
+ headers: {
33842
+ /**
33843
+ * Version validator for the whole employment family, or `*` to remove its current state.
33844
+ */
33845
+ 'If-Match': string;
33846
+ };
33185
33847
  path: {
33186
33848
  user_id: string;
33187
33849
  id: string;
@@ -33198,6 +33860,14 @@ export type RemoveUserFromCompanyErrors = {
33198
33860
  * Not Found
33199
33861
  */
33200
33862
  404: Problem;
33863
+ /**
33864
+ * Precondition Failed
33865
+ */
33866
+ 412: Problem;
33867
+ /**
33868
+ * Precondition Required
33869
+ */
33870
+ 428: Problem;
33201
33871
  };
33202
33872
  export type RemoveUserFromCompanyError = RemoveUserFromCompanyErrors[keyof RemoveUserFromCompanyErrors];
33203
33873
  export type RemoveUserFromCompanyResponses = {