@dsptch-work/api-client 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -291,6 +291,27 @@ export class ApprenticeshipEmployers {
291
291
  ...options
292
292
  });
293
293
  }
294
+ /**
295
+ * Show apprenticeship employer
296
+ *
297
+ * Returns one employer roster row in a program the key's company sponsors
298
+ * or is enrolled in as an employer. The object matches the list, create,
299
+ * and update door. A missing, mismatched, or out-of-scope id reads as
300
+ * not found.
301
+ *
302
+ *
303
+ * **Required scope:**
304
+ *
305
+ * `apprenticeship.programs.employers:read`
306
+ *
307
+ */
308
+ static getEmployer(options) {
309
+ return (options.client ?? client).get({
310
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
311
+ url: '/api/v1/apprenticeship/programs/{program_id}/employers/{id}',
312
+ ...options
313
+ });
314
+ }
294
315
  /**
295
316
  * Update apprenticeship employer
296
317
  *
@@ -440,6 +461,48 @@ export class ApprenticeshipWageSchedulePeriods {
440
461
  }
441
462
  });
442
463
  }
464
+ /**
465
+ * Delete apprenticeship wage schedule period
466
+ *
467
+ * Deletes an unused non-opening period nested under the wage schedule in
468
+ * the path. Period 0 (the entry step) and a period with active apprentices
469
+ * are refused with a `422`. An unused later period returns `204`. Deletes
470
+ * are sponsor-only; an enrolled employer is `403`. A missing, out-of-scope,
471
+ * or mismatched schedule/period pair is `404`.
472
+ *
473
+ *
474
+ * **Required scope:**
475
+ *
476
+ * `apprenticeship.wage_schedules.periods:delete`
477
+ *
478
+ */
479
+ static deletePeriod(options) {
480
+ return (options.client ?? client).delete({
481
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
482
+ url: '/api/v1/apprenticeship/wage_schedules/{wage_schedule_id}/periods/{id}',
483
+ ...options
484
+ });
485
+ }
486
+ /**
487
+ * Show apprenticeship wage schedule period
488
+ *
489
+ * Returns one period nested under the wage schedule in the path. The
490
+ * object matches the list, create, and update door. A missing, out-of-scope,
491
+ * or mismatched schedule/period pair is not found.
492
+ *
493
+ *
494
+ * **Required scope:**
495
+ *
496
+ * `apprenticeship.wage_schedules.periods:read`
497
+ *
498
+ */
499
+ static getPeriod(options) {
500
+ return (options.client ?? client).get({
501
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
502
+ url: '/api/v1/apprenticeship/wage_schedules/{wage_schedule_id}/periods/{id}',
503
+ ...options
504
+ });
505
+ }
443
506
  /**
444
507
  * Update apprenticeship wage schedule period
445
508
  *
@@ -2127,6 +2190,44 @@ export class CertificationPackages {
2127
2190
  }
2128
2191
  }
2129
2192
  export class UserCertifications {
2193
+ /**
2194
+ * Revoke user certification approval
2195
+ *
2196
+ * Revokes the approval on a certification held by a worker.
2197
+ *
2198
+ * **Required scope:**
2199
+ *
2200
+ * `certifications.user_certifications.approvals:delete`
2201
+ *
2202
+ */
2203
+ static revokeUserCertificationApproval(options) {
2204
+ return (options.client ?? client).delete({
2205
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
2206
+ url: '/api/v1/certifications/user_certifications/{user_certification_id}/approval',
2207
+ ...options
2208
+ });
2209
+ }
2210
+ /**
2211
+ * Approve user certification
2212
+ *
2213
+ * Records who approved a certification held by a worker and stamps when. A user key approves in its own user's name; a company key names the approver. The approver must be an admin, manager, or safety manager at a company that employs the holder, and cannot be the holder.
2214
+ *
2215
+ * **Required scope:**
2216
+ *
2217
+ * `certifications.user_certifications.approvals:create`
2218
+ *
2219
+ */
2220
+ static approveUserCertification(options) {
2221
+ return (options.client ?? client).post({
2222
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
2223
+ url: '/api/v1/certifications/user_certifications/{user_certification_id}/approval',
2224
+ ...options,
2225
+ headers: {
2226
+ 'Content-Type': 'application/json',
2227
+ ...options.headers
2228
+ }
2229
+ });
2230
+ }
2130
2231
  /**
2131
2232
  * List user certifications
2132
2233
  *
@@ -2641,6 +2742,21 @@ export class Forms {
2641
2742
  ...options
2642
2743
  });
2643
2744
  }
2745
+ /**
2746
+ * Show form definition
2747
+ *
2748
+ * **Required scope:**
2749
+ *
2750
+ * `form_definitions:read`
2751
+ *
2752
+ */
2753
+ static getFormDefinition(options) {
2754
+ return (options.client ?? client).get({
2755
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
2756
+ url: '/api/v1/form_definitions/{id}',
2757
+ ...options
2758
+ });
2759
+ }
2644
2760
  /**
2645
2761
  * List form submission versions
2646
2762
  *
@@ -2865,6 +2981,14 @@ export class ProductionJobScopePrices {
2865
2981
  /**
2866
2982
  * List production job scope prices
2867
2983
  *
2984
+ * Scope prices on a production-tracked job. Company keys,
2985
+ * and user keys held by an administrator, manager, safety
2986
+ * manager, or field lead of the company that owns the job,
2987
+ * receive `unit_price` and `contracted_count`. Other user
2988
+ * keys, held by crew on the job, receive the same rows
2989
+ * without those two fields.
2990
+ *
2991
+ *
2868
2992
  * **Required scope:**
2869
2993
  *
2870
2994
  * `jobs.production.job_scope_prices:read`
@@ -2914,6 +3038,14 @@ export class ProductionJobScopePrices {
2914
3038
  /**
2915
3039
  * Show production job scope price
2916
3040
  *
3041
+ * One scope price on a production-tracked job. Company keys,
3042
+ * and user keys held by an administrator, manager, safety
3043
+ * manager, or field lead of the company that owns the job,
3044
+ * receive `unit_price` and `contracted_count`. Other user
3045
+ * keys, held by crew on the job, receive the price without
3046
+ * those two fields.
3047
+ *
3048
+ *
2917
3049
  * **Required scope:**
2918
3050
  *
2919
3051
  * `jobs.production.job_scope_prices:read`
@@ -3179,35 +3311,44 @@ export class JobWageDeterminationRateRules {
3179
3311
  });
3180
3312
  }
3181
3313
  }
3182
- export class JobWageDeterminations {
3314
+ export class Jobs {
3183
3315
  /**
3184
- * Shift job wage determination genesis
3316
+ * List sites for job
3185
3317
  *
3186
- * Move when a determination's timeline begins. Shifting it earlier extends
3187
- * the first version back; shifting it later drops the coverage before it,
3188
- * and what that removes stops being readable through `as_of[valid]` and
3189
- * `/history`.
3318
+ * Returns the job-site join rows on the named job. `{id}` is the
3319
+ * join row, not the Site. A missing or out-of-scope job reads as
3320
+ * not found.
3190
3321
  *
3191
- * This changes *when* the determination existed rather than what it said —
3192
- * no version's attributes are rewritten. Moving the other end of the timeline
3193
- * is `scheduled_termination`, and changing a version's values is the
3194
- * determination update.
3195
3322
  *
3196
- * A shift to or past a scheduled termination is refused with `422`, since it
3197
- * would leave no coverage at all.
3323
+ * **Required scope:**
3198
3324
  *
3199
- * Conditional: send the determination's `ETag` as `If-Match`.
3325
+ * `jobs.sites:read`
3326
+ *
3327
+ */
3328
+ static listJobSites(options) {
3329
+ return (options.client ?? client).get({
3330
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3331
+ url: '/api/v1/jobs/{job_id}/sites',
3332
+ ...options
3333
+ });
3334
+ }
3335
+ /**
3336
+ * Create site for job
3337
+ *
3338
+ * Attaches a Site to the named job. `job_id` is the path only.
3339
+ * `site_id` is required; `feature_ids` is optional and replaced
3340
+ * as a set. Duplicate (job, site) pairs are rejected.
3200
3341
  *
3201
3342
  *
3202
3343
  * **Required scope:**
3203
3344
  *
3204
- * `jobs.wage_determinations.genesis:update`
3345
+ * `jobs.sites:create`
3205
3346
  *
3206
3347
  */
3207
- static shiftJobWageDeterminationGenesis(options) {
3208
- return (options.client ?? client).patch({
3348
+ static createJobSite(options) {
3349
+ return (options.client ?? client).post({
3209
3350
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3210
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/genesis',
3351
+ url: '/api/v1/jobs/{job_id}/sites',
3211
3352
  ...options,
3212
3353
  headers: {
3213
3354
  'Content-Type': 'application/json',
@@ -3216,76 +3357,94 @@ export class JobWageDeterminations {
3216
3357
  });
3217
3358
  }
3218
3359
  /**
3219
- * List job wage determination version history
3360
+ * Delete site on job
3220
3361
  *
3221
- * A determination's whole valid-time sequence, newest window first and
3222
- * cursor-paginated. Each entry is a full determination carrying its own
3223
- * `valid_from` / `valid_to` window, a `version_status` of `scheduled`,
3224
- * `current` or `historical`, and the `corrections` that version replaced —
3225
- * each itself a full determination as previously recorded, so a client
3226
- * that wants a field-level diff compares two of them. An entry carries
3227
- * the family key as `job_wage_determination_id` and no `id` or `uid` of
3228
- * its own — every version shares the family key, so versions are told
3229
- * apart by their window coordinates. `as_of[valid]` is
3230
- * rejected, since pinning a point on the valid axis would collapse the
3231
- * sequence this endpoint returns, and a determination records no
3232
- * transaction axis to read `as_of[transaction]` against.
3362
+ * Removes the job-site join. The Site itself is not deleted.
3363
+ * Job-site features cascade with the join. A job may have zero
3364
+ * sites afterward.
3233
3365
  *
3234
3366
  *
3235
3367
  * **Required scope:**
3236
3368
  *
3237
- * `jobs.wage_determinations.history:read`
3369
+ * `jobs.sites:delete`
3238
3370
  *
3239
3371
  */
3240
- static listJobWageDeterminationHistory(options) {
3241
- return (options.client ?? client).get({
3372
+ static deleteJobSite(options) {
3373
+ return (options.client ?? client).delete({
3242
3374
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3243
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/history',
3375
+ url: '/api/v1/jobs/{job_id}/sites/{id}',
3244
3376
  ...options
3245
3377
  });
3246
3378
  }
3247
3379
  /**
3248
- * Cancel scheduled changes on job wage determination
3380
+ * Show site on job
3381
+ *
3382
+ * Returns one job-site join on the named job. `{id}` is the join
3383
+ * row. A missing, misnested, or out-of-scope id reads as not found.
3384
+ *
3249
3385
  *
3250
3386
  * **Required scope:**
3251
3387
  *
3252
- * `jobs.wage_determinations.scheduled_changes:delete`
3388
+ * `jobs.sites:read`
3253
3389
  *
3254
3390
  */
3255
- static cancelJobWageDeterminationScheduledChanges(options) {
3256
- return (options.client ?? client).delete({
3391
+ static getJobSite(options) {
3392
+ return (options.client ?? client).get({
3257
3393
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3258
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_changes',
3394
+ url: '/api/v1/jobs/{job_id}/sites/{id}',
3259
3395
  ...options
3260
3396
  });
3261
3397
  }
3262
3398
  /**
3263
- * List scheduled changes for job wage determination
3399
+ * Update site on job
3400
+ *
3401
+ * Replaces `feature_ids` on an existing job-site join. `site_id`
3402
+ * cannot be changed. An empty array clears every feature.
3403
+ *
3264
3404
  *
3265
3405
  * **Required scope:**
3266
3406
  *
3267
- * `jobs.wage_determinations.scheduled_changes:read`
3407
+ * `jobs.sites:update`
3268
3408
  *
3269
3409
  */
3270
- static listJobWageDeterminationScheduledChanges(options) {
3271
- return (options.client ?? client).get({
3410
+ static updateJobSite(options) {
3411
+ return (options.client ?? client).patch({
3272
3412
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3273
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_changes',
3413
+ url: '/api/v1/jobs/{job_id}/sites/{id}',
3414
+ ...options,
3415
+ headers: {
3416
+ 'Content-Type': 'application/json',
3417
+ ...options.headers
3418
+ }
3419
+ });
3420
+ }
3421
+ /**
3422
+ * List jobs
3423
+ *
3424
+ * **Required scope:**
3425
+ *
3426
+ * `jobs:read`
3427
+ *
3428
+ */
3429
+ static listJobs(options) {
3430
+ return (options?.client ?? client).get({
3431
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3432
+ url: '/api/v1/jobs',
3274
3433
  ...options
3275
3434
  });
3276
3435
  }
3277
3436
  /**
3278
- * Schedule effective-dated change on job wage determination
3437
+ * Create job
3279
3438
  *
3280
3439
  * **Required scope:**
3281
3440
  *
3282
- * `jobs.wage_determinations.scheduled_changes:create`
3441
+ * `jobs:create`
3283
3442
  *
3284
3443
  */
3285
- static scheduleJobWageDeterminationChange(options) {
3444
+ static createJob(options) {
3286
3445
  return (options.client ?? client).post({
3287
3446
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3288
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_changes',
3447
+ url: '/api/v1/jobs',
3289
3448
  ...options,
3290
3449
  headers: {
3291
3450
  'Content-Type': 'application/json',
@@ -3294,43 +3453,32 @@ export class JobWageDeterminations {
3294
3453
  });
3295
3454
  }
3296
3455
  /**
3297
- * Cancel scheduled termination on job wage determination
3456
+ * Show job
3298
3457
  *
3299
3458
  * **Required scope:**
3300
3459
  *
3301
- * `jobs.wage_determinations.scheduled_terminations:delete`
3460
+ * `jobs:read`
3302
3461
  *
3303
3462
  */
3304
- static cancelJobWageDeterminationScheduledTermination(options) {
3305
- return (options.client ?? client).delete({
3463
+ static getJob(options) {
3464
+ return (options.client ?? client).get({
3306
3465
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3307
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_termination',
3466
+ url: '/api/v1/jobs/{id}',
3308
3467
  ...options
3309
3468
  });
3310
3469
  }
3311
3470
  /**
3312
- * Schedule termination on job wage determination
3313
- *
3314
- * End a determination's valid coverage at `effective_date`: segments beyond
3315
- * it are dropped and one spanning it is truncated, so the determination stops
3316
- * being valid from that point on. Earlier versions are untouched and stay
3317
- * readable through `as_of[valid]` and `/history`.
3318
- *
3319
- * Moving an end is cancel-then-schedule: cancel the standing termination,
3320
- * then schedule the one you want.
3321
- *
3322
- * Conditional: send the determination's `ETag` as `If-Match`.
3323
- *
3471
+ * Update job
3324
3472
  *
3325
3473
  * **Required scope:**
3326
3474
  *
3327
- * `jobs.wage_determinations.scheduled_terminations:create`
3475
+ * `jobs:update`
3328
3476
  *
3329
3477
  */
3330
- static scheduleJobWageDeterminationTermination(options) {
3331
- return (options.client ?? client).post({
3478
+ static updateJob(options) {
3479
+ return (options.client ?? client).patch({
3332
3480
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3333
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_termination',
3481
+ url: '/api/v1/jobs/{id}',
3334
3482
  ...options,
3335
3483
  headers: {
3336
3484
  'Content-Type': 'application/json',
@@ -3339,32 +3487,36 @@ export class JobWageDeterminations {
3339
3487
  });
3340
3488
  }
3341
3489
  /**
3342
- * List job wage determinations
3490
+ * List positions for job
3343
3491
  *
3344
3492
  * **Required scope:**
3345
3493
  *
3346
- * `jobs.wage_determinations:read`
3494
+ * `jobs.positions:read`
3347
3495
  *
3348
3496
  */
3349
- static listJobWageDeterminations(options) {
3497
+ static listPositions(options) {
3350
3498
  return (options.client ?? client).get({
3351
3499
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3352
- url: '/api/v1/jobs/{job_id}/wage_determinations',
3500
+ url: '/api/v1/jobs/{job_id}/positions',
3353
3501
  ...options
3354
3502
  });
3355
3503
  }
3356
3504
  /**
3357
- * Create job wage determination
3505
+ * Create position for job
3506
+ *
3507
+ * cash_fringe_rate_cents, hourly_rate_cents, pwa_wage_pay_rate_cents and
3508
+ * wage_adder_rate_cents are admin only on user-scoped keys.
3509
+ *
3358
3510
  *
3359
3511
  * **Required scope:**
3360
3512
  *
3361
- * `jobs.wage_determinations:create`
3513
+ * `jobs.positions:create`
3362
3514
  *
3363
3515
  */
3364
- static createWageDetermination(options) {
3516
+ static createPosition(options) {
3365
3517
  return (options.client ?? client).post({
3366
3518
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3367
- url: '/api/v1/jobs/{job_id}/wage_determinations',
3519
+ url: '/api/v1/jobs/{job_id}/positions',
3368
3520
  ...options,
3369
3521
  headers: {
3370
3522
  'Content-Type': 'application/json',
@@ -3373,64 +3525,62 @@ export class JobWageDeterminations {
3373
3525
  });
3374
3526
  }
3375
3527
  /**
3376
- * Delete job wage determination
3528
+ * Delete position on job
3529
+ *
3530
+ * Deletes a position that has no logged work and no restricting
3531
+ * associations. A position still referenced by time entries,
3532
+ * time-card per diems, completion positions, or aggregate logged
3533
+ * work is refused with a `422`. An unused position returns `204`
3534
+ * and is gone from a later GET.
3535
+ *
3377
3536
  *
3378
3537
  * **Required scope:**
3379
3538
  *
3380
- * `jobs.wage_determinations:delete`
3539
+ * `jobs.positions:delete`
3381
3540
  *
3382
3541
  */
3383
- static deleteWageDetermination(options) {
3542
+ static deletePosition(options) {
3384
3543
  return (options.client ?? client).delete({
3385
3544
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3386
- url: '/api/v1/jobs/{job_id}/wage_determinations/{id}',
3545
+ url: '/api/v1/jobs/{job_id}/positions/{id}',
3387
3546
  ...options
3388
3547
  });
3389
3548
  }
3390
3549
  /**
3391
- * Show job wage determination
3550
+ * Show position on job
3551
+ *
3552
+ * Returns one position on the named job. A missing, misnested, or
3553
+ * out-of-scope id reads as not found.
3554
+ *
3392
3555
  *
3393
3556
  * **Required scope:**
3394
3557
  *
3395
- * `jobs.wage_determinations:read`
3558
+ * `jobs.positions:read`
3396
3559
  *
3397
3560
  */
3398
- static getJobWageDetermination(options) {
3561
+ static getPosition(options) {
3399
3562
  return (options.client ?? client).get({
3400
3563
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3401
- url: '/api/v1/jobs/{job_id}/wage_determinations/{id}',
3564
+ url: '/api/v1/jobs/{job_id}/positions/{id}',
3402
3565
  ...options
3403
3566
  });
3404
3567
  }
3405
3568
  /**
3406
- * Update job wage determination
3407
- *
3408
- * Edit a determination's values from `effective_from` forward: every version
3409
- * starting at or after that instant takes the new values, and earlier
3410
- * versions are untouched. Where an edit starts inside a version and changes
3411
- * its values, a boundary is created at `effective_from` so the change applies
3412
- * only from there.
3413
- *
3414
- * This rewrites what the determination said, not when it existed — moving
3415
- * either end of the timeline is `genesis` or `scheduled_termination`.
3416
- *
3417
- * `pwa_trade_id` is the exception: a trade regroups the whole determination
3418
- * at once, so it moves every version rather than applying from
3419
- * `effective_from`. A determination cascaded from a project mirrors that
3420
- * project's determination and cannot be edited here — change it on the project.
3569
+ * Update position on job
3421
3570
  *
3422
- * Conditional: send the determination's `ETag` as `If-Match`.
3571
+ * cash_fringe_rate_cents, hourly_rate_cents, pwa_wage_pay_rate_cents and
3572
+ * wage_adder_rate_cents are admin only on user-scoped keys.
3423
3573
  *
3424
3574
  *
3425
3575
  * **Required scope:**
3426
3576
  *
3427
- * `jobs.wage_determinations:update`
3577
+ * `jobs.positions:update`
3428
3578
  *
3429
3579
  */
3430
- static updateJobWageDetermination(options) {
3580
+ static updatePosition(options) {
3431
3581
  return (options.client ?? client).patch({
3432
3582
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3433
- url: '/api/v1/jobs/{job_id}/wage_determinations/{id}',
3583
+ url: '/api/v1/jobs/{job_id}/positions/{id}',
3434
3584
  ...options,
3435
3585
  headers: {
3436
3586
  'Content-Type': 'application/json',
@@ -3438,35 +3588,51 @@ export class JobWageDeterminations {
3438
3588
  }
3439
3589
  });
3440
3590
  }
3441
- }
3442
- export class Jobs {
3443
3591
  /**
3444
- * List jobs
3592
+ * List job templates
3445
3593
  *
3446
3594
  * **Required scope:**
3447
3595
  *
3448
- * `jobs:read`
3596
+ * `jobs.templates:read`
3449
3597
  *
3450
3598
  */
3451
- static listJobs(options) {
3599
+ static listTemplates(options) {
3452
3600
  return (options?.client ?? client).get({
3453
3601
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3454
- url: '/api/v1/jobs',
3602
+ url: '/api/v1/jobs/templates',
3455
3603
  ...options
3456
3604
  });
3457
3605
  }
3606
+ }
3607
+ export class JobWageDeterminations {
3458
3608
  /**
3459
- * Create job
3609
+ * Shift job wage determination genesis
3610
+ *
3611
+ * Move when a determination's timeline begins. Shifting it earlier extends
3612
+ * the first version back; shifting it later drops the coverage before it,
3613
+ * and what that removes stops being readable through `as_of[valid]` and
3614
+ * `/history`.
3615
+ *
3616
+ * This changes *when* the determination existed rather than what it said —
3617
+ * no version's attributes are rewritten. Moving the other end of the timeline
3618
+ * is `scheduled_termination`, and changing a version's values is the
3619
+ * determination update.
3620
+ *
3621
+ * A shift to or past a scheduled termination is refused with `422`, since it
3622
+ * would leave no coverage at all.
3623
+ *
3624
+ * Conditional: send the determination's `ETag` as `If-Match`.
3625
+ *
3460
3626
  *
3461
3627
  * **Required scope:**
3462
3628
  *
3463
- * `jobs:create`
3629
+ * `jobs.wage_determinations.genesis:update`
3464
3630
  *
3465
3631
  */
3466
- static createJob(options) {
3467
- return (options.client ?? client).post({
3632
+ static shiftJobWageDeterminationGenesis(options) {
3633
+ return (options.client ?? client).patch({
3468
3634
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3469
- url: '/api/v1/jobs',
3635
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/genesis',
3470
3636
  ...options,
3471
3637
  headers: {
3472
3638
  'Content-Type': 'application/json',
@@ -3475,66 +3641,76 @@ export class Jobs {
3475
3641
  });
3476
3642
  }
3477
3643
  /**
3478
- * Show job
3644
+ * List job wage determination version history
3645
+ *
3646
+ * A determination's whole valid-time sequence, newest window first and
3647
+ * cursor-paginated. Each entry is a full determination carrying its own
3648
+ * `valid_from` / `valid_to` window, a `version_status` of `scheduled`,
3649
+ * `current` or `historical`, and the `corrections` that version replaced —
3650
+ * each itself a full determination as previously recorded, so a client
3651
+ * that wants a field-level diff compares two of them. An entry carries
3652
+ * the family key as `job_wage_determination_id` and no `id` or `uid` of
3653
+ * its own — every version shares the family key, so versions are told
3654
+ * apart by their window coordinates. `as_of[valid]` is
3655
+ * rejected, since pinning a point on the valid axis would collapse the
3656
+ * sequence this endpoint returns, and a determination records no
3657
+ * transaction axis to read `as_of[transaction]` against.
3658
+ *
3479
3659
  *
3480
3660
  * **Required scope:**
3481
3661
  *
3482
- * `jobs:read`
3662
+ * `jobs.wage_determinations.history:read`
3483
3663
  *
3484
3664
  */
3485
- static getJob(options) {
3665
+ static listJobWageDeterminationHistory(options) {
3486
3666
  return (options.client ?? client).get({
3487
3667
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3488
- url: '/api/v1/jobs/{id}',
3668
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/history',
3489
3669
  ...options
3490
3670
  });
3491
3671
  }
3492
3672
  /**
3493
- * Update job
3673
+ * Cancel scheduled changes on job wage determination
3494
3674
  *
3495
3675
  * **Required scope:**
3496
3676
  *
3497
- * `jobs:update`
3677
+ * `jobs.wage_determinations.scheduled_changes:delete`
3498
3678
  *
3499
3679
  */
3500
- static updateJob(options) {
3501
- return (options.client ?? client).patch({
3680
+ static cancelJobWageDeterminationScheduledChanges(options) {
3681
+ return (options.client ?? client).delete({
3502
3682
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3503
- url: '/api/v1/jobs/{id}',
3504
- ...options,
3505
- headers: {
3506
- 'Content-Type': 'application/json',
3507
- ...options.headers
3508
- }
3683
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_changes',
3684
+ ...options
3509
3685
  });
3510
3686
  }
3511
3687
  /**
3512
- * List positions for job
3688
+ * List scheduled changes for job wage determination
3513
3689
  *
3514
3690
  * **Required scope:**
3515
3691
  *
3516
- * `jobs.positions:read`
3692
+ * `jobs.wage_determinations.scheduled_changes:read`
3517
3693
  *
3518
3694
  */
3519
- static listPositions(options) {
3695
+ static listJobWageDeterminationScheduledChanges(options) {
3520
3696
  return (options.client ?? client).get({
3521
3697
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3522
- url: '/api/v1/jobs/{job_id}/positions',
3698
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_changes',
3523
3699
  ...options
3524
3700
  });
3525
3701
  }
3526
3702
  /**
3527
- * Create position for job
3703
+ * Schedule effective-dated change on job wage determination
3528
3704
  *
3529
3705
  * **Required scope:**
3530
3706
  *
3531
- * `jobs.positions:create`
3707
+ * `jobs.wage_determinations.scheduled_changes:create`
3532
3708
  *
3533
3709
  */
3534
- static createPosition(options) {
3710
+ static scheduleJobWageDeterminationChange(options) {
3535
3711
  return (options.client ?? client).post({
3536
3712
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3537
- url: '/api/v1/jobs/{job_id}/positions',
3713
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_changes',
3538
3714
  ...options,
3539
3715
  headers: {
3540
3716
  'Content-Type': 'application/json',
@@ -3543,58 +3719,77 @@ export class Jobs {
3543
3719
  });
3544
3720
  }
3545
3721
  /**
3546
- * Delete position on job
3547
- *
3548
- * Deletes a position that has no logged work and no restricting
3549
- * associations. A position still referenced by time entries,
3550
- * time-card per diems, completion positions, or aggregate logged
3551
- * work is refused with a `422`. An unused position returns `204`
3552
- * and is gone from a later GET.
3553
- *
3722
+ * Cancel scheduled termination on job wage determination
3554
3723
  *
3555
3724
  * **Required scope:**
3556
3725
  *
3557
- * `jobs.positions:delete`
3726
+ * `jobs.wage_determinations.scheduled_terminations:delete`
3558
3727
  *
3559
3728
  */
3560
- static deletePosition(options) {
3729
+ static cancelJobWageDeterminationScheduledTermination(options) {
3561
3730
  return (options.client ?? client).delete({
3562
3731
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3563
- url: '/api/v1/jobs/{job_id}/positions/{id}',
3732
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_termination',
3564
3733
  ...options
3565
3734
  });
3566
3735
  }
3567
3736
  /**
3568
- * Show position on job
3737
+ * Schedule termination on job wage determination
3569
3738
  *
3570
- * Returns one position on the named job. A missing, misnested, or
3571
- * out-of-scope id reads as not found.
3739
+ * End a determination's valid coverage at `effective_date`: segments beyond
3740
+ * it are dropped and one spanning it is truncated, so the determination stops
3741
+ * being valid from that point on. Earlier versions are untouched and stay
3742
+ * readable through `as_of[valid]` and `/history`.
3743
+ *
3744
+ * Moving an end is cancel-then-schedule: cancel the standing termination,
3745
+ * then schedule the one you want.
3746
+ *
3747
+ * Conditional: send the determination's `ETag` as `If-Match`.
3572
3748
  *
3573
3749
  *
3574
3750
  * **Required scope:**
3575
3751
  *
3576
- * `jobs.positions:read`
3752
+ * `jobs.wage_determinations.scheduled_terminations:create`
3577
3753
  *
3578
3754
  */
3579
- static getPosition(options) {
3755
+ static scheduleJobWageDeterminationTermination(options) {
3756
+ return (options.client ?? client).post({
3757
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3758
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/scheduled_termination',
3759
+ ...options,
3760
+ headers: {
3761
+ 'Content-Type': 'application/json',
3762
+ ...options.headers
3763
+ }
3764
+ });
3765
+ }
3766
+ /**
3767
+ * List job wage determinations
3768
+ *
3769
+ * **Required scope:**
3770
+ *
3771
+ * `jobs.wage_determinations:read`
3772
+ *
3773
+ */
3774
+ static listJobWageDeterminations(options) {
3580
3775
  return (options.client ?? client).get({
3581
3776
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3582
- url: '/api/v1/jobs/{job_id}/positions/{id}',
3777
+ url: '/api/v1/jobs/{job_id}/wage_determinations',
3583
3778
  ...options
3584
3779
  });
3585
3780
  }
3586
3781
  /**
3587
- * Update position on job
3782
+ * Create job wage determination
3588
3783
  *
3589
3784
  * **Required scope:**
3590
3785
  *
3591
- * `jobs.positions:update`
3786
+ * `jobs.wage_determinations:create`
3592
3787
  *
3593
3788
  */
3594
- static updatePosition(options) {
3595
- return (options.client ?? client).patch({
3789
+ static createWageDetermination(options) {
3790
+ return (options.client ?? client).post({
3596
3791
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3597
- url: '/api/v1/jobs/{job_id}/positions/{id}',
3792
+ url: '/api/v1/jobs/{job_id}/wage_determinations',
3598
3793
  ...options,
3599
3794
  headers: {
3600
3795
  'Content-Type': 'application/json',
@@ -3603,20 +3798,71 @@ export class Jobs {
3603
3798
  });
3604
3799
  }
3605
3800
  /**
3606
- * List job templates
3801
+ * Delete job wage determination
3607
3802
  *
3608
3803
  * **Required scope:**
3609
3804
  *
3610
- * `jobs.templates:read`
3805
+ * `jobs.wage_determinations:delete`
3611
3806
  *
3612
3807
  */
3613
- static listTemplates(options) {
3614
- return (options?.client ?? client).get({
3808
+ static deleteWageDetermination(options) {
3809
+ return (options.client ?? client).delete({
3615
3810
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3616
- url: '/api/v1/jobs/templates',
3811
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{id}',
3812
+ ...options
3813
+ });
3814
+ }
3815
+ /**
3816
+ * Show job wage determination
3817
+ *
3818
+ * **Required scope:**
3819
+ *
3820
+ * `jobs.wage_determinations:read`
3821
+ *
3822
+ */
3823
+ static getJobWageDetermination(options) {
3824
+ return (options.client ?? client).get({
3825
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3826
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{id}',
3617
3827
  ...options
3618
3828
  });
3619
3829
  }
3830
+ /**
3831
+ * Update job wage determination
3832
+ *
3833
+ * Edit a determination's values from `effective_from` forward: every version
3834
+ * starting at or after that instant takes the new values, and earlier
3835
+ * versions are untouched. Where an edit starts inside a version and changes
3836
+ * its values, a boundary is created at `effective_from` so the change applies
3837
+ * only from there.
3838
+ *
3839
+ * This rewrites what the determination said, not when it existed — moving
3840
+ * either end of the timeline is `genesis` or `scheduled_termination`.
3841
+ *
3842
+ * `pwa_trade_id` is the exception: a trade regroups the whole determination
3843
+ * at once, so it moves every version rather than applying from
3844
+ * `effective_from`. A determination cascaded from a project mirrors that
3845
+ * project's determination and cannot be edited here — change it on the project.
3846
+ *
3847
+ * Conditional: send the determination's `ETag` as `If-Match`.
3848
+ *
3849
+ *
3850
+ * **Required scope:**
3851
+ *
3852
+ * `jobs.wage_determinations:update`
3853
+ *
3854
+ */
3855
+ static updateJobWageDetermination(options) {
3856
+ return (options.client ?? client).patch({
3857
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3858
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{id}',
3859
+ ...options,
3860
+ headers: {
3861
+ 'Content-Type': 'application/json',
3862
+ ...options.headers
3863
+ }
3864
+ });
3865
+ }
3620
3866
  }
3621
3867
  export class OpenApi {
3622
3868
  /**
@@ -5077,9 +5323,10 @@ export class People {
5077
5323
  *
5078
5324
  * Every valid-time version of one employment stint, newest first. Each
5079
5325
  * entry uses `people_employment_id` rather than an entry-level id and
5080
- * includes prior recorded corrections. Company managers may read
5081
- * coworker history, but direct monetary fields are limited to their
5082
- * own employment in versions and corrections.
5326
+ * includes prior corrections recorded at the credential company.
5327
+ * Company managers may read coworker history, but direct monetary
5328
+ * fields are limited to their own employment in versions and
5329
+ * corrections.
5083
5330
  *
5084
5331
  *
5085
5332
  * **Required scope:**
@@ -5633,6 +5880,119 @@ export class ProductionCompletions {
5633
5880
  });
5634
5881
  }
5635
5882
  }
5883
+ export class ProjectSites {
5884
+ /**
5885
+ * List project sites
5886
+ *
5887
+ * Returns the project's site assignments (`ProjectSite` joins). Path `{id}`
5888
+ * on the member routes is the join id, not the Site id. A participating-company
5889
+ * key may list joins on a project it can see; a user-scoped key of a
5890
+ * participating company cannot, because web project visibility does not include
5891
+ * participating projects.
5892
+ *
5893
+ *
5894
+ * **Required scope:**
5895
+ *
5896
+ * `projects.sites:read`
5897
+ *
5898
+ */
5899
+ static listProjectSites(options) {
5900
+ return (options.client ?? client).get({
5901
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
5902
+ url: '/api/v1/projects/{project_id}/sites',
5903
+ ...options
5904
+ });
5905
+ }
5906
+ /**
5907
+ * Create a project site
5908
+ *
5909
+ * Attaches a site to the project. `site_id` is required; `feature_ids` is
5910
+ * optional and scopes which of that site's features apply. The project is
5911
+ * taken from the path. Writes are owner-only: a participating-company key
5912
+ * that can GET the project receives 403. Duplicate `(project, site)` pairs
5913
+ * are 422. A site that is not public and not owned by the project's owner
5914
+ * is 422 when visible, or 404 when the key cannot see the site.
5915
+ *
5916
+ *
5917
+ * **Required scope:**
5918
+ *
5919
+ * `projects.sites:create`
5920
+ *
5921
+ */
5922
+ static createProjectSite(options) {
5923
+ return (options.client ?? client).post({
5924
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
5925
+ url: '/api/v1/projects/{project_id}/sites',
5926
+ ...options,
5927
+ headers: {
5928
+ 'Content-Type': 'application/json',
5929
+ ...options.headers
5930
+ }
5931
+ });
5932
+ }
5933
+ /**
5934
+ * Delete a project site
5935
+ *
5936
+ * Removes the project–site join. The Site itself is not destroyed. Writes
5937
+ * are owner-only.
5938
+ *
5939
+ *
5940
+ * **Required scope:**
5941
+ *
5942
+ * `projects.sites:delete`
5943
+ *
5944
+ */
5945
+ static deleteProjectSite(options) {
5946
+ return (options.client ?? client).delete({
5947
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
5948
+ url: '/api/v1/projects/{project_id}/sites/{id}',
5949
+ ...options
5950
+ });
5951
+ }
5952
+ /**
5953
+ * Show a project site
5954
+ *
5955
+ * Returns one project–site join. A missing, mismatched, or out-of-scope id
5956
+ * reads as not found.
5957
+ *
5958
+ *
5959
+ * **Required scope:**
5960
+ *
5961
+ * `projects.sites:read`
5962
+ *
5963
+ */
5964
+ static getProjectSite(options) {
5965
+ return (options.client ?? client).get({
5966
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
5967
+ url: '/api/v1/projects/{project_id}/sites/{id}',
5968
+ ...options
5969
+ });
5970
+ }
5971
+ /**
5972
+ * Update a project site
5973
+ *
5974
+ * Replaces `feature_ids` on the join. Send an empty array to clear features.
5975
+ * `site_id` is create-only; naming it on PATCH is a 400. Writes are
5976
+ * owner-only.
5977
+ *
5978
+ *
5979
+ * **Required scope:**
5980
+ *
5981
+ * `projects.sites:update`
5982
+ *
5983
+ */
5984
+ static updateProjectSite(options) {
5985
+ return (options.client ?? client).patch({
5986
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
5987
+ url: '/api/v1/projects/{project_id}/sites/{id}',
5988
+ ...options,
5989
+ headers: {
5990
+ 'Content-Type': 'application/json',
5991
+ ...options.headers
5992
+ }
5993
+ });
5994
+ }
5995
+ }
5636
5996
  export class Projects {
5637
5997
  /**
5638
5998
  * List projects
@@ -5722,9 +6082,11 @@ export class Projects {
5722
6082
  * switching it to `none` clears the stored values and forces `asset_owner`
5723
6083
  * false, and sending one of them while federal tracking is off — even as null —
5724
6084
  * returns 422. `budget_currency` defaults to USD when blank. `parent_id` moves
5725
- * or detaches the project, and `participating_company_ids` replaces the complete
5726
- * set of participating companies. Remove a participant's jobs before removing
5727
- * it from this set. Only the owning company may update the project.
6085
+ * or detaches the project; a project whose parent no longer lists its owner
6086
+ * still accepts updates that keep that parent. `participating_company_ids`
6087
+ * replaces the complete set of participating companies. Remove a participant's
6088
+ * jobs before removing it from this set. Only the owning company may update the
6089
+ * project.
5728
6090
  *
5729
6091
  *
5730
6092
  * **Required scope:**
@@ -5960,6 +6322,14 @@ export class Users {
5960
6322
  /**
5961
6323
  * List users
5962
6324
  *
6325
+ * Workers the credential company sees: people it employs, has
6326
+ * granted a role, or has invited. Direct monetary employment
6327
+ * fields (`hourly_rate`, `training_annual_amount`,
6328
+ * `employer_combined_health_amount`, `employer_combined_savings`)
6329
+ * are present for company keys, company administrators, and the
6330
+ * employed person, and omitted for other user keys.
6331
+ *
6332
+ *
5963
6333
  * **Required scope:**
5964
6334
  *
5965
6335
  * `users:read`
@@ -5994,6 +6364,13 @@ export class Users {
5994
6364
  /**
5995
6365
  * Show user
5996
6366
  *
6367
+ * Direct monetary employment fields (`hourly_rate`,
6368
+ * `training_annual_amount`, `employer_combined_health_amount`,
6369
+ * `employer_combined_savings`) are present for company keys,
6370
+ * company administrators, and the employed person, and omitted
6371
+ * for other user keys.
6372
+ *
6373
+ *
5997
6374
  * **Required scope:**
5998
6375
  *
5999
6376
  * `users:read`
@@ -6094,6 +6471,27 @@ export class PwaTradeApprenticeScope {
6094
6471
  ...options
6095
6472
  });
6096
6473
  }
6474
+ /**
6475
+ * Show apprentice scope decision
6476
+ *
6477
+ * Returns one reviewed (occupation, craft) pair on this trade. The payload is
6478
+ * the same object create, update, and destroy already serialize. A missing,
6479
+ * mismatched, or out-of-scope id is not found. Reading follows the trade;
6480
+ * employer enrollment is not required.
6481
+ *
6482
+ *
6483
+ * **Required scope:**
6484
+ *
6485
+ * `pwa.trades.apprenticeship_occupations:read`
6486
+ *
6487
+ */
6488
+ static getApprenticeshipOccupation(options) {
6489
+ return (options.client ?? client).get({
6490
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
6491
+ url: '/api/v1/pwa/trades/{trade_id}/apprenticeship_occupations/{id}',
6492
+ ...options
6493
+ });
6494
+ }
6097
6495
  /**
6098
6496
  * Flip an apprentice scope decision
6099
6497
  *
@@ -6355,7 +6753,8 @@ export class PriorPeriodAdjustments {
6355
6753
  * Permanently remove an adjustment, for undoing one recorded in error. The removed
6356
6754
  * adjustment is returned. Its allocation is freed back to the funding line item and
6357
6755
  * the time card's actuals rebuild, so the job's balance due rises by this amount.
6358
- * Adjustments cannot be edited — delete and re-create to change one.
6756
+ * To change amount, job, rationale, notes, or PWA eligibility, PATCH the same
6757
+ * resource instead.
6359
6758
  *
6360
6759
  *
6361
6760
  * **Required scope:**
@@ -6385,6 +6784,31 @@ export class PriorPeriodAdjustments {
6385
6784
  ...options
6386
6785
  });
6387
6786
  }
6787
+ /**
6788
+ * Update Prior Period Adjustment
6789
+ *
6790
+ * Change amount, job, rationale, notes, or PWA eligibility on an existing
6791
+ * adjustment. The updated adjustment is returned and the time card's actuals
6792
+ * rebuild. The funding line item, recording user, time card, and adjustment
6793
+ * type cannot be changed on this path.
6794
+ *
6795
+ *
6796
+ * **Required scope:**
6797
+ *
6798
+ * `time_cards.prior_period_adjustments:update`
6799
+ *
6800
+ */
6801
+ static updatePriorPeriodAdjustment(options) {
6802
+ return (options.client ?? client).patch({
6803
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
6804
+ url: '/api/v1/time_cards/{time_card_id}/prior_period_adjustments/{id}',
6805
+ ...options,
6806
+ headers: {
6807
+ 'Content-Type': 'application/json',
6808
+ ...options.headers
6809
+ }
6810
+ });
6811
+ }
6388
6812
  }
6389
6813
  export class TimeCardPwaCompliance {
6390
6814
  /**
@@ -6485,7 +6909,8 @@ export class TimeEntries {
6485
6909
  * Create time entry
6486
6910
  *
6487
6911
  * Create a time entry. Required: timekeeping_time_card_id, start_time, and end_time;
6488
- * user_id is derived server-side from the time card. Both start_time and
6912
+ * user_id is derived server-side from the time card, and a time card outside
6913
+ * the key's scope is not found (404). Both start_time and
6489
6914
  * end_time must fall on a whole-minute boundary (nonzero seconds are
6490
6915
  * rejected); start_time must fall within the time card's pay period, and
6491
6916
  * end_time must be after start_time. Optional job_id (the worker must have a
@@ -6493,10 +6918,8 @@ export class TimeEntries {
6493
6918
  * company's default timecodes), state, description, hourly_rate_cents (derived
6494
6919
  * from the position/user default when omitted), and feature_ids. Supplying
6495
6920
  * feature_ids — or setting feature_allocation_acknowledged true — satisfies a
6496
- * job that requires a feature allocation. A user-scoped key may send
6497
- * hourly_rate_cents only when its user is an admin in the entry's company;
6498
- * any other user-scoped key that sends it, null included, is forbidden (403)
6499
- * and nothing is created.
6921
+ * job that requires a feature allocation. hourly_rate_cents is admin only on
6922
+ * user-scoped keys.
6500
6923
  *
6501
6924
  *
6502
6925
  * **Required scope:**
@@ -6565,16 +6988,15 @@ export class TimeEntries {
6565
6988
  *
6566
6989
  * Update an existing time entry by id; every field in the parameters is
6567
6990
  * optional and only supplied fields change. An entry outside the key's scope
6568
- * is not found (404). Authorization is re-checked after attributes are
6569
- * assigned, so moving the entry to a time card in another company is
6570
- * forbidden (403). If the change would push categorized allocation
6571
- * minutes past the time card's overtime eligible minutes, the request returns
6991
+ * is not found (404). An edit the key may not make to the entry as assigned,
6992
+ * such as a technician putting it on a job that requires clock-in, is
6993
+ * forbidden (403).
6994
+ * If the change would push categorized allocation minutes past the time card's
6995
+ * overtime eligible minutes, the request returns
6572
6996
  * 422 unless confirm_allocation_conflict is sent true. The feature-allocation cap is
6573
6997
  * enforced, and because a persisted feature_ids= writes its join rows
6574
6998
  * immediately, a rejected save rolls them back within the enclosing
6575
- * transaction. A user-scoped key may send hourly_rate_cents only when its user
6576
- * is an admin in the entry's company; any other user-scoped key that sends
6577
- * it, null included, is forbidden (403) and the entry is left unchanged.
6999
+ * transaction. hourly_rate_cents is admin only on user-scoped keys.
6578
7000
  *
6579
7001
  *
6580
7002
  * **Required scope:**