@curviate/sdk 0.9.0 → 0.11.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.
package/dist/index.d.ts CHANGED
@@ -157,9 +157,9 @@ interface paths {
157
157
  * @description Stable status whitelist.
158
158
  * @enum {string}
159
159
  */
160
- status?: "active" | "reconnect_needed" | "restricted" | "connecting";
160
+ status?: "active" | "reconnect_needed" | "restricted" | "connecting" | "disconnected";
161
161
  /** @enum {string} */
162
- auth_method?: "credentials" | "cookie";
162
+ auth_method?: "credentials" | "cookie" | "hosted";
163
163
  full_name?: string | null;
164
164
  headline?: string | null;
165
165
  /** @description The seat this account occupies. */
@@ -356,6 +356,12 @@ interface paths {
356
356
  auth_method?: "credentials" | "cookie";
357
357
  full_name?: string | null;
358
358
  headline?: string | null;
359
+ /** @description The seat this account occupies (canonical — supersedes the deprecated attached_seat_id). */
360
+ seat_id?: string | null;
361
+ /**
362
+ * @deprecated
363
+ * @description Deprecated — use seat_id (same value). Removed at the GA /v1 cutover.
364
+ */
359
365
  attached_seat_id?: string | null;
360
366
  };
361
367
  };
@@ -519,7 +525,7 @@ interface paths {
519
525
  object?: "account";
520
526
  account_id?: string;
521
527
  /** @enum {string} */
522
- status?: "active" | "reconnect_needed" | "restricted" | "connecting";
528
+ status?: "active" | "reconnect_needed" | "restricted" | "connecting" | "disconnected";
523
529
  auth_method?: string;
524
530
  full_name?: string | null;
525
531
  headline?: string | null;
@@ -828,6 +834,15 @@ interface paths {
828
834
  "application/json": components["schemas"]["Error"];
829
835
  };
830
836
  };
837
+ /** @description This managed-proxy configuration is not supported for this account (e.g. the requested proxy mode or location is unavailable on the account's current plan). Not retryable as-is — change the request rather than resubmitting. */
838
+ 501: {
839
+ headers: {
840
+ [name: string]: unknown;
841
+ };
842
+ content: {
843
+ "application/json": components["schemas"]["Error"];
844
+ };
845
+ };
831
846
  /** @description A temporary error occurred. Please try again. */
832
847
  502: {
833
848
  headers: {
@@ -919,6 +934,8 @@ interface paths {
919
934
  object?: "hosted_auth_url";
920
935
  /** @description The hosted URL the end user opens. */
921
936
  url?: string;
937
+ /** @description Poll handle for GET /v1/accounts/connect-sessions/{session_id}. */
938
+ session_id?: string;
922
939
  expires_at?: string;
923
940
  seat_id?: string | null;
924
941
  account_id?: string | null;
@@ -1008,6 +1025,124 @@ interface paths {
1008
1025
  patch?: never;
1009
1026
  trace?: never;
1010
1027
  };
1028
+ "/v1/accounts/connect-sessions/{session_id}": {
1029
+ parameters: {
1030
+ query?: never;
1031
+ header?: never;
1032
+ path?: never;
1033
+ cookie?: never;
1034
+ };
1035
+ /**
1036
+ * Poll a hosted connect session
1037
+ * @description Return the current status of a hosted connect session created by connect-link. A pure status read — it makes no external call and does not itself complete the connection (completion is signalled out-of-band once the end user finishes the hosted flow). status is `pending` until the hand-off completes, then `resolved` (with `account_id`), or `expired` / `failed`. Poll until it leaves `pending`.
1038
+ */
1039
+ get: {
1040
+ parameters: {
1041
+ query?: never;
1042
+ header?: never;
1043
+ path: {
1044
+ /** @description The connect session id (`cs_…`) returned by connect-link. */
1045
+ session_id: string;
1046
+ };
1047
+ cookie?: never;
1048
+ };
1049
+ requestBody?: never;
1050
+ responses: {
1051
+ /** @description The current status of a hosted connect session created by connect-link. Poll until status leaves pending; account_id is present only once status is resolved. */
1052
+ 200: {
1053
+ headers: {
1054
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
1055
+ RateLimit: components["headers"]["RateLimit"];
1056
+ [name: string]: unknown;
1057
+ };
1058
+ content: {
1059
+ "application/json": {
1060
+ /**
1061
+ * @description Response type discriminator.
1062
+ * @enum {string}
1063
+ */
1064
+ object?: "connect_session";
1065
+ /** @description The connect session id (cs_…). */
1066
+ session_id?: string;
1067
+ /**
1068
+ * @description Lifecycle status. pending until the hand-off completes, then resolved / expired / failed.
1069
+ * @enum {string}
1070
+ */
1071
+ status?: "pending" | "resolved" | "expired" | "failed";
1072
+ /** @description The connected account (acc_…); null until status is resolved. */
1073
+ account_id?: string | null;
1074
+ /** @description ISO-8601 UTC session expiry. */
1075
+ expires_at?: string;
1076
+ };
1077
+ };
1078
+ };
1079
+ /** @description Missing or invalid API key. */
1080
+ 401: {
1081
+ headers: {
1082
+ [name: string]: unknown;
1083
+ };
1084
+ content: {
1085
+ "application/json": components["schemas"]["Error"];
1086
+ };
1087
+ };
1088
+ /** @description No such connect session for this tenant. */
1089
+ 404: {
1090
+ headers: {
1091
+ [name: string]: unknown;
1092
+ };
1093
+ content: {
1094
+ "application/json": components["schemas"]["Error"];
1095
+ };
1096
+ };
1097
+ /** @description Rate limited — slow down and retry after the hinted delay. */
1098
+ 429: {
1099
+ headers: {
1100
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
1101
+ RateLimit: components["headers"]["RateLimit"];
1102
+ "Retry-After": components["headers"]["Retry-After"];
1103
+ [name: string]: unknown;
1104
+ };
1105
+ content: {
1106
+ "application/json": components["schemas"]["Error"];
1107
+ };
1108
+ };
1109
+ /** @description Internal error. */
1110
+ 500: {
1111
+ headers: {
1112
+ [name: string]: unknown;
1113
+ };
1114
+ content: {
1115
+ "application/json": components["schemas"]["Error"];
1116
+ };
1117
+ };
1118
+ /** @description Service unavailable. */
1119
+ 503: {
1120
+ headers: {
1121
+ [name: string]: unknown;
1122
+ };
1123
+ content: {
1124
+ "application/json": components["schemas"]["Error"];
1125
+ };
1126
+ };
1127
+ /** @description Gateway timeout. */
1128
+ 504: {
1129
+ headers: {
1130
+ [name: string]: unknown;
1131
+ };
1132
+ content: {
1133
+ "application/json": components["schemas"]["Error"];
1134
+ };
1135
+ };
1136
+ };
1137
+ };
1138
+ put?: never;
1139
+ post?: never;
1140
+ delete?: never;
1141
+ options?: never;
1142
+ head?: never;
1143
+ patch?: never;
1144
+ trace?: never;
1145
+ };
1011
1146
  "/v1/accounts/{account_id}/reconnect": {
1012
1147
  parameters: {
1013
1148
  query?: never;
@@ -1393,6 +1528,13 @@ interface paths {
1393
1528
  account_id?: string;
1394
1529
  /** @enum {string} */
1395
1530
  status?: "active";
1531
+ /** @description The seat this account occupies (canonical — supersedes the deprecated attached_seat_id). */
1532
+ seat_id?: string | null;
1533
+ /**
1534
+ * @deprecated
1535
+ * @description Deprecated — use seat_id (same value). Removed at the GA /v1 cutover.
1536
+ */
1537
+ attached_seat_id?: string | null;
1396
1538
  };
1397
1539
  };
1398
1540
  };
@@ -1507,6 +1649,137 @@ interface paths {
1507
1649
  patch?: never;
1508
1650
  trace?: never;
1509
1651
  };
1652
+ "/v1/accounts/checkpoints/resend": {
1653
+ parameters: {
1654
+ query?: never;
1655
+ header?: never;
1656
+ path?: never;
1657
+ cookie?: never;
1658
+ };
1659
+ get?: never;
1660
+ put?: never;
1661
+ /**
1662
+ * Resend a checkpoint verification notification
1663
+ * @description Re-push / re-issue the pending verification challenge notification for an account. Addressed by account_id in the body (the account_id returned with the 202 checkpoint_required response). Meaningful for otp / two_factor_sms / mobile_app_approval challenges; a two_factor_app challenge has nothing to resend (the code is generated on the device) and returns resent:false rather than an error — the response never claims a resend that did not happen. Does not reset the checkpoint's expiry.
1664
+ */
1665
+ post: {
1666
+ parameters: {
1667
+ query?: never;
1668
+ header?: never;
1669
+ path?: never;
1670
+ cookie?: never;
1671
+ };
1672
+ requestBody: {
1673
+ content: {
1674
+ "application/json": {
1675
+ /** @description The account whose pending checkpoint notification should be re-sent (returned with the 202 checkpoint_required response, or from link/poll). */
1676
+ account_id: string;
1677
+ };
1678
+ };
1679
+ };
1680
+ responses: {
1681
+ /** @description The resend request was processed. resent:true means the substrate confirmed the notification was re-sent; resent:false means the substrate acknowledged the request but had nothing to re-send (e.g. a two_factor_app challenge, where the code is generated on the device) — the response never claims a resend that did not happen. */
1682
+ 200: {
1683
+ headers: {
1684
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
1685
+ RateLimit: components["headers"]["RateLimit"];
1686
+ [name: string]: unknown;
1687
+ };
1688
+ content: {
1689
+ "application/json": {
1690
+ /**
1691
+ * @description Response type discriminator.
1692
+ * @enum {string}
1693
+ */
1694
+ object?: "checkpoint";
1695
+ account_id?: string;
1696
+ resent?: boolean;
1697
+ };
1698
+ };
1699
+ };
1700
+ /** @description No pending checkpoint for this account. */
1701
+ 404: {
1702
+ headers: {
1703
+ [name: string]: unknown;
1704
+ };
1705
+ content: {
1706
+ "application/json": components["schemas"]["Error"];
1707
+ };
1708
+ };
1709
+ /** @description The checkpoint has expired. */
1710
+ 409: {
1711
+ headers: {
1712
+ [name: string]: unknown;
1713
+ };
1714
+ content: {
1715
+ "application/json": components["schemas"]["Error"];
1716
+ };
1717
+ };
1718
+ /** @description Rate limited — slow down and retry after the hinted delay. */
1719
+ 429: {
1720
+ headers: {
1721
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
1722
+ RateLimit: components["headers"]["RateLimit"];
1723
+ "Retry-After": components["headers"]["Retry-After"];
1724
+ [name: string]: unknown;
1725
+ };
1726
+ content: {
1727
+ "application/json": components["schemas"]["Error"];
1728
+ };
1729
+ };
1730
+ /** @description Internal error. */
1731
+ 500: {
1732
+ headers: {
1733
+ [name: string]: unknown;
1734
+ };
1735
+ content: {
1736
+ "application/json": components["schemas"]["Error"];
1737
+ };
1738
+ };
1739
+ /** @description This challenge type does not support resend — there is nothing for the substrate to re-send. Not retryable as-is; resolve the checkpoint via submit, or by completing it directly (e.g. approving on the device), instead of resending. */
1740
+ 501: {
1741
+ headers: {
1742
+ [name: string]: unknown;
1743
+ };
1744
+ content: {
1745
+ "application/json": components["schemas"]["Error"];
1746
+ };
1747
+ };
1748
+ /** @description A temporary error occurred. Please try again. */
1749
+ 502: {
1750
+ headers: {
1751
+ [name: string]: unknown;
1752
+ };
1753
+ content: {
1754
+ "application/json": components["schemas"]["Error"];
1755
+ };
1756
+ };
1757
+ /** @description Service unavailable. */
1758
+ 503: {
1759
+ headers: {
1760
+ [name: string]: unknown;
1761
+ };
1762
+ content: {
1763
+ "application/json": components["schemas"]["Error"];
1764
+ };
1765
+ };
1766
+ /** @description Gateway timeout. */
1767
+ 504: {
1768
+ headers: {
1769
+ [name: string]: unknown;
1770
+ };
1771
+ content: {
1772
+ "application/json": components["schemas"]["Error"];
1773
+ };
1774
+ };
1775
+ };
1776
+ };
1777
+ delete?: never;
1778
+ options?: never;
1779
+ head?: never;
1780
+ patch?: never;
1781
+ trace?: never;
1782
+ };
1510
1783
  "/v1/accounts/checkpoints/poll": {
1511
1784
  parameters: {
1512
1785
  query?: never;
@@ -1558,7 +1831,12 @@ interface paths {
1558
1831
  full_name?: string | null;
1559
1832
  /** @description Present on status:"active". */
1560
1833
  headline?: string | null;
1561
- /** @description The seat this account occupies. Present on status:"active". */
1834
+ /** @description The seat this account occupies (canonical — supersedes the deprecated attached_seat_id). Present on status:"active". */
1835
+ seat_id?: string | null;
1836
+ /**
1837
+ * @deprecated
1838
+ * @description Deprecated — use seat_id (same value). Removed at the GA /v1 cutover. Present on status:"active".
1839
+ */
1562
1840
  attached_seat_id?: string | null;
1563
1841
  /** @description ISO-8601 expiry. Present on status:"pending". */
1564
1842
  expires_at?: string;
@@ -2252,28 +2530,169 @@ interface paths {
2252
2530
  query?: never;
2253
2531
  header?: never;
2254
2532
  path: {
2255
- /** @description The received invitation's id (from GET /v1/invites/received items[].id). */
2533
+ /** @description The received invitation's id (from GET /v1/invites/received items[].id). */
2534
+ invitation_id: string;
2535
+ };
2536
+ cookie?: never;
2537
+ };
2538
+ requestBody: {
2539
+ content: {
2540
+ "application/json": {
2541
+ /** @description The linked LinkedIn account to act on behalf of. */
2542
+ account_id: string;
2543
+ /**
2544
+ * @description Whether to accept or decline the received invitation. Required with no default — prevents silent wrong-direction accidents.
2545
+ * @enum {string}
2546
+ */
2547
+ action: "accept" | "decline";
2548
+ /** @description Per-invitation token issued by the platform. Required to accept or decline. Obtain it from GET /v1/invites/received (items[].specifics.shared_secret). Passed to the platform and immediately discarded — never stored. */
2549
+ shared_secret: string;
2550
+ };
2551
+ };
2552
+ };
2553
+ responses: {
2554
+ /** @description Invitation handled, or already absent (not_found) */
2555
+ 200: {
2556
+ headers: {
2557
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
2558
+ RateLimit: components["headers"]["RateLimit"];
2559
+ [name: string]: unknown;
2560
+ };
2561
+ content: {
2562
+ "application/json": {
2563
+ /**
2564
+ * @description Response type discriminator.
2565
+ * @enum {string}
2566
+ */
2567
+ object?: "invitation_handled";
2568
+ /** @description The handled invitation's id. */
2569
+ invitation_id?: string;
2570
+ /**
2571
+ * @description The action that was taken.
2572
+ * @enum {string}
2573
+ */
2574
+ action?: "accept" | "decline";
2575
+ /**
2576
+ * @description Outcome status. not_found means the invitation was already absent — not an error.
2577
+ * @enum {string}
2578
+ */
2579
+ status?: "accepted" | "declined" | "not_found";
2580
+ };
2581
+ };
2582
+ };
2583
+ /** @description Invalid request — missing or malformed parameters. */
2584
+ 400: {
2585
+ headers: {
2586
+ [name: string]: unknown;
2587
+ };
2588
+ content: {
2589
+ "application/json": components["schemas"]["Error"];
2590
+ };
2591
+ };
2592
+ /** @description Missing or invalid API key. */
2593
+ 401: {
2594
+ headers: {
2595
+ [name: string]: unknown;
2596
+ };
2597
+ content: {
2598
+ "application/json": components["schemas"]["Error"];
2599
+ };
2600
+ };
2601
+ /** @description Account not found or not owned by this tenant. */
2602
+ 404: {
2603
+ headers: {
2604
+ [name: string]: unknown;
2605
+ };
2606
+ content: {
2607
+ "application/json": components["schemas"]["Error"];
2608
+ };
2609
+ };
2610
+ /** @description Quota exceeded — slow down and retry after the hinted delay. */
2611
+ 429: {
2612
+ headers: {
2613
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
2614
+ RateLimit: components["headers"]["RateLimit"];
2615
+ "Retry-After": components["headers"]["Retry-After"];
2616
+ [name: string]: unknown;
2617
+ };
2618
+ content: {
2619
+ "application/json": components["schemas"]["Error"];
2620
+ };
2621
+ };
2622
+ /** @description Internal server error. */
2623
+ 500: {
2624
+ headers: {
2625
+ [name: string]: unknown;
2626
+ };
2627
+ content: {
2628
+ "application/json": components["schemas"]["Error"];
2629
+ };
2630
+ };
2631
+ /** @description A temporary error occurred while processing the request. */
2632
+ 502: {
2633
+ headers: {
2634
+ [name: string]: unknown;
2635
+ };
2636
+ content: {
2637
+ "application/json": components["schemas"]["Error"];
2638
+ };
2639
+ };
2640
+ /** @description Service unavailable. */
2641
+ 503: {
2642
+ headers: {
2643
+ [name: string]: unknown;
2644
+ };
2645
+ content: {
2646
+ "application/json": components["schemas"]["Error"];
2647
+ };
2648
+ };
2649
+ /** @description Gateway timeout. */
2650
+ 504: {
2651
+ headers: {
2652
+ [name: string]: unknown;
2653
+ };
2654
+ content: {
2655
+ "application/json": components["schemas"]["Error"];
2656
+ };
2657
+ };
2658
+ };
2659
+ };
2660
+ delete?: never;
2661
+ options?: never;
2662
+ head?: never;
2663
+ patch?: never;
2664
+ trace?: never;
2665
+ };
2666
+ "/v1/invites/{invitation_id}": {
2667
+ parameters: {
2668
+ query?: never;
2669
+ header?: never;
2670
+ path?: never;
2671
+ cookie?: never;
2672
+ };
2673
+ get?: never;
2674
+ put?: never;
2675
+ post?: never;
2676
+ /**
2677
+ * Cancel a sent invitation
2678
+ * @description Cancels a previously sent connection invitation by id. An already-absent or unrecognized invitation_id returns status:not_found rather than an error.
2679
+ */
2680
+ delete: {
2681
+ parameters: {
2682
+ query: {
2683
+ /** @description The linked LinkedIn account to act on behalf of. */
2684
+ account_id: string;
2685
+ };
2686
+ header?: never;
2687
+ path: {
2688
+ /** @description The sent invitation's id to cancel. */
2256
2689
  invitation_id: string;
2257
2690
  };
2258
2691
  cookie?: never;
2259
2692
  };
2260
- requestBody: {
2261
- content: {
2262
- "application/json": {
2263
- /** @description The linked LinkedIn account to act on behalf of. */
2264
- account_id: string;
2265
- /**
2266
- * @description Whether to accept or decline the received invitation. Required with no default — prevents silent wrong-direction accidents.
2267
- * @enum {string}
2268
- */
2269
- action: "accept" | "decline";
2270
- /** @description Per-invitation token issued by the platform. Required to accept or decline. Obtain it from GET /v1/invites/received (items[].specifics.shared_secret). Passed to the platform and immediately discarded — never stored. */
2271
- shared_secret: string;
2272
- };
2273
- };
2274
- };
2693
+ requestBody?: never;
2275
2694
  responses: {
2276
- /** @description Invitation handled, or already absent (not_found) */
2695
+ /** @description Invitation canceled, or already absent (not_found). */
2277
2696
  200: {
2278
2697
  headers: {
2279
2698
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -2286,19 +2705,14 @@ interface paths {
2286
2705
  * @description Response type discriminator.
2287
2706
  * @enum {string}
2288
2707
  */
2289
- object?: "invitation_handled";
2290
- /** @description The handled invitation's id. */
2708
+ object?: "invitation_canceled";
2709
+ /** @description The canceled invitation's id. */
2291
2710
  invitation_id?: string;
2292
- /**
2293
- * @description The action that was taken.
2294
- * @enum {string}
2295
- */
2296
- action?: "accept" | "decline";
2297
2711
  /**
2298
2712
  * @description Outcome status. not_found means the invitation was already absent — not an error.
2299
2713
  * @enum {string}
2300
2714
  */
2301
- status?: "accepted" | "declined" | "not_found";
2715
+ status?: "canceled" | "not_found";
2302
2716
  };
2303
2717
  };
2304
2718
  };
@@ -2379,42 +2793,38 @@ interface paths {
2379
2793
  };
2380
2794
  };
2381
2795
  };
2382
- delete?: never;
2383
2796
  options?: never;
2384
2797
  head?: never;
2385
2798
  patch?: never;
2386
2799
  trace?: never;
2387
2800
  };
2388
- "/v1/invites/{invitation_id}": {
2801
+ "/v1/jobs/{job_id}": {
2389
2802
  parameters: {
2390
2803
  query?: never;
2391
2804
  header?: never;
2392
2805
  path?: never;
2393
2806
  cookie?: never;
2394
2807
  };
2395
- get?: never;
2396
- put?: never;
2397
- post?: never;
2398
2808
  /**
2399
- * Cancel a sent invitation
2400
- * @description Cancels a previously sent connection invitation by id. An already-absent or unrecognized invitation_id returns status:not_found rather than an error.
2809
+ * Get job posting
2810
+ * @description Returns one public LinkedIn job posting's full detail title, company, location, description, and applicant count.
2401
2811
  */
2402
- delete: {
2812
+ get: {
2403
2813
  parameters: {
2404
2814
  query: {
2405
- /** @description The linked LinkedIn account to act on behalf of. */
2815
+ /** @description The connected LinkedIn account to retrieve the job posting on behalf of. */
2406
2816
  account_id: string;
2407
2817
  };
2408
2818
  header?: never;
2409
2819
  path: {
2410
- /** @description The sent invitation's id to cancel. */
2411
- invitation_id: string;
2820
+ /** @description The numeric id of the job posting, e.g. 4428113858. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4428113858) and the job_urn value in a POST /v1/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you). */
2821
+ job_id: string;
2412
2822
  };
2413
2823
  cookie?: never;
2414
2824
  };
2415
2825
  requestBody?: never;
2416
2826
  responses: {
2417
- /** @description Invitation canceled, or already absent (not_found). */
2827
+ /** @description The job posting's full detail. Content fields (title, description) are returned verbatim and are never stored. */
2418
2828
  200: {
2419
2829
  headers: {
2420
2830
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -2427,18 +2837,35 @@ interface paths {
2427
2837
  * @description Response type discriminator.
2428
2838
  * @enum {string}
2429
2839
  */
2430
- object?: "invitation_canceled";
2431
- /** @description The canceled invitation's id. */
2432
- invitation_id?: string;
2433
- /**
2434
- * @description Outcome status. not_found means the invitation was already absent — not an error.
2435
- * @enum {string}
2436
- */
2437
- status?: "canceled" | "not_found";
2840
+ object: "job_posting";
2841
+ /** @description The job posting's numeric identifier. */
2842
+ id: string;
2843
+ /** @description Job title (content pass-through — never stored). */
2844
+ title: string;
2845
+ /** @description Hiring company's display name. */
2846
+ company: string;
2847
+ /** @description The hiring company's id — pass it to GET /v1/profiles/companies/{company_id}. */
2848
+ company_id: string;
2849
+ /** @description Posting lifecycle state (e.g. active). */
2850
+ state: string;
2851
+ /** @description Job location, or null when not set. */
2852
+ location: string | null;
2853
+ /** @description Posting cost, in the currency the account bills in. */
2854
+ cost: number;
2855
+ /** @description Number of applicants so far. */
2856
+ applicants_counter: number;
2857
+ /** @description Full job description text (content pass-through — never stored). */
2858
+ description: string;
2859
+ /** @description ISO-8601 UTC timestamp the posting was created, or null when not set. */
2860
+ created_at: string | null;
2861
+ /** @description ISO-8601 UTC timestamp the posting was published, or null when not set. */
2862
+ published_at: string | null;
2863
+ /** @description Hiring team members associated with this posting, when the posting exposes any. */
2864
+ hiring_team: unknown[];
2438
2865
  };
2439
2866
  };
2440
2867
  };
2441
- /** @description Invalid request — missing or malformed parameters. */
2868
+ /** @description Missing or empty account_id. */
2442
2869
  400: {
2443
2870
  headers: {
2444
2871
  [name: string]: unknown;
@@ -2456,7 +2883,16 @@ interface paths {
2456
2883
  "application/json": components["schemas"]["Error"];
2457
2884
  };
2458
2885
  };
2459
- /** @description Account not found or not owned by this tenant. */
2886
+ /** @description The account does not have the required Core seat. */
2887
+ 403: {
2888
+ headers: {
2889
+ [name: string]: unknown;
2890
+ };
2891
+ content: {
2892
+ "application/json": components["schemas"]["Error"];
2893
+ };
2894
+ };
2895
+ /** @description The account_id does not belong to this tenant, or the job posting was not found. */
2460
2896
  404: {
2461
2897
  headers: {
2462
2898
  [name: string]: unknown;
@@ -2465,7 +2901,16 @@ interface paths {
2465
2901
  "application/json": components["schemas"]["Error"];
2466
2902
  };
2467
2903
  };
2468
- /** @description Quota exceeded slow down and retry after the hinted delay. */
2904
+ /** @description The account is restricted and cannot be queried. */
2905
+ 422: {
2906
+ headers: {
2907
+ [name: string]: unknown;
2908
+ };
2909
+ content: {
2910
+ "application/json": components["schemas"]["Error"];
2911
+ };
2912
+ };
2913
+ /** @description Rate limited — slow down and retry after the hinted delay. */
2469
2914
  429: {
2470
2915
  headers: {
2471
2916
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -2477,7 +2922,7 @@ interface paths {
2477
2922
  "application/json": components["schemas"]["Error"];
2478
2923
  };
2479
2924
  };
2480
- /** @description Internal server error. */
2925
+ /** @description Internal error. */
2481
2926
  500: {
2482
2927
  headers: {
2483
2928
  [name: string]: unknown;
@@ -2486,7 +2931,7 @@ interface paths {
2486
2931
  "application/json": components["schemas"]["Error"];
2487
2932
  };
2488
2933
  };
2489
- /** @description A temporary error occurred while processing the request. */
2934
+ /** @description A temporary error occurred. Please try again. */
2490
2935
  502: {
2491
2936
  headers: {
2492
2937
  [name: string]: unknown;
@@ -2515,6 +2960,9 @@ interface paths {
2515
2960
  };
2516
2961
  };
2517
2962
  };
2963
+ put?: never;
2964
+ post?: never;
2965
+ delete?: never;
2518
2966
  options?: never;
2519
2967
  head?: never;
2520
2968
  patch?: never;
@@ -11212,6 +11660,176 @@ interface paths {
11212
11660
  patch?: never;
11213
11661
  trace?: never;
11214
11662
  };
11663
+ "/v1/recruiter/jobs/{job_id}": {
11664
+ parameters: {
11665
+ query?: never;
11666
+ header?: never;
11667
+ path?: never;
11668
+ cookie?: never;
11669
+ };
11670
+ /**
11671
+ * Get job posting
11672
+ * @description Returns one public LinkedIn job posting's full detail (RECRUITER lens) — title, company, location, description, and applicant count. Requires a Recruiter seat.
11673
+ */
11674
+ get: {
11675
+ parameters: {
11676
+ query: {
11677
+ /** @description The connected LinkedIn account to retrieve the job posting on behalf of. */
11678
+ account_id: string;
11679
+ };
11680
+ header?: never;
11681
+ path: {
11682
+ /** @description The numeric id of the job posting, e.g. 4428113858. This is the number in a LinkedIn job URL (https://www.linkedin.com/jobs/view/4428113858) and the job_urn value in a POST /v1/search/jobs result. Pass the number only — a full URL is not accepted by the API (the SDK and CLI extract the id from a URL for you). */
11683
+ job_id: string;
11684
+ };
11685
+ cookie?: never;
11686
+ };
11687
+ requestBody?: never;
11688
+ responses: {
11689
+ /** @description The job posting's full detail (RECRUITER lens — the same job_posting shape as the Core retrieve; content fields are returned verbatim and never stored). Requires a Recruiter seat. */
11690
+ 200: {
11691
+ headers: {
11692
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
11693
+ RateLimit: components["headers"]["RateLimit"];
11694
+ [name: string]: unknown;
11695
+ };
11696
+ content: {
11697
+ "application/json": {
11698
+ /**
11699
+ * @description Response type discriminator.
11700
+ * @enum {string}
11701
+ */
11702
+ object: "job_posting";
11703
+ /** @description The job posting's numeric identifier. */
11704
+ id: string;
11705
+ /** @description Job title (content pass-through — never stored). */
11706
+ title: string;
11707
+ /** @description Hiring company's display name. */
11708
+ company: string;
11709
+ /** @description The hiring company's id — pass it to GET /v1/profiles/companies/{company_id}. */
11710
+ company_id: string;
11711
+ /** @description Posting lifecycle state (e.g. active). */
11712
+ state: string;
11713
+ /** @description Job location, or null when not set. */
11714
+ location: string | null;
11715
+ /** @description Posting cost, in the currency the account bills in. */
11716
+ cost: number;
11717
+ /** @description Number of applicants so far. */
11718
+ applicants_counter: number;
11719
+ /** @description Full job description text (content pass-through — never stored). */
11720
+ description: string;
11721
+ /** @description ISO-8601 UTC timestamp the posting was created, or null when not set. */
11722
+ created_at: string | null;
11723
+ /** @description ISO-8601 UTC timestamp the posting was published, or null when not set. */
11724
+ published_at: string | null;
11725
+ /** @description Hiring team members associated with this posting, when the posting exposes any. */
11726
+ hiring_team: unknown[];
11727
+ };
11728
+ };
11729
+ };
11730
+ /** @description Missing or empty account_id. */
11731
+ 400: {
11732
+ headers: {
11733
+ [name: string]: unknown;
11734
+ };
11735
+ content: {
11736
+ "application/json": components["schemas"]["Error"];
11737
+ };
11738
+ };
11739
+ /** @description Missing or invalid API key, or LinkedIn authentication failed. */
11740
+ 401: {
11741
+ headers: {
11742
+ [name: string]: unknown;
11743
+ };
11744
+ content: {
11745
+ "application/json": components["schemas"]["Error"];
11746
+ };
11747
+ };
11748
+ /** @description The account does not have the required Recruiter seat. */
11749
+ 403: {
11750
+ headers: {
11751
+ [name: string]: unknown;
11752
+ };
11753
+ content: {
11754
+ "application/json": components["schemas"]["Error"];
11755
+ };
11756
+ };
11757
+ /** @description The account_id does not belong to this tenant, or the job posting was not found. */
11758
+ 404: {
11759
+ headers: {
11760
+ [name: string]: unknown;
11761
+ };
11762
+ content: {
11763
+ "application/json": components["schemas"]["Error"];
11764
+ };
11765
+ };
11766
+ /** @description The account is restricted and cannot be queried. */
11767
+ 422: {
11768
+ headers: {
11769
+ [name: string]: unknown;
11770
+ };
11771
+ content: {
11772
+ "application/json": components["schemas"]["Error"];
11773
+ };
11774
+ };
11775
+ /** @description Rate limited — slow down and retry after the hinted delay. */
11776
+ 429: {
11777
+ headers: {
11778
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
11779
+ RateLimit: components["headers"]["RateLimit"];
11780
+ "Retry-After": components["headers"]["Retry-After"];
11781
+ [name: string]: unknown;
11782
+ };
11783
+ content: {
11784
+ "application/json": components["schemas"]["Error"];
11785
+ };
11786
+ };
11787
+ /** @description Internal error. */
11788
+ 500: {
11789
+ headers: {
11790
+ [name: string]: unknown;
11791
+ };
11792
+ content: {
11793
+ "application/json": components["schemas"]["Error"];
11794
+ };
11795
+ };
11796
+ /** @description A temporary error occurred. Please try again. */
11797
+ 502: {
11798
+ headers: {
11799
+ [name: string]: unknown;
11800
+ };
11801
+ content: {
11802
+ "application/json": components["schemas"]["Error"];
11803
+ };
11804
+ };
11805
+ /** @description Service unavailable. */
11806
+ 503: {
11807
+ headers: {
11808
+ [name: string]: unknown;
11809
+ };
11810
+ content: {
11811
+ "application/json": components["schemas"]["Error"];
11812
+ };
11813
+ };
11814
+ /** @description Gateway timeout. */
11815
+ 504: {
11816
+ headers: {
11817
+ [name: string]: unknown;
11818
+ };
11819
+ content: {
11820
+ "application/json": components["schemas"]["Error"];
11821
+ };
11822
+ };
11823
+ };
11824
+ };
11825
+ put?: never;
11826
+ post?: never;
11827
+ delete?: never;
11828
+ options?: never;
11829
+ head?: never;
11830
+ patch?: never;
11831
+ trace?: never;
11832
+ };
11215
11833
  "/v1/recruiter/jobs/{job_id}/applicants": {
11216
11834
  parameters: {
11217
11835
  query?: never;
@@ -14903,8 +15521,10 @@ interface paths {
14903
15521
  /** @description Opaque next-call cursor. */
14904
15522
  version?: string;
14905
15523
  changes?: {
14906
- previous_status?: string | null;
14907
- current_status?: string;
15524
+ /** @enum {string|null} */
15525
+ previous_status?: "active" | "reconnect_needed" | "restricted" | "connecting" | "disconnected" | null;
15526
+ /** @enum {string} */
15527
+ current_status?: "active" | "reconnect_needed" | "restricted" | "connecting" | "disconnected";
14908
15528
  detected_at?: string;
14909
15529
  }[];
14910
15530
  };
@@ -15057,10 +15677,16 @@ type AccountSubmitCheckpointResult = paths["/v1/accounts/checkpoints/submit"]["p
15057
15677
  type AccountPollCheckpointBody = paths["/v1/accounts/checkpoints/poll"]["post"]["requestBody"]["content"]["application/json"];
15058
15678
  /** `POST /v1/accounts/checkpoints/poll` 200 body. */
15059
15679
  type AccountPollCheckpointResult = paths["/v1/accounts/checkpoints/poll"]["post"]["responses"]["200"]["content"]["application/json"];
15680
+ /** `POST /v1/accounts/checkpoints/resend` request body. */
15681
+ type AccountResendCheckpointBody = paths["/v1/accounts/checkpoints/resend"]["post"]["requestBody"]["content"]["application/json"];
15682
+ /** `POST /v1/accounts/checkpoints/resend` 200 body. */
15683
+ type AccountResendCheckpointResult = paths["/v1/accounts/checkpoints/resend"]["post"]["responses"]["200"]["content"]["application/json"];
15060
15684
  /** `POST /v1/accounts/connect-link` request body. */
15061
15685
  type AccountConnectLinkBody = paths["/v1/accounts/connect-link"]["post"]["requestBody"]["content"]["application/json"];
15062
15686
  /** `POST /v1/accounts/connect-link` 201 body. */
15063
15687
  type AccountConnectLinkResult = paths["/v1/accounts/connect-link"]["post"]["responses"]["201"]["content"]["application/json"];
15688
+ /** `GET /v1/accounts/connect-sessions/{session_id}` 200 body. */
15689
+ type AccountConnectSessionResult = paths["/v1/accounts/connect-sessions/{session_id}"]["get"]["responses"]["200"]["content"]["application/json"];
15064
15690
  /** `GET /v1/accounts/{account_id}` 200 body. */
15065
15691
  type AccountDetail = paths["/v1/accounts/{account_id}"]["get"]["responses"]["200"]["content"]["application/json"];
15066
15692
  /** `POST /v1/accounts/{account_id}/reconnect` request body. */
@@ -15109,11 +15735,35 @@ declare class AccountsResource {
15109
15735
  * Poll for mobile-app approval of a pending checkpoint challenge.
15110
15736
  */
15111
15737
  pollCheckpoint(body: AccountPollCheckpointBody): Promise<AccountPollCheckpointResult>;
15738
+ /**
15739
+ * Re-send the pending verification challenge notification for an account.
15740
+ *
15741
+ * Useful when the end user says they never received the code or push
15742
+ * notification for a pending checkpoint. `resent` echoes the result
15743
+ * honestly: `true` once the notification was actually re-sent, `false`
15744
+ * when there was nothing to re-send for that challenge type (this call
15745
+ * never throws just because a resend wasn't applicable). Does not reset
15746
+ * the checkpoint's expiry.
15747
+ */
15748
+ resendCheckpoint(body: AccountResendCheckpointBody): Promise<AccountResendCheckpointResult>;
15112
15749
  /**
15113
15750
  * Generate a one-time hosted connection link the end user opens to authorize a
15114
15751
  * LinkedIn connection without credentials transiting the API or LLM context.
15115
15752
  */
15116
15753
  createConnectLink(body: AccountConnectLinkBody): Promise<AccountConnectLinkResult>;
15754
+ /**
15755
+ * Poll a hosted connect session minted by {@link createConnectLink} (its
15756
+ * `session_id`).
15757
+ *
15758
+ * A pure status read — it makes no external call and does not itself complete
15759
+ * the connection. `status` is `pending` until the end user finishes the
15760
+ * hosted flow, then `resolved` (with `account_id`), or `expired` / `failed`.
15761
+ * Poll until it leaves `pending`.
15762
+ *
15763
+ * @param sessionId - the `session_id` returned on the connect-link 201 body.
15764
+ * @returns the session's current `status` and, once `resolved`, `account_id`.
15765
+ */
15766
+ getConnectSession(sessionId: string): Promise<AccountConnectSessionResult>;
15117
15767
  /**
15118
15768
  * Return metadata and current state for one connected account, including the
15119
15769
  * central `quotas[]` view for all tracked quota families and `seat_id` (the
@@ -15246,23 +15896,23 @@ declare class MessagingResource {
15246
15896
  */
15247
15897
 
15248
15898
  /** Strip `account_id` from a query-param type (injected by the account-scoped context). */
15249
- type WithoutAccountId<T> = Omit<T, "account_id">;
15899
+ type WithoutAccountId$1<T> = Omit<T, "account_id">;
15250
15900
  type ProfileDetail = paths["/v1/profiles/me"]["get"]["responses"]["200"]["content"]["application/json"];
15251
15901
  /** Caller-facing query params for `profiles.getMe()` — `account_id` is injected by context. */
15252
- type ProfileGetMeParams = WithoutAccountId<paths["/v1/profiles/me"]["get"]["parameters"]["query"]>;
15902
+ type ProfileGetMeParams = WithoutAccountId$1<paths["/v1/profiles/me"]["get"]["parameters"]["query"]>;
15253
15903
  type ProfileGetResult = paths["/v1/profiles/{profile_id}"]["get"]["responses"]["200"]["content"]["application/json"];
15254
15904
  /** Caller-facing query params for `profiles.get()` — `account_id` is injected by context. */
15255
- type ProfileGetParams = WithoutAccountId<paths["/v1/profiles/{profile_id}"]["get"]["parameters"]["query"]>;
15905
+ type ProfileGetParams = WithoutAccountId$1<paths["/v1/profiles/{profile_id}"]["get"]["parameters"]["query"]>;
15256
15906
  type ConnectionListPage = paths["/v1/profiles/relations"]["get"]["responses"]["200"]["content"]["application/json"];
15257
- type ConnectionListParams = WithoutAccountId<paths["/v1/profiles/relations"]["get"]["parameters"]["query"]>;
15907
+ type ConnectionListParams = WithoutAccountId$1<paths["/v1/profiles/relations"]["get"]["parameters"]["query"]>;
15258
15908
  type FollowerListPage = paths["/v1/profiles/{profile_id}/followers"]["get"]["responses"]["200"]["content"]["application/json"];
15259
- type FollowerListParams = WithoutAccountId<NonNullable<paths["/v1/profiles/{profile_id}/followers"]["get"]["parameters"]["query"]>>;
15909
+ type FollowerListParams = WithoutAccountId$1<NonNullable<paths["/v1/profiles/{profile_id}/followers"]["get"]["parameters"]["query"]>>;
15260
15910
  type ProfilePostListPage = paths["/v1/profiles/{profile_id}/posts"]["get"]["responses"]["200"]["content"]["application/json"];
15261
- type ProfilePostListParams = WithoutAccountId<NonNullable<paths["/v1/profiles/{profile_id}/posts"]["get"]["parameters"]["query"]>>;
15911
+ type ProfilePostListParams = WithoutAccountId$1<NonNullable<paths["/v1/profiles/{profile_id}/posts"]["get"]["parameters"]["query"]>>;
15262
15912
  type ProfileCommentListPage = paths["/v1/profiles/{profile_id}/comments"]["get"]["responses"]["200"]["content"]["application/json"];
15263
- type ProfileCommentListParams = WithoutAccountId<NonNullable<paths["/v1/profiles/{profile_id}/comments"]["get"]["parameters"]["query"]>>;
15913
+ type ProfileCommentListParams = WithoutAccountId$1<NonNullable<paths["/v1/profiles/{profile_id}/comments"]["get"]["parameters"]["query"]>>;
15264
15914
  type ProfileReactionListPage = paths["/v1/profiles/{profile_id}/reactions"]["get"]["responses"]["200"]["content"]["application/json"];
15265
- type ProfileReactionListParams = WithoutAccountId<NonNullable<paths["/v1/profiles/{profile_id}/reactions"]["get"]["parameters"]["query"]>>;
15915
+ type ProfileReactionListParams = WithoutAccountId$1<NonNullable<paths["/v1/profiles/{profile_id}/reactions"]["get"]["parameters"]["query"]>>;
15266
15916
  type CompanyProfile = paths["/v1/profiles/companies/{company_id}"]["get"]["responses"]["200"]["content"]["application/json"];
15267
15917
  type EndorseBody = paths["/v1/profiles/{profile_id}/endorse"]["post"]["requestBody"]["content"]["application/json"];
15268
15918
  type EndorseResult = paths["/v1/profiles/{profile_id}/endorse"]["post"]["responses"]["200"]["content"]["application/json"];
@@ -15538,12 +16188,48 @@ declare class SalesNavigatorResource {
15538
16188
  }
15539
16189
 
15540
16190
  /**
15541
- * Recruiter resource — 17 methods (tier: recruiter).
16191
+ * Jobs resource — 1 method.
16192
+ *
16193
+ * Account-scoped: the bound context injects `account_id` into every request.
16194
+ */
16195
+
16196
+ /** Strip `account_id` from a query-param type (injected by the account-scoped context). */
16197
+ type WithoutAccountId<T> = Omit<T, "account_id">;
16198
+ /**
16199
+ * The job-posting shape returned by `jobs.get()` and `recruiter.getJob()` —
16200
+ * the two endpoints return the same shape (Core vs. Recruiter lens), so this
16201
+ * is the single canonical type; `recruiter.ts` reuses it rather than
16202
+ * deriving a duplicate from its own path.
16203
+ */
16204
+ type JobPosting = paths["/v1/jobs/{job_id}"]["get"]["responses"]["200"]["content"]["application/json"];
16205
+ /** Caller-facing query params for `jobs.get()` — `account_id` is injected by context. */
16206
+ type JobGetParams = WithoutAccountId<paths["/v1/jobs/{job_id}"]["get"]["parameters"]["query"]>;
16207
+ declare class JobsResource {
16208
+ protected readonly ctx: RequestContext;
16209
+ constructor(ctx: RequestContext);
16210
+ /**
16211
+ * Retrieve one public LinkedIn job posting's full detail.
16212
+ * `GET /v1/jobs/{job_id}`
16213
+ *
16214
+ * Accepts a bare numeric job id or a full job URL
16215
+ * (`https://www.linkedin.com/jobs/view/{id}`) — the id is extracted
16216
+ * client-side; the wire request always carries the numeric id. Throws
16217
+ * `CurviateError({ code: 'INVALID_REQUEST' })` synchronously if neither
16218
+ * form can be recognized.
16219
+ * The `account_id` is injected by the account-scoped context.
16220
+ */
16221
+ get(jobIdOrUrl: string, params?: JobGetParams): Promise<JobPosting>;
16222
+ }
16223
+
16224
+ /**
16225
+ * Recruiter resource — 18 methods (tier: recruiter).
15542
16226
  *
15543
16227
  * Account-scoped: the bound context injects `account_id` into every request.
15544
16228
  * `startChat` accepts optional `attachments[]`, `voice_message`, and
15545
16229
  * `video_message`; the SDK builds the `FormData` body automatically.
15546
16230
  * `downloadResume` returns `Promise<ArrayBuffer>` (binary response).
16231
+ * `getJob` returns the same `JobPosting` shape as `jobs.get()` — reused, not
16232
+ * redefined, since both endpoints share the underlying job-posting retrieve.
15547
16233
  */
15548
16234
 
15549
16235
  type RecruiterSyncMessagesParams = NonNullable<paths["/v1/recruiter/messages/sync"]["get"]["parameters"]["query"]>;
@@ -15659,6 +16345,18 @@ declare class RecruiterResource {
15659
16345
  * `POST /v1/recruiter/jobs/{job_id}/checkpoint`
15660
16346
  */
15661
16347
  solveJobCheckpoint(jobId: string, body: RecruiterSolveJobCheckpointBody): Promise<RecruiterSolveJobCheckpointResult>;
16348
+ /**
16349
+ * Get a job posting via the Recruiter lens (any public posting, not only
16350
+ * the operator's own). `GET /v1/recruiter/jobs/{job_id}`
16351
+ *
16352
+ * Accepts a bare numeric job id or a full job URL
16353
+ * (`https://www.linkedin.com/jobs/view/{id}`) — the id is extracted
16354
+ * client-side, mirroring `jobs.get()`. Throws
16355
+ * `CurviateError({ code: 'INVALID_REQUEST' })` synchronously if neither
16356
+ * form can be recognized. Returns the same `JobPosting` shape as
16357
+ * `jobs.get()`.
16358
+ */
16359
+ getJob(jobIdOrUrl: string): Promise<JobPosting>;
15662
16360
  /**
15663
16361
  * List applicants for a job posting.
15664
16362
  * `GET /v1/recruiter/jobs/{job_id}/applicants`
@@ -15737,9 +16435,9 @@ declare class WebhooksResource {
15737
16435
  * Resource namespace assembly.
15738
16436
  *
15739
16437
  * The root client and every `account(id)` accessor expose the same set of
15740
- * resource namespaces. All 9 namespaces are fully implemented:
16438
+ * resource namespaces. All 10 namespaces are fully implemented:
15741
16439
  * accounts, messaging, profiles, invites, search, posts,
15742
- * salesNavigator, recruiter, and webhooks.
16440
+ * salesNavigator, recruiter, jobs, and webhooks.
15743
16441
  */
15744
16442
 
15745
16443
  /** The full namespace surface, shared by the root client and account scopes. */
@@ -15752,6 +16450,7 @@ interface ResourceNamespaces {
15752
16450
  posts: PostsResource;
15753
16451
  salesNavigator: SalesNavigatorResource;
15754
16452
  recruiter: RecruiterResource;
16453
+ jobs: JobsResource;
15755
16454
  webhooks: WebhooksResource;
15756
16455
  }
15757
16456
  /**
@@ -15785,6 +16484,7 @@ declare class Curviate {
15785
16484
  readonly posts: PostsResource;
15786
16485
  readonly salesNavigator: SalesNavigatorResource;
15787
16486
  readonly recruiter: RecruiterResource;
16487
+ readonly jobs: JobsResource;
15788
16488
  readonly webhooks: WebhooksResource;
15789
16489
  constructor(config: CurviateConfig);
15790
16490
  /**