@dsptch-work/api-client 0.20.0 → 0.22.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.
@@ -3704,6 +3704,344 @@ export class OvertimeRules {
3704
3704
  });
3705
3705
  }
3706
3706
  }
3707
+ export class PayRateRules {
3708
+ /**
3709
+ * Shift pay rate rule genesis
3710
+ *
3711
+ * Move where the rule family's valid-time timeline begins. Moving genesis earlier
3712
+ * extends the first version; moving it later removes coverage before the new date.
3713
+ * A shift to or past a standing termination is refused because it would leave no
3714
+ * coverage.
3715
+ *
3716
+ * The response echoes the family's new first version and carries the new family
3717
+ * `ETag`; use history to inspect the whole resulting timeline.
3718
+ *
3719
+ * Conditional: send the rule's `ETag` as `If-Match`.
3720
+ *
3721
+ *
3722
+ * **Required scope:**
3723
+ *
3724
+ * `pay.rates.rule_packages.rules.genesis:update`
3725
+ *
3726
+ */
3727
+ static shiftPayRateRuleGenesis(options) {
3728
+ return (options.client ?? client).patch({
3729
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3730
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/genesis',
3731
+ ...options,
3732
+ headers: {
3733
+ 'Content-Type': 'application/json',
3734
+ ...options.headers
3735
+ }
3736
+ });
3737
+ }
3738
+ /**
3739
+ * List pay rate rule version history
3740
+ *
3741
+ * List one rule's complete valid-time sequence, newest window first. Entries
3742
+ * carry the shared family identity as `pay_rates_rule_id`; their temporal
3743
+ * coordinates distinguish versions. Corrections are empty because this rule
3744
+ * engine has no transaction-time audit layer. Both `as_of[valid]` and
3745
+ * `as_of[transaction]` are rejected because this endpoint returns the complete
3746
+ * valid-time timeline and the resource has no transaction-time axis.
3747
+ *
3748
+ *
3749
+ * **Required scope:**
3750
+ *
3751
+ * `pay.rates.rule_packages.rules.history:read`
3752
+ *
3753
+ */
3754
+ static listPayRateRuleHistory(options) {
3755
+ return (options.client ?? client).get({
3756
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3757
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/history',
3758
+ ...options
3759
+ });
3760
+ }
3761
+ /**
3762
+ * Cancel scheduled pay rate rule changes
3763
+ *
3764
+ * Cancel every version after the baseline selected now, preserving that baseline.
3765
+ * The preserved baseline extends through any gap before the first canceled version.
3766
+ * For a wholly future family, the first future version is the baseline.
3767
+ *
3768
+ * Conditional: send the rule's ETag as If-Match.
3769
+ *
3770
+ *
3771
+ * **Required scope:**
3772
+ *
3773
+ * `pay.rates.rule_packages.rules.scheduled_changes:delete`
3774
+ *
3775
+ */
3776
+ static cancelPayRateRuleScheduledChanges(options) {
3777
+ return (options.client ?? client).delete({
3778
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3779
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/scheduled_changes',
3780
+ ...options
3781
+ });
3782
+ }
3783
+ /**
3784
+ * List scheduled pay rate rule changes
3785
+ *
3786
+ * List every version after the baseline selected now, oldest boundary first. This
3787
+ * paginated timeline slice is the exact set a cancellation removes. Entries carry
3788
+ * pay_rates_rule_id, never an entry-level id; a wholly future family's first
3789
+ * version is its preserved baseline.
3790
+ *
3791
+ *
3792
+ * **Required scope:**
3793
+ *
3794
+ * `pay.rates.rule_packages.rules.scheduled_changes:read`
3795
+ *
3796
+ */
3797
+ static listPayRateRuleScheduledChanges(options) {
3798
+ return (options.client ?? client).get({
3799
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3800
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/scheduled_changes',
3801
+ ...options
3802
+ });
3803
+ }
3804
+ /**
3805
+ * Schedule a pay rate rule change
3806
+ *
3807
+ * Apply a rule recipe from a date forward. Omitted recipe halves carry from the
3808
+ * version affected at that date. Returns 201 only when a new segment is added.
3809
+ * A no-op against the targeted segment leaves later scheduled segments unchanged.
3810
+ *
3811
+ * Conditional: send the rule's ETag as If-Match.
3812
+ *
3813
+ *
3814
+ * **Required scope:**
3815
+ *
3816
+ * `pay.rates.rule_packages.rules.scheduled_changes:create`
3817
+ *
3818
+ */
3819
+ static schedulePayRateRuleChange(options) {
3820
+ return (options.client ?? client).post({
3821
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3822
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/scheduled_changes',
3823
+ ...options,
3824
+ headers: {
3825
+ 'Content-Type': 'application/json',
3826
+ ...options.headers
3827
+ }
3828
+ });
3829
+ }
3830
+ /**
3831
+ * Cancel pay rate rule scheduled termination
3832
+ *
3833
+ * Remove the family's standing finite end and restore an open-ended upper bound.
3834
+ * The response echoes the current or otherwise most-relevant version and carries the
3835
+ * new family `ETag`; use history to inspect the whole reopened timeline. Cancellation
3836
+ * reopens the last surviving version with its existing recipe and does not restore
3837
+ * versions removed when the termination was scheduled.
3838
+ *
3839
+ * Conditional: send the rule's `ETag` as `If-Match`.
3840
+ *
3841
+ *
3842
+ * **Required scope:**
3843
+ *
3844
+ * `pay.rates.rule_packages.rules.scheduled_terminations:delete`
3845
+ *
3846
+ */
3847
+ static cancelPayRateRuleScheduledTermination(options) {
3848
+ return (options.client ?? client).delete({
3849
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3850
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/scheduled_termination',
3851
+ ...options
3852
+ });
3853
+ }
3854
+ /**
3855
+ * Schedule pay rate rule termination
3856
+ *
3857
+ * Close the rule family's valid-time timeline at `effective_date`. The rule remains
3858
+ * readable before that date and stops applying from it. Past, current, and future
3859
+ * dates are accepted when they fall after genesis. A family can have one standing
3860
+ * termination; cancel it before scheduling another. Scheduling removes versions
3861
+ * that start after the new end and truncates the version spanning it.
3862
+ *
3863
+ * The response echoes the family's current or otherwise most-relevant version and
3864
+ * carries the new family `ETag`; use history to inspect the whole resulting timeline.
3865
+ *
3866
+ * Conditional: send the rule's `ETag` as `If-Match`.
3867
+ *
3868
+ *
3869
+ * **Required scope:**
3870
+ *
3871
+ * `pay.rates.rule_packages.rules.scheduled_terminations:create`
3872
+ *
3873
+ */
3874
+ static schedulePayRateRuleTermination(options) {
3875
+ return (options.client ?? client).post({
3876
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3877
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{rule_id}/scheduled_termination',
3878
+ ...options,
3879
+ headers: {
3880
+ 'Content-Type': 'application/json',
3881
+ ...options.headers
3882
+ }
3883
+ });
3884
+ }
3885
+ /**
3886
+ * List pay rate rules
3887
+ *
3888
+ * List the versions of this package's rules valid at one point in time. Each
3889
+ * `id` is stable across that rule's valid-time versions.
3890
+ *
3891
+ *
3892
+ * **Required scope:**
3893
+ *
3894
+ * `pay.rates.rule_packages.rules:read`
3895
+ *
3896
+ */
3897
+ static listPayRateRules(options) {
3898
+ return (options.client ?? client).get({
3899
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3900
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules',
3901
+ ...options
3902
+ });
3903
+ }
3904
+ /**
3905
+ * Create a pay rate rule
3906
+ *
3907
+ * **Required scope:**
3908
+ *
3909
+ * `pay.rates.rule_packages.rules:create`
3910
+ *
3911
+ */
3912
+ static createPayRateRule(options) {
3913
+ return (options.client ?? client).post({
3914
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3915
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules',
3916
+ ...options,
3917
+ headers: {
3918
+ 'Content-Type': 'application/json',
3919
+ ...options.headers
3920
+ }
3921
+ });
3922
+ }
3923
+ /**
3924
+ * Delete a pay rate rule
3925
+ *
3926
+ * Remove every valid-time version of the rule family.
3927
+ *
3928
+ * To preserve history while stopping future applicability, schedule a termination instead.
3929
+ *
3930
+ * Conditional: send the rule's `ETag` as `If-Match`.
3931
+ *
3932
+ *
3933
+ * **Required scope:**
3934
+ *
3935
+ * `pay.rates.rule_packages.rules:delete`
3936
+ *
3937
+ */
3938
+ static deletePayRateRule(options) {
3939
+ return (options.client ?? client).delete({
3940
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3941
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{id}',
3942
+ ...options
3943
+ });
3944
+ }
3945
+ /**
3946
+ * Get a pay rate rule
3947
+ *
3948
+ * Fetch the version of one package rule valid at a point in time.
3949
+ *
3950
+ *
3951
+ * **Required scope:**
3952
+ *
3953
+ * `pay.rates.rule_packages.rules:read`
3954
+ *
3955
+ */
3956
+ static getPayRateRule(options) {
3957
+ return (options.client ?? client).get({
3958
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3959
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{id}',
3960
+ ...options
3961
+ });
3962
+ }
3963
+ /**
3964
+ * Update a pay rate rule
3965
+ *
3966
+ * Change a rule from an effective date forward. Omitted effect or conditions
3967
+ * keep that part of the targeted version. When the targeted recipe changes, the
3968
+ * resulting complete recipe applies from that coordinate across later scheduled
3969
+ * versions; an unchanged recipe does not alter later scheduled versions. Omit `effective_from` to
3970
+ * correct the version valid now — or the nearest past/future version when none is
3971
+ * valid now — from its exact existing start. A beginless version requires an
3972
+ * explicit date.
3973
+ *
3974
+ * Conditional: send the rule's `ETag` as `If-Match`.
3975
+ *
3976
+ *
3977
+ * **Required scope:**
3978
+ *
3979
+ * `pay.rates.rule_packages.rules:update`
3980
+ *
3981
+ */
3982
+ static updatePayRateRule(options) {
3983
+ return (options.client ?? client).patch({
3984
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3985
+ url: '/api/v1/pay/rates/rule_packages/{rule_package_id}/rules/{id}',
3986
+ ...options,
3987
+ headers: {
3988
+ 'Content-Type': 'application/json',
3989
+ ...options.headers
3990
+ }
3991
+ });
3992
+ }
3993
+ }
3994
+ export class PayRateRulePackages {
3995
+ /**
3996
+ * List pay rate rule packages
3997
+ *
3998
+ * **Required scope:**
3999
+ *
4000
+ * `pay.rates.rule_packages:read`
4001
+ *
4002
+ */
4003
+ static listPayRateRulePackages(options) {
4004
+ return (options?.client ?? client).get({
4005
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4006
+ url: '/api/v1/pay/rates/rule_packages',
4007
+ ...options
4008
+ });
4009
+ }
4010
+ /**
4011
+ * Create a pay rate rule package
4012
+ *
4013
+ * **Required scope:**
4014
+ *
4015
+ * `pay.rates.rule_packages:create`
4016
+ *
4017
+ */
4018
+ static createPayRateRulePackage(options) {
4019
+ return (options.client ?? client).post({
4020
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4021
+ url: '/api/v1/pay/rates/rule_packages',
4022
+ ...options,
4023
+ headers: {
4024
+ 'Content-Type': 'application/json',
4025
+ ...options.headers
4026
+ }
4027
+ });
4028
+ }
4029
+ /**
4030
+ * Get a pay rate rule package
4031
+ *
4032
+ * **Required scope:**
4033
+ *
4034
+ * `pay.rates.rule_packages:read`
4035
+ *
4036
+ */
4037
+ static getPayRateRulePackage(options) {
4038
+ return (options.client ?? client).get({
4039
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4040
+ url: '/api/v1/pay/rates/rule_packages/{id}',
4041
+ ...options
4042
+ });
4043
+ }
4044
+ }
3707
4045
  export class AggregateTimeImports {
3708
4046
  /**
3709
4047
  * List Aggregate Time Imports
@@ -4362,12 +4700,47 @@ export class Paystubs {
4362
4700
  }
4363
4701
  }
4364
4702
  export class People {
4703
+ /**
4704
+ * Correct employment hire-date boundary
4705
+ *
4706
+ * Correct where one employment stint's valid-time timeline begins.
4707
+ * Moving the date earlier extends the first version; moving it later
4708
+ * removes older versions or coverage before the new date. This is a
4709
+ * valid-time correction and does not preserve removed versions as
4710
+ * bitemporal history.
4711
+ *
4712
+ * Employments with no recorded hire-date boundary cannot use this
4713
+ * endpoint because employment reconciliation requires a finite start.
4714
+ * Read the employment again after a successful correction; the response
4715
+ * carries the family's new `ETag`.
4716
+ *
4717
+ * Conditional: send the employment's `ETag` as `If-Match`.
4718
+ *
4719
+ *
4720
+ * **Required scope:**
4721
+ *
4722
+ * `people.employments.genesis:update`
4723
+ *
4724
+ */
4725
+ static updateGenesis(options) {
4726
+ return (options.client ?? client).patch({
4727
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4728
+ url: '/api/v1/people/employments/{employment_id}/genesis',
4729
+ ...options,
4730
+ headers: {
4731
+ 'Content-Type': 'application/json',
4732
+ ...options.headers
4733
+ }
4734
+ });
4735
+ }
4365
4736
  /**
4366
4737
  * List employment history
4367
4738
  *
4368
4739
  * Every valid-time version of one employment stint, newest first. Each
4369
4740
  * entry uses `people_employment_id` rather than an entry-level id and
4370
- * includes prior recorded corrections.
4741
+ * includes prior recorded corrections. Company managers may read
4742
+ * coworker history, but direct monetary fields are limited to their
4743
+ * own employment in versions and corrections.
4371
4744
  *
4372
4745
  *
4373
4746
  * **Required scope:**
@@ -4386,7 +4759,9 @@ export class People {
4386
4759
  * List employment histories
4387
4760
  *
4388
4761
  * Employment history across all authorized stints in the credential
4389
- * company, including ended stints and rehired employments.
4762
+ * company, including ended stints and rehired employments. Company
4763
+ * managers receive direct monetary fields only for their own
4764
+ * employment in versions and corrections.
4390
4765
  *
4391
4766
  *
4392
4767
  * **Required scope:**
@@ -4401,12 +4776,130 @@ export class People {
4401
4776
  ...options
4402
4777
  });
4403
4778
  }
4779
+ /**
4780
+ * Schedule an employment change
4781
+ *
4782
+ * Create one strictly future employment-version boundary. `effective_date` is
4783
+ * interpreted at midnight in the credential company's time zone. This operation
4784
+ * cannot move or replace an existing boundary.
4785
+ *
4786
+ * Conditional: send the employment's `ETag` as `If-Match`.
4787
+ *
4788
+ *
4789
+ * **Required scope:**
4790
+ *
4791
+ * `people.employments.scheduled_changes:create`
4792
+ *
4793
+ */
4794
+ static createEmploymentScheduledChange(options) {
4795
+ return (options.client ?? client).post({
4796
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4797
+ url: '/api/v1/people/employments/{employment_id}/scheduled_changes',
4798
+ ...options,
4799
+ headers: {
4800
+ 'Content-Type': 'application/json',
4801
+ ...options.headers
4802
+ }
4803
+ });
4804
+ }
4805
+ /**
4806
+ * Cancel one employment change at an exact boundary
4807
+ *
4808
+ * Cancel only the exact strictly future boundary named by the path. Its preceding
4809
+ * version expands across the removed interval; any later boundary remains in place.
4810
+ *
4811
+ * Conditional: send the employment's `ETag` as `If-Match`.
4812
+ *
4813
+ *
4814
+ * **Required scope:**
4815
+ *
4816
+ * `people.employments.scheduled_changes:delete`
4817
+ *
4818
+ */
4819
+ static deleteEmploymentScheduledChange(options) {
4820
+ return (options.client ?? client).delete({
4821
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4822
+ url: '/api/v1/people/employments/{employment_id}/scheduled_changes/{effective_date}',
4823
+ ...options
4824
+ });
4825
+ }
4826
+ /**
4827
+ * Edit an employment change at an exact boundary
4828
+ *
4829
+ * Change values at the exact strictly future boundary named by the path. The
4830
+ * boundary itself never moves; a date inside a version does not identify it.
4831
+ *
4832
+ * Conditional: send the employment's `ETag` as `If-Match`.
4833
+ *
4834
+ *
4835
+ * **Required scope:**
4836
+ *
4837
+ * `people.employments.scheduled_changes:update`
4838
+ *
4839
+ */
4840
+ static updateEmploymentScheduledChange(options) {
4841
+ return (options.client ?? client).patch({
4842
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4843
+ url: '/api/v1/people/employments/{employment_id}/scheduled_changes/{effective_date}',
4844
+ ...options,
4845
+ headers: {
4846
+ 'Content-Type': 'application/json',
4847
+ ...options.headers
4848
+ }
4849
+ });
4850
+ }
4851
+ /**
4852
+ * Cancel a scheduled employment termination
4853
+ *
4854
+ * **Required scope:**
4855
+ *
4856
+ * `people.employments.scheduled_terminations:delete`
4857
+ *
4858
+ */
4859
+ static deleteScheduledTermination(options) {
4860
+ return (options.client ?? client).delete({
4861
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4862
+ url: '/api/v1/people/employments/{employment_id}/scheduled_termination',
4863
+ ...options
4864
+ });
4865
+ }
4866
+ /**
4867
+ * Schedule an employment termination
4868
+ *
4869
+ * Close this employment stint's timeline at `effective_date`. The employment remains
4870
+ * readable in history strictly before that date, but stops applying at company-local
4871
+ * midnight starting that date. This does not delete the employment family; family
4872
+ * deletion is a separate operation.
4873
+ *
4874
+ * A family with a termination already standing returns `409`. To move its end, cancel it
4875
+ * with `DELETE` and then make a new `POST` with the replacement date.
4876
+ * A termination at or before the employment's genesis is refused with `422`.
4877
+ * Conditional: send the employment's `ETag` as `If-Match`.
4878
+ *
4879
+ *
4880
+ * **Required scope:**
4881
+ *
4882
+ * `people.employments.scheduled_terminations:create`
4883
+ *
4884
+ */
4885
+ static createEmploymentScheduledTermination(options) {
4886
+ return (options.client ?? client).post({
4887
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4888
+ url: '/api/v1/people/employments/{employment_id}/scheduled_termination',
4889
+ ...options,
4890
+ headers: {
4891
+ 'Content-Type': 'application/json',
4892
+ ...options.headers
4893
+ }
4894
+ });
4895
+ }
4404
4896
  /**
4405
4897
  * List employments
4406
4898
  *
4407
4899
  * Current employments in the credential company, or versions at
4408
- * `as_of[valid]`. A user key sees its own records unless it is a
4409
- * company administrator.
4900
+ * `as_of[valid]`. Company managers and administrators see every
4901
+ * company employment. Managers receive direct monetary fields only
4902
+ * for their own employment. Other user keys see only their own records.
4410
4903
  *
4411
4904
  *
4412
4905
  * **Required scope:**
@@ -4421,9 +4914,40 @@ export class People {
4421
4914
  ...options
4422
4915
  });
4423
4916
  }
4917
+ /**
4918
+ * Create employment
4919
+ *
4920
+ * Create a new employment stint for an existing user in the
4921
+ * credential company. `hire_date` is interpreted at midnight in
4922
+ * the company time zone. A rehire creates a distinct stint; an
4923
+ * overlapping stint is rejected. This operation creates no user,
4924
+ * invitation, role, group, or login identity.
4925
+ *
4926
+ *
4927
+ * **Required scope:**
4928
+ *
4929
+ * `people.employments:create`
4930
+ *
4931
+ */
4932
+ static createEmployment(options) {
4933
+ return (options.client ?? client).post({
4934
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4935
+ url: '/api/v1/people/employments',
4936
+ ...options,
4937
+ headers: {
4938
+ 'Content-Type': 'application/json',
4939
+ ...options.headers
4940
+ }
4941
+ });
4942
+ }
4424
4943
  /**
4425
4944
  * Get employment
4426
4945
  *
4946
+ * The employment version covering now or `as_of[valid]`. Company
4947
+ * managers may read coworkers, but receive direct monetary fields
4948
+ * only for their own employment.
4949
+ *
4950
+ *
4427
4951
  * **Required scope:**
4428
4952
  *
4429
4953
  * `people.employments:read`
@@ -4719,9 +5243,11 @@ export class Projects {
4719
5243
  *
4720
5244
  * List the company's projects — the top-level containers that organize jobs into
4721
5245
  * federal and regional PWA compliance scopes. Returned oldest first (ordered by
4722
- * creation time, then id) and scoped to the API key's company, so projects owned
4723
- * by other companies are excluded. Narrow with the `filter[...]` query parameters
4724
- * and the `created_at`/`updated_at` time filters; results are paginated.
5246
+ * creation time, then id) and scoped to projects owned by the API key's company,
5247
+ * their descendants, and projects where the company participates. User-scoped
5248
+ * keys also require the user's own project access. Narrow with the `filter[...]`
5249
+ * query parameters and the `created_at`/`updated_at` time filters; results are
5250
+ * paginated.
4725
5251
  *
4726
5252
  *
4727
5253
  * **Required scope:**
@@ -4746,10 +5272,11 @@ export class Projects {
4746
5272
  * prevailing-wage lock-in / beginning-of-construction / placed-in-service dates)
4747
5273
  * and `asset_owner` apply only while `federal_pwa_mode` is not `none`, so sending
4748
5274
  * one of them on a project that tracks no federal PWA — even as null — returns
4749
- * 422. Returns 201 with the created project; a duplicate name within the
4750
- * company, a creator outside the owning company, end_date before start_date, an
4751
- * unknown PWA mode, an unparseable date, or a regional mode without a region each
4752
- * return 422.
5275
+ * 422. `parent_id` may name a project visible to the API key's policy, and
5276
+ * `participating_company_ids` is the complete set of participating companies.
5277
+ * Remove a participant's jobs before removing it from this set. Returns 201
5278
+ * with the project; unknown or inaccessible parent or
5279
+ * company IDs return 404, and invalid attributes or relationships return 422.
4753
5280
  *
4754
5281
  *
4755
5282
  * **Required scope:**
@@ -4771,8 +5298,10 @@ export class Projects {
4771
5298
  /**
4772
5299
  * Show project
4773
5300
  *
4774
- * Fetch a single project by id. Scoped to the API key's company — a project owned
4775
- * by another company, or an unknown id, returns 404.
5301
+ * Fetch a single project by id. A company-scoped key can read its owned projects,
5302
+ * their descendants, and projects where the company participates. User-scoped
5303
+ * keys also require the user's own project access. An unrelated project or an
5304
+ * unknown id returns 404.
4776
5305
  *
4777
5306
  *
4778
5307
  * **Required scope:**
@@ -4796,8 +5325,10 @@ export class Projects {
4796
5325
  * dates) and `asset_owner` apply only while `federal_pwa_mode` is not `none`:
4797
5326
  * switching it to `none` clears the stored values and forces `asset_owner`
4798
5327
  * false, and sending one of them while federal tracking is off — even as null —
4799
- * returns 422. `budget_currency` defaults to USD when blank. A project owned by
4800
- * another company, or an unknown id, returns 404.
5328
+ * returns 422. `budget_currency` defaults to USD when blank. `parent_id` moves
5329
+ * or detaches the project, and `participating_company_ids` replaces the complete
5330
+ * set of participating companies. Remove a participant's jobs before removing
5331
+ * it from this set. Only the owning company may update the project.
4801
5332
  *
4802
5333
  *
4803
5334
  * **Required scope:**