@curviate/sdk 0.40.1 → 0.42.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.
@@ -625,7 +625,7 @@ export interface paths {
625
625
  put?: never;
626
626
  /**
627
627
  * Search posts
628
- * @description Searches LinkedIn posts using structured filters. To search from a pasted LinkedIn search URL instead, use POST .../search. Post text, engagement counters, author, and attachments are returned.
628
+ * @description Searches LinkedIn posts using structured filters. To search from a pasted LinkedIn search URL instead, use POST .../search. Returns text, counts, author and attachments; the text can repeat fragments around links, mentions and hashtags, so get the post by its id for the clean body.
629
629
  */
630
630
  post: operations["postV1AccountIdSearchPosts"];
631
631
  delete?: never;
@@ -1477,7 +1477,7 @@ export interface paths {
1477
1477
  put?: never;
1478
1478
  /**
1479
1479
  * Create a post
1480
- * @description Publishes a post on the authenticated LinkedIn account. Send application/json; attach files as base64 objects. Post text passes through to the platform and is never stored.
1480
+ * @description Publishes a post now; JSON, files as base64. Text is never stored. A publish record (account, post id, time) is kept, listed by GET /v1/drafts?status=published and removed when the post is deleted. To publish later, create a Draft at POST /v1/drafts.
1481
1481
  */
1482
1482
  post: operations["postV1AccountIdPosts"];
1483
1483
  delete?: never;
@@ -1598,6 +1598,98 @@ export interface paths {
1598
1598
  patch?: never;
1599
1599
  trace?: never;
1600
1600
  };
1601
+ "/v1/drafts": {
1602
+ parameters: {
1603
+ query?: never;
1604
+ header?: never;
1605
+ path?: never;
1606
+ cookie?: never;
1607
+ };
1608
+ /**
1609
+ * List drafts
1610
+ * @description Lists your Drafts and, with status=published, publish records (account, post id, time; never Drafts). Filter by status, account (or none) and a [from, to) range on each item's own date.
1611
+ */
1612
+ get: operations["getV1Drafts"];
1613
+ put?: never;
1614
+ /**
1615
+ * Create a draft
1616
+ * @description Stores an unpublished post until it is published or deleted. Every field is optional, the account too; a Draft has at most one account and can move between yours. Up to 50 Drafts and 2 GiB of media per account, and per no-account. A retry creates a second Draft.
1617
+ */
1618
+ post: operations["postV1Drafts"];
1619
+ delete?: never;
1620
+ options?: never;
1621
+ head?: never;
1622
+ patch?: never;
1623
+ trace?: never;
1624
+ };
1625
+ "/v1/drafts/{id}": {
1626
+ parameters: {
1627
+ query?: never;
1628
+ header?: never;
1629
+ path?: never;
1630
+ cookie?: never;
1631
+ };
1632
+ /**
1633
+ * Retrieve a draft
1634
+ * @description Returns one Draft, with a fresh signed link (valid 1 hour) for each attachment.
1635
+ */
1636
+ get: operations["getV1DraftsId"];
1637
+ put?: never;
1638
+ post?: never;
1639
+ /**
1640
+ * Delete a draft
1641
+ * @description Deletes the Draft and its stored media.
1642
+ */
1643
+ delete: operations["deleteV1DraftsId"];
1644
+ options?: never;
1645
+ head?: never;
1646
+ /**
1647
+ * Update a draft
1648
+ * @description Partial update: an omitted field is left as is, null clears it. attachments replaces the whole list ({id} keeps an existing file, a base64 object adds one, anything left out is deleted). account_id moves the Draft to another of your accounts. Editing a failed Draft clears its failure.
1649
+ */
1650
+ patch: operations["patchV1DraftsId"];
1651
+ trace?: never;
1652
+ };
1653
+ "/v1/drafts/{id}/publish": {
1654
+ parameters: {
1655
+ query?: never;
1656
+ header?: never;
1657
+ path?: never;
1658
+ cookie?: never;
1659
+ };
1660
+ get?: never;
1661
+ put?: never;
1662
+ /**
1663
+ * Publish a draft now
1664
+ * @description Publishes the Draft now, under the same rules as create post, safety limits included. Success deletes the Draft and its media, writes a publish record and returns the post id, no webhook. Failure leaves the Draft unchanged.
1665
+ */
1666
+ post: operations["postV1DraftsIdPublish"];
1667
+ delete?: never;
1668
+ options?: never;
1669
+ head?: never;
1670
+ patch?: never;
1671
+ trace?: never;
1672
+ };
1673
+ "/v1/drafts/{id}/attachments": {
1674
+ parameters: {
1675
+ query?: never;
1676
+ header?: never;
1677
+ path?: never;
1678
+ cookie?: never;
1679
+ };
1680
+ get?: never;
1681
+ put?: never;
1682
+ /**
1683
+ * Upload a draft attachment
1684
+ * @description Adds one file to the Draft as the raw request body, for media too large to send inline: a video (MP4, up to 50 MiB), a PDF (up to 50 MiB) or an image. Content-Type is the file's type, Content-Length is required; kept only if it arrives whole. Same media rules as inline.
1685
+ */
1686
+ post: operations["postV1DraftsIdAttachments"];
1687
+ delete?: never;
1688
+ options?: never;
1689
+ head?: never;
1690
+ patch?: never;
1691
+ trace?: never;
1692
+ };
1601
1693
  "/v1/{account_id}/recruiter/profiles/{user_id}": {
1602
1694
  parameters: {
1603
1695
  query?: never;
@@ -2292,8 +2384,8 @@ export interface paths {
2292
2384
  options?: never;
2293
2385
  head?: never;
2294
2386
  /**
2295
- * Update account metadata / proxy configuration
2296
- * @description Updates an account's metadata (a flat string map, replaced wholesale) and/or its custom proxy egress; pass a proxy object to set one, or null to clear it. Credentials and seat are untouched.
2387
+ * Update an account's metadata or connection location
2388
+ * @description Updates metadata, external_id, the connection location (country) or your own proxy (null plus a country returns to a managed location). Returns the account; connection_location is re-read after a location change.
2297
2389
  */
2298
2390
  patch: operations["patchV1AccountsAccountId"];
2299
2391
  trace?: never;
@@ -2513,7 +2605,7 @@ export interface paths {
2513
2605
  put?: never;
2514
2606
  /**
2515
2607
  * Create a webhook
2516
- * @description Registers a new webhook endpoint to receive real-time events. Choose a source (messaging / user / account_status) and supply the target URL. The HMAC signing secret is returned exactly once in the 201 response, store it securely.
2608
+ * @description Registers a new webhook endpoint to receive real-time events. Choose a source (messaging / user / account_status / post) and supply the target URL. The HMAC signing secret is returned exactly once in the 201 response, store it securely.
2517
2609
  */
2518
2610
  post: operations["postV1Webhooks"];
2519
2611
  delete?: never;
@@ -2531,7 +2623,7 @@ export interface paths {
2531
2623
  };
2532
2624
  /**
2533
2625
  * List webhook event types
2534
- * @description Returns the complete canonical event catalogue (27 events) grouped by source: messaging (7), user (2), account_status (15), plus 3 recruiter/sales_nav events. A local catalogue read: no platform call is made.
2626
+ * @description Returns the complete canonical event catalogue (29 events) grouped by source: messaging (7), user (2), account_status (15), post (2), plus 3 recruiter/sales_nav events. A local catalogue read: no platform call is made.
2535
2627
  */
2536
2628
  get: operations["getV1WebhooksEvents"];
2537
2629
  put?: never;
@@ -2789,6 +2881,20 @@ export interface components {
2789
2881
  challenge_type?: string;
2790
2882
  /** @description Present on ACCOUNT_ALREADY_LINKED: the id of your own existing account for this LinkedIn profile, so you can reuse it instead of linking again. Only ever an account of the calling tenant. */
2791
2883
  account_id?: string;
2884
+ /** @description Present on CONNECTION_LOCATION_UNAVAILABLE after a location PATCH that did not land where asked: where the account connects from now (country, current_country, mode, strict), re-read after the change. */
2885
+ connection_location?: {
2886
+ /** @description Configured country (ISO 3166-1 alpha-2). */
2887
+ country?: string | null;
2888
+ /** @description Country of the connection in use now. */
2889
+ current_country?: string | null;
2890
+ /**
2891
+ * @description auto: managed. custom: your own proxy.
2892
+ * @enum {string|null}
2893
+ */
2894
+ mode?: "auto" | "custom" | null;
2895
+ /** @description true: never connects from another country. */
2896
+ strict?: boolean | null;
2897
+ };
2792
2898
  /** @description Present on RATE_LIMIT_ACCOUNT: the per-account request ceiling that was breached, with its name, the units remaining and total, and the absolute reset_time. Wait until reset_time before retrying. */
2793
2899
  quota?: Record<string, never>;
2794
2900
  /** @description Present on TOOLSET_DISABLED: the name of the toolset that is switched off for this tenant, so you can enable it or use another tool. */
@@ -5960,13 +6066,20 @@ export interface operations {
5960
6066
  id: string;
5961
6067
  /** @description Shareable post URL. Present when available. */
5962
6068
  share_url?: string;
5963
- /** @description Post text content. Present when available. */
6069
+ /** @description Post text content. Present when available. Can repeat fragments around links, mentions and hashtags; get the post by its id for the clean body. */
5964
6070
  text?: string;
6071
+ /** @description ISO-8601 UTC datetime the post was published, derived from the post's own activity identity (the same source as get-post's `created_at`). null when the result carries no activity identity to derive it from. */
6072
+ created_at: string | null;
5965
6073
  /** @description Post author object. Present when available. */
5966
6074
  author?: {
5967
6075
  id?: string;
6076
+ /** @description Author's display name, on the shape that carries `name`. Read `name` when present, else `display_name`. */
5968
6077
  name?: string | null;
6078
+ /** @description Author's display name, on the shape that carries `display_name` instead of `name`. */
6079
+ display_name?: string;
5969
6080
  is_company?: boolean;
6081
+ /** @description Author entity type (for example individual or organization), on the shape that carries `display_name`. */
6082
+ type?: string;
5970
6083
  public_identifier?: string | null;
5971
6084
  } & {
5972
6085
  [key: string]: unknown;
@@ -9048,13 +9161,20 @@ export interface operations {
9048
9161
  id: string;
9049
9162
  /** @description Shareable post URL. Present when available. */
9050
9163
  share_url?: string;
9051
- /** @description Post text content. Present when available. */
9164
+ /** @description Post text content. Present when available. Can repeat fragments around links, mentions and hashtags; get the post by its id for the clean body. */
9052
9165
  text?: string;
9166
+ /** @description ISO-8601 UTC datetime the post was published, derived from the post's own activity identity (the same source as get-post's `created_at`). null when the result carries no activity identity to derive it from. */
9167
+ created_at: string | null;
9053
9168
  /** @description Post author object. Present when available. */
9054
9169
  author?: {
9055
9170
  id?: string;
9171
+ /** @description Author's display name, on the shape that carries `name`. Read `name` when present, else `display_name`. */
9056
9172
  name?: string | null;
9173
+ /** @description Author's display name, on the shape that carries `display_name` instead of `name`. */
9174
+ display_name?: string;
9057
9175
  is_company?: boolean;
9176
+ /** @description Author entity type (for example individual or organization), on the shape that carries `display_name`. */
9177
+ type?: string;
9058
9178
  public_identifier?: string | null;
9059
9179
  } & {
9060
9180
  [key: string]: unknown;
@@ -9577,13 +9697,20 @@ export interface operations {
9577
9697
  id: string;
9578
9698
  /** @description Shareable post URL. Present when available. */
9579
9699
  share_url?: string;
9580
- /** @description Post text content. Present when available. */
9700
+ /** @description Post text content. Present when available. Can repeat fragments around links, mentions and hashtags; get the post by its id for the clean body. */
9581
9701
  text?: string;
9702
+ /** @description ISO-8601 UTC datetime the post was published, derived from the post's own activity identity (the same source as get-post's `created_at`). null when the result carries no activity identity to derive it from. */
9703
+ created_at: string | null;
9582
9704
  /** @description Post author object. Present when available. */
9583
9705
  author?: {
9584
9706
  id?: string;
9707
+ /** @description Author's display name, on the shape that carries `name`. Read `name` when present, else `display_name`. */
9585
9708
  name?: string | null;
9709
+ /** @description Author's display name, on the shape that carries `display_name` instead of `name`. */
9710
+ display_name?: string;
9586
9711
  is_company?: boolean;
9712
+ /** @description Author entity type (for example individual or organization), on the shape that carries `display_name`. */
9713
+ type?: string;
9587
9714
  public_identifier?: string | null;
9588
9715
  } & {
9589
9716
  [key: string]: unknown;
@@ -12904,7 +13031,7 @@ export interface operations {
12904
13031
  };
12905
13032
  requestBody?: never;
12906
13033
  responses: {
12907
- /** @description The connected account's home feed as agent-actionable posts. `sort=recent` (default) resolves each post's activity id + author name + post URL + kind; `sort=relevant` resolves the full shape (text, engagement, author id-triple). An empty feed is a valid 200 (items:[], cursor:null). Page until cursor is null. */
13034
+ /** @description The connected account's home feed as agent-actionable posts. `sort=recent` (default) resolves each post's activity id + created_at + text + author name + post URL + kind, with engagement null; `sort=relevant` resolves the full shape (text, engagement, author id-triple). An empty feed is a valid 200 (items:[], cursor:null). Page until cursor is null. */
12908
13035
  200: {
12909
13036
  headers: {
12910
13037
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -12951,8 +13078,10 @@ export interface operations {
12951
13078
  /** @description Canonical profile URL. */
12952
13079
  profile_url: string | null;
12953
13080
  };
12954
- /** @description Full post body, verbatim (relevant). null on recent (the body is nested deep in the source). Pass-through, never stored. */
13081
+ /** @description Full post body, verbatim, on both sorts. null when the post has no body. Pass-through, never stored. */
12955
13082
  text: string | null;
13083
+ /** @description ISO-8601 UTC datetime the feed activity was created, derived from the activity id (the same source as get-post's `created_at`). Both sorts. For a reshare this is when the reshare was made. null when the id does not carry a time. */
13084
+ created_at: string | null;
12956
13085
  /** @description Canonical post URL (recent). null on relevant. */
12957
13086
  post_url: string | null;
12958
13087
  /** @description Post type parsed from the URL slug: ugcPost | share | groupPost | activity | post (recent). Open enum. null on relevant. */
@@ -12968,14 +13097,14 @@ export interface operations {
12968
13097
  /** @description Original post body (pass-through; never stored). */
12969
13098
  text: string | null;
12970
13099
  } | null;
12971
- /** @description Engagement counts. All 0 on recent. */
13100
+ /** @description Engagement counts. Every count is null on recent, which cannot read them; use sort=relevant for counts. A null count is unknown, never zero. */
12972
13101
  engagement: {
12973
- /** @description Reaction count. Defaults 0. */
12974
- likes: number;
12975
- /** @description Comment count. Defaults 0. */
12976
- comments: number;
12977
- /** @description Reshare count. Defaults 0. */
12978
- shares: number;
13102
+ /** @description Reaction count, or null when the sort cannot read it. */
13103
+ likes: number | null;
13104
+ /** @description Comment count, or null when the sort cannot read it. */
13105
+ comments: number | null;
13106
+ /** @description Reshare count, or null when the sort cannot read it. */
13107
+ shares: number | null;
12979
13108
  };
12980
13109
  }[];
12981
13110
  /** @description Opaque cursor for the next page; null when the walk is exhausted. Self-describing of the sort, pass it back verbatim as `cursor`. The relevant cursor expires (~1h). There is no total (an unbounded, reordering stream); page until cursor is null. */
@@ -18030,7 +18159,7 @@ export interface operations {
18030
18159
  title?: string | null;
18031
18160
  /** @description Full post text (content pass-through, never stored). */
18032
18161
  text?: string | null;
18033
- /** @description ISO-8601 UTC datetime this post was created, or null if unavailable. Derived from the post's own identity, so it does not change with the route you used to reach it. For a repost this is when the repost was made, not when the post it reshares was, so it is safe to sort by recency. */
18162
+ /** @description ISO-8601 UTC datetime this post was published, or null when it cannot be told reliably. Derived from the post's own activity identity, so it does not change with the route you used to reach it. null when the post carries no activity identity of its own (often a video or image post), never a guess. For a repost this is when the repost was made, not when the post it reshares was. */
18034
18163
  created_at?: string | null;
18035
18164
  /** @description Total comment count, or null when the platform hides it. */
18036
18165
  comment_count?: number | null;
@@ -18514,7 +18643,7 @@ export interface operations {
18514
18643
  title?: string | null;
18515
18644
  /** @description Full post text (content pass-through, never stored). */
18516
18645
  text?: string | null;
18517
- /** @description ISO-8601 UTC datetime this post was created, or null if unavailable. Derived from the post's own identity, so it does not change with the route you used to reach it. For a repost this is when the repost was made, not when the post it reshares was, so it is safe to sort by recency. */
18646
+ /** @description ISO-8601 UTC datetime this post was published, or null when it cannot be told reliably. Derived from the post's own activity identity, so it does not change with the route you used to reach it. null when the post carries no activity identity of its own (often a video or image post), never a guess. For a repost this is when the repost was made, not when the post it reshares was. */
18518
18647
  created_at?: string | null;
18519
18648
  /** @description Total comment count, or null when the platform hides it. */
18520
18649
  comment_count?: number | null;
@@ -19707,24 +19836,31 @@ export interface operations {
19707
19836
  };
19708
19837
  };
19709
19838
  };
19710
- getV1AccountIdRecruiterProfilesUserId: {
19839
+ getV1Drafts: {
19711
19840
  parameters: {
19712
19841
  query?: {
19713
- /** @description Recruiter profile sections to fetch, repeatable: linkedin_experience, linkedin_skills, and others (each has a _preview variant). Omit for base fields only. */
19714
- with_sections?: ("linkedin_*" | "linkedin_experience" | "linkedin_education" | "linkedin_languages" | "linkedin_skills" | "linkedin_certifications" | "linkedin_volunteer_experience" | "linkedin_projects" | "linkedin_recommendations" | "linkedin_interests" | "linkedin_recruiting_activity" | "linkedin_*_preview" | "linkedin_experience_preview" | "linkedin_education_preview" | "linkedin_languages_preview" | "linkedin_skills_preview" | "linkedin_certifications_preview" | "linkedin_volunteer_experience_preview" | "linkedin_projects_preview" | "linkedin_recommendations_preview" | "linkedin_interests_preview" | "linkedin_recruiting_activity_preview")[];
19842
+ /** @description Comma list of draft, scheduled, failed, published. Default draft,scheduled,failed. published items are publish records, never Drafts. */
19843
+ status?: ("draft" | "scheduled" | "failed" | "published")[];
19844
+ /** @description Only items on this account (acc_...), or none for Drafts with no account. Omitted: all of yours. */
19845
+ account_id?: string;
19846
+ /** @description Only items whose date is at or after this instant (inclusive). */
19847
+ from?: string;
19848
+ /** @description Only items whose date is before this instant (exclusive). */
19849
+ to?: string;
19850
+ /** @description Sort by the item's date: desc (default) or asc. */
19851
+ order?: "desc" | "asc";
19852
+ /** @description Max items per page (1-100, default 20). */
19853
+ limit?: number;
19854
+ /** @description Pagination cursor from a previous response; pass it back verbatim with the same filters. */
19855
+ cursor?: string;
19715
19856
  };
19716
19857
  header?: never;
19717
- path: {
19718
- /** @description The account ID (`acc_...`) whose Recruiter seat resolves the profile view. */
19719
- account_id: string;
19720
- /** @description The target profile: 'me', a public identifier, or a member ID. */
19721
- user_id: string;
19722
- };
19858
+ path?: never;
19723
19859
  cookie?: never;
19724
19860
  };
19725
19861
  requestBody?: never;
19726
19862
  responses: {
19727
- /** @description Recruiter-enriched profile. Returns the base profile shape plus the recruiting_profile enrichment. Section arrays under specifics (skills, experience, education, etc.) are only present when the corresponding with_sections value was requested. No inline quota; read from GET /v1/accounts/{account_id}. Requires a Recruiter seat. */
19863
+ /** @description Drafts and publish records, ordered by each item's own date: scheduled_at for scheduled, failure.failed_at for failed, published_at for published, updated_at for draft. */
19728
19864
  200: {
19729
19865
  headers: {
19730
19866
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -19737,69 +19873,1102 @@ export interface operations {
19737
19873
  * @description Response type discriminator.
19738
19874
  * @enum {string}
19739
19875
  */
19740
- object: "recruiter_profile";
19741
- /** @description The profile's opaque identifier. */
19742
- id: string;
19876
+ object: "draft_list";
19877
+ /** @description Each item is a draft (object: draft) or a publish record (object: publish_record). Publish records are never Drafts. */
19878
+ items: ({
19879
+ /**
19880
+ * @description Response type discriminator.
19881
+ * @enum {string}
19882
+ */
19883
+ object: "draft";
19884
+ /** @description Draft id (drf_...). */
19885
+ id: string;
19886
+ /** @description The account this Draft will publish as, or null for none yet. */
19887
+ account_id: string | null;
19888
+ /**
19889
+ * @description Derived: failed if failure is set, else scheduled if scheduled_at is set, else draft.
19890
+ * @enum {string}
19891
+ */
19892
+ status: "draft" | "scheduled" | "failed";
19893
+ /** @description Post body text. May be empty or null while drafting. */
19894
+ text: string | null;
19895
+ /** @description Media, in post order. */
19896
+ attachments: {
19897
+ /** @description Attachment id (att_...). Send {id} in a PATCH attachments list to keep it. */
19898
+ id: string;
19899
+ /** @description The file's type. */
19900
+ content_type: string;
19901
+ /** @description File name. */
19902
+ filename: string;
19903
+ /** @description Stored size in bytes. */
19904
+ size_bytes: number;
19905
+ /** @description Signed download link to the stored file, valid for 1 hour. Read the Draft again for a fresh one. Null when the stored file is unavailable. */
19906
+ url: string | null;
19907
+ }[];
19908
+ /** @description A post to quote or repost when published. */
19909
+ quoted_post_id?: string | null;
19910
+ /**
19911
+ * @description Who can read the post once published.
19912
+ * @enum {string|null}
19913
+ */
19914
+ can_read?: "anyone" | "relations_only" | null;
19915
+ /**
19916
+ * @description Who may comment once published.
19917
+ * @enum {string|null}
19918
+ */
19919
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
19920
+ /** @description Company page id to post as. */
19921
+ post_as?: string | null;
19922
+ /** @description When Curviate publishes the Draft (UTC, whole minute), or null. It goes out up to 20 seconds after this time. A failed Draft has null here; the time that failed is failure.scheduled_at. */
19923
+ scheduled_at: string | null;
19924
+ /** @description Why the last scheduled publish failed; present on failed Drafts only. */
19925
+ failure: {
19926
+ /**
19927
+ * @description Why it failed. outcome_unknown: the platform gave no usable answer, so the post may be live; check the account's posts before you publish again. missed: Curviate could not start within an hour of the time. platform_error and rate_limited: 3 attempts over about 15 minutes all failed.
19928
+ * @enum {string}
19929
+ */
19930
+ code?: "platform_error" | "rate_limited" | "account_unavailable" | "media_rejected" | "budget_exhausted" | "outside_activity_window" | "no_active_seat" | "not_publishable" | "platform_rejected" | "missed" | "outcome_unknown";
19931
+ /** @description What went wrong and what to do next. Never contains post text. */
19932
+ message?: string;
19933
+ /** @description When it failed. */
19934
+ failed_at?: string;
19935
+ /** @description The time that failed to publish. */
19936
+ scheduled_at?: string;
19937
+ } | null;
19938
+ /** @description Creation time. */
19939
+ created_at: string;
19940
+ /** @description Last change. */
19941
+ updated_at: string;
19942
+ } | {
19943
+ /**
19944
+ * @description Response type discriminator.
19945
+ * @enum {string}
19946
+ */
19947
+ object: "publish_record";
19948
+ /** @description The published post's id, or null when the platform returned none. */
19949
+ post_id: string | null;
19950
+ /** @description The account that published it. */
19951
+ account_id: string;
19952
+ /** @description When it was published. */
19953
+ published_at: string;
19954
+ /** @description The Draft it came from, or null for a post created directly. */
19955
+ draft_id: string | null;
19956
+ })[];
19957
+ /** @description Pass back as cursor for the next page; null on the last page. */
19958
+ cursor: string | null;
19959
+ safety_warning?: components["schemas"]["SafetyWarning"];
19960
+ };
19961
+ };
19962
+ };
19963
+ /** @description Invalid filter: an unknown status, a malformed date or cursor, or limit out of range. */
19964
+ 400: {
19965
+ headers: {
19966
+ [name: string]: unknown;
19967
+ };
19968
+ content: {
19969
+ "application/json": components["schemas"]["Error"];
19970
+ };
19971
+ };
19972
+ /** @description Missing or invalid API key. */
19973
+ 401: {
19974
+ headers: {
19975
+ [name: string]: unknown;
19976
+ };
19977
+ content: {
19978
+ "application/json": components["schemas"]["Error"];
19979
+ };
19980
+ };
19981
+ /** @description Rate limited, slow down and retry after the hinted delay. */
19982
+ 429: {
19983
+ headers: {
19984
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
19985
+ RateLimit: components["headers"]["RateLimit"];
19986
+ "Retry-After": components["headers"]["Retry-After"];
19987
+ [name: string]: unknown;
19988
+ };
19989
+ content: {
19990
+ "application/json": components["schemas"]["Error"];
19991
+ };
19992
+ };
19993
+ };
19994
+ };
19995
+ postV1Drafts: {
19996
+ parameters: {
19997
+ query?: never;
19998
+ header?: never;
19999
+ path?: never;
20000
+ cookie?: never;
20001
+ };
20002
+ requestBody: {
20003
+ content: {
20004
+ "application/json": {
20005
+ /** @description The account (acc_...) this Draft will publish as, or null for none yet. A Draft belongs to at most one account. */
20006
+ account_id?: string | null;
20007
+ /** @description When Curviate publishes this Draft: an ISO 8601 date-time with an offset, at least 5 minutes and at most 365 days ahead, stored in UTC truncated to the minute. Scheduling needs an account and text. Curviate publishes it up to 20 seconds after this time, and keeps scheduled posts on one account at least 5 minutes apart. null unschedules. */
20008
+ scheduled_at?: string | null;
20009
+ /** @description Post body text, up to 3000 characters. May be empty while drafting; publishing needs at least one character. */
20010
+ text?: string | null;
20011
+ /** @description A post to quote or repost when published, the same as on create post. Checked at publish time. */
20012
+ quoted_post_id?: string | null;
20013
+ /**
20014
+ * @description Who can read the post once published.
20015
+ * @enum {string|null}
20016
+ */
20017
+ can_read?: "anyone" | "relations_only" | null;
20018
+ /**
20019
+ * @description Who may comment once published.
20020
+ * @enum {string|null}
20021
+ */
20022
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
20023
+ /** @description Company page id to post as; the account must administer it. Checked at publish time. */
20024
+ post_as?: string | null;
20025
+ /** @description Media as base64 objects: up to 20 images, or one MP4 video, or one PDF, never mixed. 5 MiB per file inline. */
20026
+ attachments?: {
20027
+ /** @description Base64-encoded file bytes. */
20028
+ content: string;
20029
+ /** @description The file's type: image/jpeg, image/png, image/gif, image/webp, video/mp4 or application/pdf. */
20030
+ content_type: string;
20031
+ /** @description File name. */
20032
+ filename: string;
20033
+ }[];
20034
+ };
20035
+ };
20036
+ };
20037
+ responses: {
20038
+ /** @description Draft created. With scheduled_at, status is scheduled and Curviate publishes it on its own. With scheduled_at, the response carries safety_warning (reason activity_window) when the time is outside the account's activity window and its posture is warn; under enforce the request is refused instead (429 BUDGET_EXHAUSTED, reason activity_window) and nothing is saved. */
20039
+ 201: {
20040
+ headers: {
20041
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20042
+ RateLimit: components["headers"]["RateLimit"];
20043
+ [name: string]: unknown;
20044
+ };
20045
+ content: {
20046
+ "application/json": {
19743
20047
  /**
19744
- * @description Profile type.
20048
+ * @description Response type discriminator.
19745
20049
  * @enum {string}
19746
20050
  */
19747
- type: "individual" | "organization" | "other";
19748
- /** @description The member's display name. */
19749
- display_name: string;
20051
+ object: "draft";
20052
+ /** @description Draft id (drf_...). */
20053
+ id: string;
20054
+ /** @description The account this Draft will publish as, or null for none yet. */
20055
+ account_id: string | null;
19750
20056
  /**
19751
- * @description Source platform.
20057
+ * @description Derived: failed if failure is set, else scheduled if scheduled_at is set, else draft.
19752
20058
  * @enum {string}
19753
20059
  */
19754
- provider: "linkedin";
19755
- /** @description First name. */
19756
- first_name?: string;
19757
- /** @description Last name. */
19758
- last_name?: string;
19759
- /** @description LinkedIn public URL slug (e.g. 'jane-doe'). */
19760
- public_identifier?: string;
19761
- /** @description Full LinkedIn profile URL. */
19762
- profile_url?: string;
19763
- /** @description Profile picture URL. */
19764
- public_picture_url?: string;
19765
- /** @description Large profile picture URL. */
19766
- public_picture_url_large?: string;
19767
- /** @description The member's professional headline. Reading it back through Curviate stores it in your tenant's entity records, with no expiry. */
19768
- description?: string;
19769
- /** @description Geographic location string. */
19770
- location?: string;
19771
- /** @description Structured profile-lens data, incl. connection distance and (when requested) section arrays. */
19772
- specifics?: {
20060
+ status: "draft" | "scheduled" | "failed";
20061
+ /** @description Post body text. May be empty or null while drafting. */
20062
+ text: string | null;
20063
+ /** @description Media, in post order. */
20064
+ attachments: {
20065
+ /** @description Attachment id (att_...). Send {id} in a PATCH attachments list to keep it. */
20066
+ id: string;
20067
+ /** @description The file's type. */
20068
+ content_type: string;
20069
+ /** @description File name. */
20070
+ filename: string;
20071
+ /** @description Stored size in bytes. */
20072
+ size_bytes: number;
20073
+ /** @description Signed download link to the stored file, valid for 1 hour. Read the Draft again for a fresh one. Null when the stored file is unavailable. */
20074
+ url: string | null;
20075
+ }[];
20076
+ /** @description A post to quote or repost when published. */
20077
+ quoted_post_id?: string | null;
20078
+ /**
20079
+ * @description Who can read the post once published.
20080
+ * @enum {string|null}
20081
+ */
20082
+ can_read?: "anyone" | "relations_only" | null;
20083
+ /**
20084
+ * @description Who may comment once published.
20085
+ * @enum {string|null}
20086
+ */
20087
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
20088
+ /** @description Company page id to post as. */
20089
+ post_as?: string | null;
20090
+ /** @description When Curviate publishes the Draft (UTC, whole minute), or null. It goes out up to 20 seconds after this time. A failed Draft has null here; the time that failed is failure.scheduled_at. */
20091
+ scheduled_at: string | null;
20092
+ /** @description Why the last scheduled publish failed; present on failed Drafts only. */
20093
+ failure: {
19773
20094
  /**
19774
- * @description Connection distance from the operator account.
20095
+ * @description Why it failed. outcome_unknown: the platform gave no usable answer, so the post may be live; check the account's posts before you publish again. missed: Curviate could not start within an hour of the time. platform_error and rate_limited: 3 attempts over about 15 minutes all failed.
19775
20096
  * @enum {string}
19776
20097
  */
19777
- network_distance?: "SELF" | "FIRST_DEGREE" | "SECOND_DEGREE" | "THIRD_DEGREE" | "OUT_OF_NETWORK";
19778
- /** @description The member's platform-native ID. */
19779
- member_id?: string;
19780
- /** @description Whether an InMail can be sent to this member. */
19781
- can_send_inmail?: boolean;
19782
- /** @description Whether the member has Open Profile enabled. */
19783
- is_open_profile?: boolean;
19784
- /** @description Whether the member has a LinkedIn Premium subscription. */
19785
- is_premium?: boolean;
19786
- /** @description Whether the member is a LinkedIn creator. */
19787
- is_creator?: boolean;
19788
- /** @description Whether the member has hiring mode active. */
19789
- is_hiring?: boolean;
19790
- /** @description Whether the member has Open to Work enabled. */
19791
- is_open_to_work?: boolean;
19792
- /** @description Skills entries. Present only when skills or linkedin_* was requested. Declared from the classic profile's own live-measured shape for the same underlying LinkedIn section, since this surface's own typed fields already match that shape, rather than from a Recruiter-specific capture. Confirm field-for-field against a real response before treating any inference, an absent field or one under a different name, as fact. */
19793
- skills?: ({
19794
- /** @description The skill name. */
19795
- name?: string;
19796
- /** @description How many people have endorsed this skill. */
19797
- endorsement_count?: number;
19798
- /** @description Whether the operator account has already endorsed this skill. */
19799
- endorsed?: boolean;
19800
- /** @description LinkedIn-provided insight strings about the skill. */
19801
- insights?: string[];
19802
- /** @description The value passed to POST /v1/{account_id}/users/{user_id}/endorse-skill to endorse this skill. Present ONLY for skills you are eligible to endorse, i.e. those of your 1st-degree connections. Omitted for users outside your network and on your own profile (the skill still lists name, endorsement_count, endorsed, and insights). */
20098
+ code?: "platform_error" | "rate_limited" | "account_unavailable" | "media_rejected" | "budget_exhausted" | "outside_activity_window" | "no_active_seat" | "not_publishable" | "platform_rejected" | "missed" | "outcome_unknown";
20099
+ /** @description What went wrong and what to do next. Never contains post text. */
20100
+ message?: string;
20101
+ /** @description When it failed. */
20102
+ failed_at?: string;
20103
+ /** @description The time that failed to publish. */
20104
+ scheduled_at?: string;
20105
+ } | null;
20106
+ /** @description Creation time. */
20107
+ created_at: string;
20108
+ /** @description Last change. */
20109
+ updated_at: string;
20110
+ safety_warning?: components["schemas"]["SafetyWarning"];
20111
+ };
20112
+ };
20113
+ };
20114
+ /** @description Invalid input. Media rules: up to 20 images (JPEG, PNG, GIF, WEBP, at most 6012 x 6012 px), or one MP4 video, or one PDF, never mixed. scheduled_at must be an ISO 8601 date-time with an offset, 5 minutes to 365 days ahead after truncation to the minute. */
20115
+ 400: {
20116
+ headers: {
20117
+ [name: string]: unknown;
20118
+ };
20119
+ content: {
20120
+ "application/json": components["schemas"]["Error"];
20121
+ };
20122
+ };
20123
+ /** @description Missing or invalid API key. */
20124
+ 401: {
20125
+ headers: {
20126
+ [name: string]: unknown;
20127
+ };
20128
+ content: {
20129
+ "application/json": components["schemas"]["Error"];
20130
+ };
20131
+ };
20132
+ /** @description Forbidden. NO_ACTIVE_SEAT: the account is not attached to an active seat. */
20133
+ 403: {
20134
+ headers: {
20135
+ [name: string]: unknown;
20136
+ };
20137
+ content: {
20138
+ "application/json": components["schemas"]["Error"];
20139
+ };
20140
+ };
20141
+ /** @description The account_id is not one of yours (ACCOUNT_NOT_FOUND). */
20142
+ 404: {
20143
+ headers: {
20144
+ [name: string]: unknown;
20145
+ };
20146
+ content: {
20147
+ "application/json": components["schemas"]["Error"];
20148
+ };
20149
+ };
20150
+ /** @description The account is disconnected (REAUTH_REQUIRED). Reconnect it, or choose another account. */
20151
+ 409: {
20152
+ headers: {
20153
+ [name: string]: unknown;
20154
+ };
20155
+ content: {
20156
+ "application/json": components["schemas"]["Error"];
20157
+ };
20158
+ };
20159
+ /** @description A file is over its size limit: 5 MiB per image, and 5 MiB per file sent inline. */
20160
+ 413: {
20161
+ headers: {
20162
+ [name: string]: unknown;
20163
+ };
20164
+ content: {
20165
+ "application/json": components["schemas"]["Error"];
20166
+ };
20167
+ };
20168
+ /** @description DRAFT_LIMIT_REACHED: the bucket (one account, or Drafts with no account) already holds 50 Drafts. MEDIA_QUOTA_EXCEEDED: the media would take the bucket past its 2 GiB quota; nothing is stored. ACCOUNT_REQUIRED / DRAFT_NOT_PUBLISHABLE: scheduling needs an account and text. SCHEDULE_CONFLICT: another scheduled Draft on the account is less than 5 minutes away; the message names it. */
20169
+ 422: {
20170
+ headers: {
20171
+ [name: string]: unknown;
20172
+ };
20173
+ content: {
20174
+ "application/json": components["schemas"]["Error"];
20175
+ };
20176
+ };
20177
+ /** @description BUDGET_EXHAUSTED with reason activity_window: the scheduled time is outside the account's activity window and the account enforces it. Nothing is saved. */
20178
+ 429: {
20179
+ headers: {
20180
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20181
+ RateLimit: components["headers"]["RateLimit"];
20182
+ "Retry-After": components["headers"]["Retry-After"];
20183
+ [name: string]: unknown;
20184
+ };
20185
+ content: {
20186
+ "application/json": components["schemas"]["Error"];
20187
+ };
20188
+ };
20189
+ };
20190
+ };
20191
+ getV1DraftsId: {
20192
+ parameters: {
20193
+ query?: never;
20194
+ header?: never;
20195
+ path: {
20196
+ /** @description Draft id (drf_...). */
20197
+ id: string;
20198
+ };
20199
+ cookie?: never;
20200
+ };
20201
+ requestBody?: never;
20202
+ responses: {
20203
+ /** @description The Draft. */
20204
+ 200: {
20205
+ headers: {
20206
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20207
+ RateLimit: components["headers"]["RateLimit"];
20208
+ [name: string]: unknown;
20209
+ };
20210
+ content: {
20211
+ "application/json": {
20212
+ /**
20213
+ * @description Response type discriminator.
20214
+ * @enum {string}
20215
+ */
20216
+ object: "draft";
20217
+ /** @description Draft id (drf_...). */
20218
+ id: string;
20219
+ /** @description The account this Draft will publish as, or null for none yet. */
20220
+ account_id: string | null;
20221
+ /**
20222
+ * @description Derived: failed if failure is set, else scheduled if scheduled_at is set, else draft.
20223
+ * @enum {string}
20224
+ */
20225
+ status: "draft" | "scheduled" | "failed";
20226
+ /** @description Post body text. May be empty or null while drafting. */
20227
+ text: string | null;
20228
+ /** @description Media, in post order. */
20229
+ attachments: {
20230
+ /** @description Attachment id (att_...). Send {id} in a PATCH attachments list to keep it. */
20231
+ id: string;
20232
+ /** @description The file's type. */
20233
+ content_type: string;
20234
+ /** @description File name. */
20235
+ filename: string;
20236
+ /** @description Stored size in bytes. */
20237
+ size_bytes: number;
20238
+ /** @description Signed download link to the stored file, valid for 1 hour. Read the Draft again for a fresh one. Null when the stored file is unavailable. */
20239
+ url: string | null;
20240
+ }[];
20241
+ /** @description A post to quote or repost when published. */
20242
+ quoted_post_id?: string | null;
20243
+ /**
20244
+ * @description Who can read the post once published.
20245
+ * @enum {string|null}
20246
+ */
20247
+ can_read?: "anyone" | "relations_only" | null;
20248
+ /**
20249
+ * @description Who may comment once published.
20250
+ * @enum {string|null}
20251
+ */
20252
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
20253
+ /** @description Company page id to post as. */
20254
+ post_as?: string | null;
20255
+ /** @description When Curviate publishes the Draft (UTC, whole minute), or null. It goes out up to 20 seconds after this time. A failed Draft has null here; the time that failed is failure.scheduled_at. */
20256
+ scheduled_at: string | null;
20257
+ /** @description Why the last scheduled publish failed; present on failed Drafts only. */
20258
+ failure: {
20259
+ /**
20260
+ * @description Why it failed. outcome_unknown: the platform gave no usable answer, so the post may be live; check the account's posts before you publish again. missed: Curviate could not start within an hour of the time. platform_error and rate_limited: 3 attempts over about 15 minutes all failed.
20261
+ * @enum {string}
20262
+ */
20263
+ code?: "platform_error" | "rate_limited" | "account_unavailable" | "media_rejected" | "budget_exhausted" | "outside_activity_window" | "no_active_seat" | "not_publishable" | "platform_rejected" | "missed" | "outcome_unknown";
20264
+ /** @description What went wrong and what to do next. Never contains post text. */
20265
+ message?: string;
20266
+ /** @description When it failed. */
20267
+ failed_at?: string;
20268
+ /** @description The time that failed to publish. */
20269
+ scheduled_at?: string;
20270
+ } | null;
20271
+ /** @description Creation time. */
20272
+ created_at: string;
20273
+ /** @description Last change. */
20274
+ updated_at: string;
20275
+ safety_warning?: components["schemas"]["SafetyWarning"];
20276
+ };
20277
+ };
20278
+ };
20279
+ /** @description Missing or invalid API key. */
20280
+ 401: {
20281
+ headers: {
20282
+ [name: string]: unknown;
20283
+ };
20284
+ content: {
20285
+ "application/json": components["schemas"]["Error"];
20286
+ };
20287
+ };
20288
+ /** @description No Draft with this id among yours (RESOURCE_NOT_FOUND). */
20289
+ 404: {
20290
+ headers: {
20291
+ [name: string]: unknown;
20292
+ };
20293
+ content: {
20294
+ "application/json": components["schemas"]["Error"];
20295
+ };
20296
+ };
20297
+ /** @description Rate limited, slow down and retry after the hinted delay. */
20298
+ 429: {
20299
+ headers: {
20300
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20301
+ RateLimit: components["headers"]["RateLimit"];
20302
+ "Retry-After": components["headers"]["Retry-After"];
20303
+ [name: string]: unknown;
20304
+ };
20305
+ content: {
20306
+ "application/json": components["schemas"]["Error"];
20307
+ };
20308
+ };
20309
+ };
20310
+ };
20311
+ deleteV1DraftsId: {
20312
+ parameters: {
20313
+ query?: never;
20314
+ header?: never;
20315
+ path: {
20316
+ /** @description Draft id (drf_...). */
20317
+ id: string;
20318
+ };
20319
+ cookie?: never;
20320
+ };
20321
+ requestBody?: never;
20322
+ responses: {
20323
+ /** @description Draft and its media deleted. No response body. */
20324
+ 204: {
20325
+ headers: {
20326
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20327
+ RateLimit: components["headers"]["RateLimit"];
20328
+ [name: string]: unknown;
20329
+ };
20330
+ content?: never;
20331
+ };
20332
+ /** @description Missing or invalid API key. */
20333
+ 401: {
20334
+ headers: {
20335
+ [name: string]: unknown;
20336
+ };
20337
+ content: {
20338
+ "application/json": components["schemas"]["Error"];
20339
+ };
20340
+ };
20341
+ /** @description No Draft with this id among yours (RESOURCE_NOT_FOUND). */
20342
+ 404: {
20343
+ headers: {
20344
+ [name: string]: unknown;
20345
+ };
20346
+ content: {
20347
+ "application/json": components["schemas"]["Error"];
20348
+ };
20349
+ };
20350
+ /** @description DRAFT_PUBLISHING: a publish of this Draft is in flight. Read it again in a few seconds. */
20351
+ 409: {
20352
+ headers: {
20353
+ [name: string]: unknown;
20354
+ };
20355
+ content: {
20356
+ "application/json": components["schemas"]["Error"];
20357
+ };
20358
+ };
20359
+ /** @description Rate limited, slow down and retry after the hinted delay. */
20360
+ 429: {
20361
+ headers: {
20362
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20363
+ RateLimit: components["headers"]["RateLimit"];
20364
+ "Retry-After": components["headers"]["Retry-After"];
20365
+ [name: string]: unknown;
20366
+ };
20367
+ content: {
20368
+ "application/json": components["schemas"]["Error"];
20369
+ };
20370
+ };
20371
+ };
20372
+ };
20373
+ patchV1DraftsId: {
20374
+ parameters: {
20375
+ query?: never;
20376
+ header?: never;
20377
+ path: {
20378
+ /** @description Draft id (drf_...). */
20379
+ id: string;
20380
+ };
20381
+ cookie?: never;
20382
+ };
20383
+ requestBody: {
20384
+ content: {
20385
+ "application/json": {
20386
+ /** @description The account (acc_...) this Draft will publish as, or null for none yet. A Draft belongs to at most one account. */
20387
+ account_id?: string | null;
20388
+ /** @description When Curviate publishes this Draft: an ISO 8601 date-time with an offset, at least 5 minutes and at most 365 days ahead, stored in UTC truncated to the minute. Scheduling needs an account and text. Curviate publishes it up to 20 seconds after this time, and keeps scheduled posts on one account at least 5 minutes apart. null unschedules. */
20389
+ scheduled_at?: string | null;
20390
+ /** @description Post body text, up to 3000 characters. May be empty while drafting; publishing needs at least one character. */
20391
+ text?: string | null;
20392
+ /** @description A post to quote or repost when published, the same as on create post. Checked at publish time. */
20393
+ quoted_post_id?: string | null;
20394
+ /**
20395
+ * @description Who can read the post once published.
20396
+ * @enum {string|null}
20397
+ */
20398
+ can_read?: "anyone" | "relations_only" | null;
20399
+ /**
20400
+ * @description Who may comment once published.
20401
+ * @enum {string|null}
20402
+ */
20403
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
20404
+ /** @description Company page id to post as; the account must administer it. Checked at publish time. */
20405
+ post_as?: string | null;
20406
+ /** @description Replaces the whole list. Each item is {id} to keep an existing attachment, or a new base64 object. Attachments left out are deleted. */
20407
+ attachments?: ({
20408
+ /** @description An attachment already on this Draft (att_...), kept as is. */
20409
+ id: string;
20410
+ } | {
20411
+ /** @description Base64-encoded file bytes. */
20412
+ content: string;
20413
+ /** @description The file's type: image/jpeg, image/png, image/gif, image/webp, video/mp4 or application/pdf. */
20414
+ content_type: string;
20415
+ /** @description File name. */
20416
+ filename: string;
20417
+ })[];
20418
+ };
20419
+ };
20420
+ };
20421
+ responses: {
20422
+ /** @description The updated Draft. scheduled_at schedules, reschedules or (null) unschedules; changing it or the account cancels a pending publish and its retries. Unscheduling alone needs no active seat. With scheduled_at, the response carries safety_warning (reason activity_window) when the time is outside the account's activity window and its posture is warn; under enforce the request is refused instead (429 BUDGET_EXHAUSTED, reason activity_window) and nothing is saved. */
20423
+ 200: {
20424
+ headers: {
20425
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20426
+ RateLimit: components["headers"]["RateLimit"];
20427
+ [name: string]: unknown;
20428
+ };
20429
+ content: {
20430
+ "application/json": {
20431
+ /**
20432
+ * @description Response type discriminator.
20433
+ * @enum {string}
20434
+ */
20435
+ object: "draft";
20436
+ /** @description Draft id (drf_...). */
20437
+ id: string;
20438
+ /** @description The account this Draft will publish as, or null for none yet. */
20439
+ account_id: string | null;
20440
+ /**
20441
+ * @description Derived: failed if failure is set, else scheduled if scheduled_at is set, else draft.
20442
+ * @enum {string}
20443
+ */
20444
+ status: "draft" | "scheduled" | "failed";
20445
+ /** @description Post body text. May be empty or null while drafting. */
20446
+ text: string | null;
20447
+ /** @description Media, in post order. */
20448
+ attachments: {
20449
+ /** @description Attachment id (att_...). Send {id} in a PATCH attachments list to keep it. */
20450
+ id: string;
20451
+ /** @description The file's type. */
20452
+ content_type: string;
20453
+ /** @description File name. */
20454
+ filename: string;
20455
+ /** @description Stored size in bytes. */
20456
+ size_bytes: number;
20457
+ /** @description Signed download link to the stored file, valid for 1 hour. Read the Draft again for a fresh one. Null when the stored file is unavailable. */
20458
+ url: string | null;
20459
+ }[];
20460
+ /** @description A post to quote or repost when published. */
20461
+ quoted_post_id?: string | null;
20462
+ /**
20463
+ * @description Who can read the post once published.
20464
+ * @enum {string|null}
20465
+ */
20466
+ can_read?: "anyone" | "relations_only" | null;
20467
+ /**
20468
+ * @description Who may comment once published.
20469
+ * @enum {string|null}
20470
+ */
20471
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
20472
+ /** @description Company page id to post as. */
20473
+ post_as?: string | null;
20474
+ /** @description When Curviate publishes the Draft (UTC, whole minute), or null. It goes out up to 20 seconds after this time. A failed Draft has null here; the time that failed is failure.scheduled_at. */
20475
+ scheduled_at: string | null;
20476
+ /** @description Why the last scheduled publish failed; present on failed Drafts only. */
20477
+ failure: {
20478
+ /**
20479
+ * @description Why it failed. outcome_unknown: the platform gave no usable answer, so the post may be live; check the account's posts before you publish again. missed: Curviate could not start within an hour of the time. platform_error and rate_limited: 3 attempts over about 15 minutes all failed.
20480
+ * @enum {string}
20481
+ */
20482
+ code?: "platform_error" | "rate_limited" | "account_unavailable" | "media_rejected" | "budget_exhausted" | "outside_activity_window" | "no_active_seat" | "not_publishable" | "platform_rejected" | "missed" | "outcome_unknown";
20483
+ /** @description What went wrong and what to do next. Never contains post text. */
20484
+ message?: string;
20485
+ /** @description When it failed. */
20486
+ failed_at?: string;
20487
+ /** @description The time that failed to publish. */
20488
+ scheduled_at?: string;
20489
+ } | null;
20490
+ /** @description Creation time. */
20491
+ created_at: string;
20492
+ /** @description Last change. */
20493
+ updated_at: string;
20494
+ safety_warning?: components["schemas"]["SafetyWarning"];
20495
+ };
20496
+ };
20497
+ };
20498
+ /** @description Invalid input. Media rules: up to 20 images (JPEG, PNG, GIF, WEBP, at most 6012 x 6012 px), or one MP4 video, or one PDF, never mixed. Also: an attachment id that is not on this Draft. scheduled_at must be an ISO 8601 date-time with an offset, 5 minutes to 365 days ahead after truncation to the minute. */
20499
+ 400: {
20500
+ headers: {
20501
+ [name: string]: unknown;
20502
+ };
20503
+ content: {
20504
+ "application/json": components["schemas"]["Error"];
20505
+ };
20506
+ };
20507
+ /** @description Missing or invalid API key. */
20508
+ 401: {
20509
+ headers: {
20510
+ [name: string]: unknown;
20511
+ };
20512
+ content: {
20513
+ "application/json": components["schemas"]["Error"];
20514
+ };
20515
+ };
20516
+ /** @description Forbidden. NO_ACTIVE_SEAT: the account is not attached to an active seat. */
20517
+ 403: {
20518
+ headers: {
20519
+ [name: string]: unknown;
20520
+ };
20521
+ content: {
20522
+ "application/json": components["schemas"]["Error"];
20523
+ };
20524
+ };
20525
+ /** @description No such Draft (RESOURCE_NOT_FOUND), or the account_id is not one of yours (ACCOUNT_NOT_FOUND). */
20526
+ 404: {
20527
+ headers: {
20528
+ [name: string]: unknown;
20529
+ };
20530
+ content: {
20531
+ "application/json": components["schemas"]["Error"];
20532
+ };
20533
+ };
20534
+ /** @description DRAFT_PUBLISHING: a publish of this Draft is in flight. Read it again in a few seconds. Or the target account is disconnected (REAUTH_REQUIRED). */
20535
+ 409: {
20536
+ headers: {
20537
+ [name: string]: unknown;
20538
+ };
20539
+ content: {
20540
+ "application/json": components["schemas"]["Error"];
20541
+ };
20542
+ };
20543
+ /** @description A file is over its size limit: 5 MiB per image, and 5 MiB per file sent inline. */
20544
+ 413: {
20545
+ headers: {
20546
+ [name: string]: unknown;
20547
+ };
20548
+ content: {
20549
+ "application/json": components["schemas"]["Error"];
20550
+ };
20551
+ };
20552
+ /** @description DRAFT_LIMIT_REACHED: the bucket (one account, or Drafts with no account) already holds 50 Drafts. MEDIA_QUOTA_EXCEEDED: the media would take the bucket past its 2 GiB quota; nothing is stored. ACCOUNT_REQUIRED: a scheduled Draft cannot drop its account; unschedule it first. ACCOUNT_REQUIRED / DRAFT_NOT_PUBLISHABLE: scheduling needs an account and text. SCHEDULE_CONFLICT: another scheduled Draft on the account is less than 5 minutes away; the message names it. */
20553
+ 422: {
20554
+ headers: {
20555
+ [name: string]: unknown;
20556
+ };
20557
+ content: {
20558
+ "application/json": components["schemas"]["Error"];
20559
+ };
20560
+ };
20561
+ /** @description BUDGET_EXHAUSTED with reason activity_window: the scheduled time is outside the account's activity window and the account enforces it. Nothing is saved. */
20562
+ 429: {
20563
+ headers: {
20564
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20565
+ RateLimit: components["headers"]["RateLimit"];
20566
+ "Retry-After": components["headers"]["Retry-After"];
20567
+ [name: string]: unknown;
20568
+ };
20569
+ content: {
20570
+ "application/json": components["schemas"]["Error"];
20571
+ };
20572
+ };
20573
+ };
20574
+ };
20575
+ postV1DraftsIdPublish: {
20576
+ parameters: {
20577
+ query?: never;
20578
+ header?: never;
20579
+ path: {
20580
+ /** @description Draft id (drf_...). */
20581
+ id: string;
20582
+ };
20583
+ cookie?: never;
20584
+ };
20585
+ requestBody?: never;
20586
+ responses: {
20587
+ /** @description Published. The Draft and its media are deleted and a publish record is written. No webhook is sent: this response is the result. */
20588
+ 201: {
20589
+ headers: {
20590
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20591
+ RateLimit: components["headers"]["RateLimit"];
20592
+ [name: string]: unknown;
20593
+ };
20594
+ content: {
20595
+ "application/json": {
20596
+ /**
20597
+ * @description Response type discriminator.
20598
+ * @enum {string}
20599
+ */
20600
+ object: "post_created";
20601
+ /** @description The published post's id. */
20602
+ id: string | null;
20603
+ safety_warning?: components["schemas"]["SafetyWarning"];
20604
+ };
20605
+ };
20606
+ };
20607
+ /** @description Missing or invalid API key. */
20608
+ 401: {
20609
+ headers: {
20610
+ [name: string]: unknown;
20611
+ };
20612
+ content: {
20613
+ "application/json": components["schemas"]["Error"];
20614
+ };
20615
+ };
20616
+ /** @description Forbidden. NO_ACTIVE_SEAT: the account is not attached to an active seat. */
20617
+ 403: {
20618
+ headers: {
20619
+ [name: string]: unknown;
20620
+ };
20621
+ content: {
20622
+ "application/json": components["schemas"]["Error"];
20623
+ };
20624
+ };
20625
+ /** @description No Draft with this id among yours (RESOURCE_NOT_FOUND). */
20626
+ 404: {
20627
+ headers: {
20628
+ [name: string]: unknown;
20629
+ };
20630
+ content: {
20631
+ "application/json": components["schemas"]["Error"];
20632
+ };
20633
+ };
20634
+ /** @description DRAFT_PUBLISHING: a publish of this Draft is in flight. Read it again in a few seconds. */
20635
+ 409: {
20636
+ headers: {
20637
+ [name: string]: unknown;
20638
+ };
20639
+ content: {
20640
+ "application/json": components["schemas"]["Error"];
20641
+ };
20642
+ };
20643
+ /** @description ACCOUNT_REQUIRED: the Draft has no account. DRAFT_NOT_PUBLISHABLE: a content gap, the message names the field (for example text: empty). The Draft is unchanged. */
20644
+ 422: {
20645
+ headers: {
20646
+ [name: string]: unknown;
20647
+ };
20648
+ content: {
20649
+ "application/json": components["schemas"]["Error"];
20650
+ };
20651
+ };
20652
+ /** @description An account-safety limit or a platform rate limit refused the publish. The Draft is unchanged. */
20653
+ 429: {
20654
+ headers: {
20655
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20656
+ RateLimit: components["headers"]["RateLimit"];
20657
+ "Retry-After": components["headers"]["Retry-After"];
20658
+ [name: string]: unknown;
20659
+ };
20660
+ content: {
20661
+ "application/json": components["schemas"]["Error"];
20662
+ };
20663
+ };
20664
+ /** @description The platform refused or failed the publish. The Draft is unchanged; the error says whether a retry can help. */
20665
+ 502: {
20666
+ headers: {
20667
+ [name: string]: unknown;
20668
+ };
20669
+ content: {
20670
+ "application/json": components["schemas"]["Error"];
20671
+ };
20672
+ };
20673
+ /** @description PLATFORM_ERROR: the platform did not answer in time. The Draft is unchanged, but the post may still have been published: check the account's posts before publishing again. */
20674
+ 504: {
20675
+ headers: {
20676
+ [name: string]: unknown;
20677
+ };
20678
+ content: {
20679
+ "application/json": components["schemas"]["Error"];
20680
+ };
20681
+ };
20682
+ };
20683
+ };
20684
+ postV1DraftsIdAttachments: {
20685
+ parameters: {
20686
+ query: {
20687
+ /** @description The file's name, kept with the attachment. */
20688
+ filename: string;
20689
+ };
20690
+ header?: never;
20691
+ path: {
20692
+ /** @description Draft id (drf_...). */
20693
+ id: string;
20694
+ };
20695
+ cookie?: never;
20696
+ };
20697
+ requestBody: {
20698
+ content: {
20699
+ "video/mp4": string;
20700
+ "application/pdf": string;
20701
+ "image/jpeg": string;
20702
+ "image/png": string;
20703
+ "image/gif": string;
20704
+ "image/webp": string;
20705
+ };
20706
+ };
20707
+ responses: {
20708
+ /** @description The Draft, with the new attachment last in attachments[]. */
20709
+ 201: {
20710
+ headers: {
20711
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20712
+ RateLimit: components["headers"]["RateLimit"];
20713
+ [name: string]: unknown;
20714
+ };
20715
+ content: {
20716
+ "application/json": {
20717
+ /**
20718
+ * @description Response type discriminator.
20719
+ * @enum {string}
20720
+ */
20721
+ object: "draft";
20722
+ /** @description Draft id (drf_...). */
20723
+ id: string;
20724
+ /** @description The account this Draft will publish as, or null for none yet. */
20725
+ account_id: string | null;
20726
+ /**
20727
+ * @description Derived: failed if failure is set, else scheduled if scheduled_at is set, else draft.
20728
+ * @enum {string}
20729
+ */
20730
+ status: "draft" | "scheduled" | "failed";
20731
+ /** @description Post body text. May be empty or null while drafting. */
20732
+ text: string | null;
20733
+ /** @description Media, in post order. */
20734
+ attachments: {
20735
+ /** @description Attachment id (att_...). Send {id} in a PATCH attachments list to keep it. */
20736
+ id: string;
20737
+ /** @description The file's type. */
20738
+ content_type: string;
20739
+ /** @description File name. */
20740
+ filename: string;
20741
+ /** @description Stored size in bytes. */
20742
+ size_bytes: number;
20743
+ /** @description Signed download link to the stored file, valid for 1 hour. Read the Draft again for a fresh one. Null when the stored file is unavailable. */
20744
+ url: string | null;
20745
+ }[];
20746
+ /** @description A post to quote or repost when published. */
20747
+ quoted_post_id?: string | null;
20748
+ /**
20749
+ * @description Who can read the post once published.
20750
+ * @enum {string|null}
20751
+ */
20752
+ can_read?: "anyone" | "relations_only" | null;
20753
+ /**
20754
+ * @description Who may comment once published.
20755
+ * @enum {string|null}
20756
+ */
20757
+ can_comment?: "anyone" | "relations_only" | "no_one" | null;
20758
+ /** @description Company page id to post as. */
20759
+ post_as?: string | null;
20760
+ /** @description When Curviate publishes the Draft (UTC, whole minute), or null. It goes out up to 20 seconds after this time. A failed Draft has null here; the time that failed is failure.scheduled_at. */
20761
+ scheduled_at: string | null;
20762
+ /** @description Why the last scheduled publish failed; present on failed Drafts only. */
20763
+ failure: {
20764
+ /**
20765
+ * @description Why it failed. outcome_unknown: the platform gave no usable answer, so the post may be live; check the account's posts before you publish again. missed: Curviate could not start within an hour of the time. platform_error and rate_limited: 3 attempts over about 15 minutes all failed.
20766
+ * @enum {string}
20767
+ */
20768
+ code?: "platform_error" | "rate_limited" | "account_unavailable" | "media_rejected" | "budget_exhausted" | "outside_activity_window" | "no_active_seat" | "not_publishable" | "platform_rejected" | "missed" | "outcome_unknown";
20769
+ /** @description What went wrong and what to do next. Never contains post text. */
20770
+ message?: string;
20771
+ /** @description When it failed. */
20772
+ failed_at?: string;
20773
+ /** @description The time that failed to publish. */
20774
+ scheduled_at?: string;
20775
+ } | null;
20776
+ /** @description Creation time. */
20777
+ created_at: string;
20778
+ /** @description Last change. */
20779
+ updated_at: string;
20780
+ safety_warning?: components["schemas"]["SafetyWarning"];
20781
+ };
20782
+ };
20783
+ };
20784
+ /** @description Invalid input. Media rules: up to 20 images (JPEG, PNG, GIF, WEBP, at most 6012 x 6012 px), or one MP4 video, or one PDF, never mixed. Also: an empty file, a filename missing, or a body that did not carry exactly its Content-Length (a truncated upload; nothing is kept). */
20785
+ 400: {
20786
+ headers: {
20787
+ [name: string]: unknown;
20788
+ };
20789
+ content: {
20790
+ "application/json": components["schemas"]["Error"];
20791
+ };
20792
+ };
20793
+ /** @description Missing or invalid API key. */
20794
+ 401: {
20795
+ headers: {
20796
+ [name: string]: unknown;
20797
+ };
20798
+ content: {
20799
+ "application/json": components["schemas"]["Error"];
20800
+ };
20801
+ };
20802
+ /** @description Forbidden. NO_ACTIVE_SEAT: the account is not attached to an active seat. */
20803
+ 403: {
20804
+ headers: {
20805
+ [name: string]: unknown;
20806
+ };
20807
+ content: {
20808
+ "application/json": components["schemas"]["Error"];
20809
+ };
20810
+ };
20811
+ /** @description No Draft with this id among yours (RESOURCE_NOT_FOUND). */
20812
+ 404: {
20813
+ headers: {
20814
+ [name: string]: unknown;
20815
+ };
20816
+ content: {
20817
+ "application/json": components["schemas"]["Error"];
20818
+ };
20819
+ };
20820
+ /** @description DRAFT_PUBLISHING: a publish of this Draft is in flight. Read it again in a few seconds. */
20821
+ 409: {
20822
+ headers: {
20823
+ [name: string]: unknown;
20824
+ };
20825
+ content: {
20826
+ "application/json": components["schemas"]["Error"];
20827
+ };
20828
+ };
20829
+ /** @description INVALID_REQUEST: Content-Length is required; a chunked upload is not accepted. */
20830
+ 411: {
20831
+ headers: {
20832
+ [name: string]: unknown;
20833
+ };
20834
+ content: {
20835
+ "application/json": components["schemas"]["Error"];
20836
+ };
20837
+ };
20838
+ /** @description PAYLOAD_TOO_LARGE: the file is over its type's limit: 5 MiB per image, 50 MiB for a video, 50 MiB for a PDF. */
20839
+ 413: {
20840
+ headers: {
20841
+ [name: string]: unknown;
20842
+ };
20843
+ content: {
20844
+ "application/json": components["schemas"]["Error"];
20845
+ };
20846
+ };
20847
+ /** @description UNSUPPORTED_MEDIA_TYPE: Content-Type is not one of the accepted file types (JSON and multipart bodies included). */
20848
+ 415: {
20849
+ headers: {
20850
+ [name: string]: unknown;
20851
+ };
20852
+ content: {
20853
+ "application/json": components["schemas"]["Error"];
20854
+ };
20855
+ };
20856
+ /** @description MEDIA_QUOTA_EXCEEDED: the file would take the bucket past its 2 GiB quota; nothing is stored. */
20857
+ 422: {
20858
+ headers: {
20859
+ [name: string]: unknown;
20860
+ };
20861
+ content: {
20862
+ "application/json": components["schemas"]["Error"];
20863
+ };
20864
+ };
20865
+ /** @description Rate limited, slow down and retry after the hinted delay. */
20866
+ 429: {
20867
+ headers: {
20868
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20869
+ RateLimit: components["headers"]["RateLimit"];
20870
+ "Retry-After": components["headers"]["Retry-After"];
20871
+ [name: string]: unknown;
20872
+ };
20873
+ content: {
20874
+ "application/json": components["schemas"]["Error"];
20875
+ };
20876
+ };
20877
+ };
20878
+ };
20879
+ getV1AccountIdRecruiterProfilesUserId: {
20880
+ parameters: {
20881
+ query?: {
20882
+ /** @description Recruiter profile sections to fetch, repeatable: linkedin_experience, linkedin_skills, and others (each has a _preview variant). Omit for base fields only. */
20883
+ with_sections?: ("linkedin_*" | "linkedin_experience" | "linkedin_education" | "linkedin_languages" | "linkedin_skills" | "linkedin_certifications" | "linkedin_volunteer_experience" | "linkedin_projects" | "linkedin_recommendations" | "linkedin_interests" | "linkedin_recruiting_activity" | "linkedin_*_preview" | "linkedin_experience_preview" | "linkedin_education_preview" | "linkedin_languages_preview" | "linkedin_skills_preview" | "linkedin_certifications_preview" | "linkedin_volunteer_experience_preview" | "linkedin_projects_preview" | "linkedin_recommendations_preview" | "linkedin_interests_preview" | "linkedin_recruiting_activity_preview")[];
20884
+ };
20885
+ header?: never;
20886
+ path: {
20887
+ /** @description The account ID (`acc_...`) whose Recruiter seat resolves the profile view. */
20888
+ account_id: string;
20889
+ /** @description The target profile: 'me', a public identifier, or a member ID. */
20890
+ user_id: string;
20891
+ };
20892
+ cookie?: never;
20893
+ };
20894
+ requestBody?: never;
20895
+ responses: {
20896
+ /** @description Recruiter-enriched profile. Returns the base profile shape plus the recruiting_profile enrichment. Section arrays under specifics (skills, experience, education, etc.) are only present when the corresponding with_sections value was requested. No inline quota; read from GET /v1/accounts/{account_id}. Requires a Recruiter seat. */
20897
+ 200: {
20898
+ headers: {
20899
+ "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
20900
+ RateLimit: components["headers"]["RateLimit"];
20901
+ [name: string]: unknown;
20902
+ };
20903
+ content: {
20904
+ "application/json": {
20905
+ /**
20906
+ * @description Response type discriminator.
20907
+ * @enum {string}
20908
+ */
20909
+ object: "recruiter_profile";
20910
+ /** @description The profile's opaque identifier. */
20911
+ id: string;
20912
+ /**
20913
+ * @description Profile type.
20914
+ * @enum {string}
20915
+ */
20916
+ type: "individual" | "organization" | "other";
20917
+ /** @description The member's display name. */
20918
+ display_name: string;
20919
+ /**
20920
+ * @description Source platform.
20921
+ * @enum {string}
20922
+ */
20923
+ provider: "linkedin";
20924
+ /** @description First name. */
20925
+ first_name?: string;
20926
+ /** @description Last name. */
20927
+ last_name?: string;
20928
+ /** @description LinkedIn public URL slug (e.g. 'jane-doe'). */
20929
+ public_identifier?: string;
20930
+ /** @description Full LinkedIn profile URL. */
20931
+ profile_url?: string;
20932
+ /** @description Profile picture URL. */
20933
+ public_picture_url?: string;
20934
+ /** @description Large profile picture URL. */
20935
+ public_picture_url_large?: string;
20936
+ /** @description The member's professional headline. Reading it back through Curviate stores it in your tenant's entity records, with no expiry. */
20937
+ description?: string;
20938
+ /** @description Geographic location string. */
20939
+ location?: string;
20940
+ /** @description Structured profile-lens data, incl. connection distance and (when requested) section arrays. */
20941
+ specifics?: {
20942
+ /**
20943
+ * @description Connection distance from the operator account.
20944
+ * @enum {string}
20945
+ */
20946
+ network_distance?: "SELF" | "FIRST_DEGREE" | "SECOND_DEGREE" | "THIRD_DEGREE" | "OUT_OF_NETWORK";
20947
+ /** @description The member's platform-native ID. */
20948
+ member_id?: string;
20949
+ /** @description Whether an InMail can be sent to this member. */
20950
+ can_send_inmail?: boolean;
20951
+ /** @description Whether the member has Open Profile enabled. */
20952
+ is_open_profile?: boolean;
20953
+ /** @description Whether the member has a LinkedIn Premium subscription. */
20954
+ is_premium?: boolean;
20955
+ /** @description Whether the member is a LinkedIn creator. */
20956
+ is_creator?: boolean;
20957
+ /** @description Whether the member has hiring mode active. */
20958
+ is_hiring?: boolean;
20959
+ /** @description Whether the member has Open to Work enabled. */
20960
+ is_open_to_work?: boolean;
20961
+ /** @description Skills entries. Present only when skills or linkedin_* was requested. Declared from the classic profile's own live-measured shape for the same underlying LinkedIn section, since this surface's own typed fields already match that shape, rather than from a Recruiter-specific capture. Confirm field-for-field against a real response before treating any inference, an absent field or one under a different name, as fact. */
20962
+ skills?: ({
20963
+ /** @description The skill name. */
20964
+ name?: string;
20965
+ /** @description How many people have endorsed this skill. */
20966
+ endorsement_count?: number;
20967
+ /** @description Whether the operator account has already endorsed this skill. */
20968
+ endorsed?: boolean;
20969
+ /** @description LinkedIn-provided insight strings about the skill. */
20970
+ insights?: string[];
20971
+ /** @description The value passed to POST /v1/{account_id}/users/{user_id}/endorse-skill to endorse this skill. Present ONLY for skills you are eligible to endorse, i.e. those of your 1st-degree connections. Omitted for users outside your network and on your own profile (the skill still lists name, endorsement_count, endorsed, and insights). */
19803
20972
  endorsement_id?: number;
19804
20973
  } & {
19805
20974
  [key: string]: unknown;
@@ -27862,6 +29031,20 @@ export interface operations {
27862
29031
  items?: {
27863
29032
  /** @description Curviate account id (acc_...). */
27864
29033
  account_id?: string;
29034
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. */
29035
+ connection_location?: {
29036
+ /** @description Configured country (ISO 3166-1 alpha-2). */
29037
+ country?: string | null;
29038
+ /** @description Country of the connection in use right now. */
29039
+ current_country?: string | null;
29040
+ /**
29041
+ * @description auto: managed connection. custom: your own proxy.
29042
+ * @enum {string|null}
29043
+ */
29044
+ mode?: "auto" | "custom" | null;
29045
+ /** @description true: never connects from another country. */
29046
+ strict?: boolean | null;
29047
+ };
27865
29048
  /**
27866
29049
  * @description Stable status whitelist.
27867
29050
  * @enum {string}
@@ -27997,6 +29180,20 @@ export interface operations {
27997
29180
  metadata?: {
27998
29181
  [key: string]: string;
27999
29182
  } | null;
29183
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. */
29184
+ connection_location?: {
29185
+ /** @description Configured country (ISO 3166-1 alpha-2). */
29186
+ country?: string | null;
29187
+ /** @description Country of the connection in use right now. */
29188
+ current_country?: string | null;
29189
+ /**
29190
+ * @description auto: managed connection. custom: your own proxy.
29191
+ * @enum {string|null}
29192
+ */
29193
+ mode?: "auto" | "custom" | null;
29194
+ /** @description true: never connects from another country. */
29195
+ strict?: boolean | null;
29196
+ };
28000
29197
  /** @description ISO-8601 UTC creation timestamp of the underlying LinkedIn account, distinct from connected_at. Null until the first background enrichment lands. */
28001
29198
  substrate_created_at?: string | null;
28002
29199
  /** @description Account-safety rows for this account: one entry per counted action for the current window of its grain, plus the derived total and the invitation backlog. Each row reports where the account stands, what it is allowed, which band that puts it in, what happens at the ceiling, whether the ceiling was raised above the Curviate default, and any active pause the platform caused. Whether a breach is refused or merely reported is `posture`, and the default is to report: nothing here refuses until you configure it to. Pacing is still the caller's responsibility, and nothing on this array paces for you. The per-minute REQUEST ceiling is a different thing and is deliberately not in this array: it protects Curviate's own servers rather than your LinkedIn account, it counts requests where these count platform operations, it is always enforced with HTTP 429 whatever your posture, and its envelope is returned on that refusal. Read this array to see where the account stands; read the safety events surface to see what has already been refused or flagged. */
@@ -28266,27 +29463,34 @@ export interface operations {
28266
29463
  } | null;
28267
29464
  /** @description Your own id for this account's end user (1-255 chars), or null to clear it. Omit to leave it unchanged. */
28268
29465
  external_id?: string | null;
28269
- /** @description Custom-proxy egress config, or null to clear it (revert to automatic proxy protection). Omit to leave it unchanged. */
29466
+ /** @description Your own proxy, or null to stop using it and return to a managed location (null requires country in the same request). Omit to leave it unchanged. */
28270
29467
  proxy?: {
28271
29468
  /**
28272
- * @description Proxy protocol. One of http, https, socks5.
29469
+ * @description Proxy protocol. One of http, https, socks5, socks4.
28273
29470
  * @enum {string}
28274
29471
  */
28275
- protocol: "http" | "https" | "socks5";
29472
+ protocol: "http" | "https" | "socks5" | "socks4";
28276
29473
  /** @description Proxy host or IP. */
28277
29474
  host: string;
28278
29475
  /** @description Proxy port (1-65535). */
28279
29476
  port: number;
28280
29477
  /** @description Proxy auth username (optional). */
28281
29478
  username?: string;
28282
- /** @description Proxy auth password (optional). Encrypted at rest, never logged or returned. */
29479
+ /** @description Proxy auth password (optional). Passed to the connection only: never stored, logged or returned. */
28283
29480
  password?: string;
28284
29481
  } | null;
29482
+ /**
29483
+ * @description Move this account's connection location to this supported ISO 3166-1 alpha-2 country (e.g. US, DE). LinkedIn sees a new IP in that country and may ask the owner to verify, so change it only when the current location is wrong. Strict unless allow_country_fallback is true. On an account using your own proxy, send proxy: null with it.
29484
+ * @enum {string}
29485
+ */
29486
+ country?: "AE" | "AO" | "AR" | "AT" | "AU" | "BD" | "BE" | "BG" | "BR" | "CA" | "CH" | "CL" | "CN" | "CO" | "CY" | "CZ" | "DE" | "DK" | "EE" | "EG" | "ES" | "FI" | "FR" | "GB" | "GT" | "HK" | "ID" | "IE" | "IL" | "IN" | "IT" | "JP" | "KR" | "KZ" | "MA" | "MX" | "MY" | "NL" | "NO" | "PA" | "PH" | "PK" | "PL" | "PR" | "PT" | "RO" | "SA" | "SE" | "SG" | "TH" | "TN" | "TR" | "UA" | "US" | "VN" | "ZA";
29487
+ /** @description Optional. false (the default with country or ip): only ever connect from that country; a connect fails when no connection is free there. true: a connection from another country may be used when none is free in the chosen one. Not accepted with proxy. */
29488
+ allow_country_fallback?: boolean;
28285
29489
  };
28286
29490
  };
28287
29491
  };
28288
29492
  responses: {
28289
- /** @description The account was updated. metadata and external_id are stored by Curviate and read back on GET; a PATCH carrying only those makes no LinkedIn call. */
29493
+ /** @description The updated account: the object GET /v1/accounts/{account_id} returns, without quotas and event_log (read those on GET). After a location change, connection_location is re-read from LinkedIn's side, so it shows where the account really connects from now. metadata and external_id are stored by Curviate; a PATCH carrying only those makes no LinkedIn call. */
28290
29494
  200: {
28291
29495
  headers: {
28292
29496
  "RateLimit-Policy": components["headers"]["RateLimit-Policy"];
@@ -28301,11 +29505,55 @@ export interface operations {
28301
29505
  */
28302
29506
  object?: "account";
28303
29507
  account_id?: string;
29508
+ /** @enum {string} */
29509
+ status?: "active" | "reconnect_needed" | "restricted" | "connecting" | "disconnected";
29510
+ auth_method?: string;
29511
+ full_name?: string | null;
29512
+ headline?: string | null;
29513
+ /** @description ISO-8601 UTC connection timestamp. */
29514
+ connected_at?: string | null;
29515
+ /** @description ISO-8601 UTC time the account state was last checked. */
29516
+ last_checked_at?: string;
29517
+ /** @description The seat this account occupies (null for an admin seatless account). */
29518
+ seat_id?: string | null;
29519
+ /** @description The connection scope this account was last connected with (e.g. ["classic","company","sales_navigator","recruiter"]). A connect asks for every product and LinkedIn activates the ones the account actually has, so this is what was ASKED for, narrowed only by an explicit linkedin_premium on that connect. A linkedin_premium narrowing is not remembered between connects, so this shows what the LAST connect asked for and a reconnect that omits the field widens it again. Null for accounts connected before this was recorded; not attachment truth for Company Pages. */
29520
+ requested_products?: ("classic" | "company" | "sales_navigator" | "recruiter")[] | null;
29521
+ /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
29522
+ external_id?: string | null;
29523
+ /** @description Your own flat string map for this account, as last set by PATCH. Null when none. */
29524
+ metadata?: {
29525
+ [key: string]: string;
29526
+ } | null;
29527
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. */
29528
+ connection_location?: {
29529
+ /** @description Configured country (ISO 3166-1 alpha-2). */
29530
+ country?: string | null;
29531
+ /** @description Country of the connection in use right now. */
29532
+ current_country?: string | null;
29533
+ /**
29534
+ * @description auto: managed connection. custom: your own proxy.
29535
+ * @enum {string|null}
29536
+ */
29537
+ mode?: "auto" | "custom" | null;
29538
+ /** @description true: never connects from another country. */
29539
+ strict?: boolean | null;
29540
+ };
29541
+ /** @description ISO-8601 UTC creation timestamp of the underlying LinkedIn account, distinct from connected_at. Null until the first background enrichment lands. */
29542
+ substrate_created_at?: string | null;
29543
+ /** @description Platform conditions this LinkedIn account is currently in, additive to `status` and independent of it. `recruiter_session_evicted`: the account is signed in somewhere else and LinkedIn allows one session at a time for it, so a person has to close the other session; reconnecting will not help. `commercial_use_limited`: LinkedIn's commercial-use limit has tripped, so people search returns only a handful of results per query. It is a paywall, not a penalty, and nothing else about the account is affected. `profile_view_limited`: profile views outside this account's own network are being blocked; first-degree views still work. The two limits are detected from their symptom: LinkedIn publishes no threshold for either, exposes no counter, and lifts neither on request, so no number is reported. `commercial_use_limited` is a present-tense reading and a genuinely narrow search can also produce the shape it looks for, so treat it as a reason to check rather than a certainty; the next people search that returns a full page clears it. An account in none of these reports an empty array. */
29544
+ account_states?: ("recruiter_session_evicted" | "commercial_use_limited" | "profile_view_limited")[];
29545
+ /** @description The account's activity window, the hours in which Curviate reports or refuses live writes to LinkedIn. Reads and anything served from Curviate's own store are never affected, at any hour. Configure it on the account's safety policy. */
29546
+ activity_window?: {
29547
+ /** @description The IANA zone the window is read in, or null when none is set. */
29548
+ timezone?: string | null;
29549
+ /** @description True when no zone is set, which DISABLES the activity window. Curviate never guesses a zone: a guess eight hours wrong inverts the window, refusing every daytime write and permitting every nocturnal one. If you configured a window and it never fires, this is why. */
29550
+ timezone_unset?: boolean;
29551
+ };
28304
29552
  safety_warning?: components["schemas"]["SafetyWarning"];
28305
29553
  };
28306
29554
  };
28307
29555
  };
28308
- /** @description Invalid request: a malformed proxy object, metadata over its limits (16 keys, key 40 chars, value 500), external_id outside 1-255 chars, or an unsupported field (country/ip). */
29556
+ /** @description INVALID_REQUEST: a malformed proxy object; proxy together with country or allow_country_fallback; country on an account that uses your own proxy without proxy: null; allow_country_fallback alone on such an account; an unsupported country; ip (not changeable after connect; reconnect with ip instead); metadata over its limits (16 keys, key 40 chars, value 500); external_id outside 1-255 chars. CONNECTION_LOCATION_REQUIRED: proxy: null without country (clearing your own proxy alone would let the connection land anywhere). */
28309
29557
  400: {
28310
29558
  headers: {
28311
29559
  [name: string]: unknown;
@@ -28323,6 +29571,15 @@ export interface operations {
28323
29571
  "application/json": components["schemas"]["Error"];
28324
29572
  };
28325
29573
  };
29574
+ /** @description REAUTH_REQUIRED: the account is disconnected, so its location cannot change in place. Reconnect it (POST /v1/auth/intent with account_id) and pass country there. */
29575
+ 409: {
29576
+ headers: {
29577
+ [name: string]: unknown;
29578
+ };
29579
+ content: {
29580
+ "application/json": components["schemas"]["Error"];
29581
+ };
29582
+ };
28326
29583
  /** @description Payload too large, the request body exceeds the size limit. */
28327
29584
  413: {
28328
29585
  headers: {
@@ -28332,6 +29589,15 @@ export interface operations {
28332
29589
  "application/json": components["schemas"]["Error"];
28333
29590
  };
28334
29591
  };
29592
+ /** @description CONNECTION_LOCATION_UNAVAILABLE: no connection is free in that country right now, or the account did not end up there. When the change was applied but landed elsewhere, the body carries connection_location with where the account connects from now. Try a nearby country, or allow fallback. */
29593
+ 422: {
29594
+ headers: {
29595
+ [name: string]: unknown;
29596
+ };
29597
+ content: {
29598
+ "application/json": components["schemas"]["Error"];
29599
+ };
29600
+ };
28335
29601
  /** @description Rate limited, slow down and retry after the hinted delay. */
28336
29602
  429: {
28337
29603
  headers: {
@@ -28520,24 +29786,29 @@ export interface operations {
28520
29786
  external_id?: string;
28521
29787
  /** @description Optional allow-list of premium products to ask for: sales_navigator, recruiter. Omit to ask for both; [] asks for none. Classic LinkedIn and company pages are always included. */
28522
29788
  products?: ("sales_navigator" | "recruiter")[];
28523
- /** @description Managed proxy location hint as an ISO 3166-1 alpha-2 country code (e.g. US, DE). */
28524
- country?: string;
28525
- /** @description IPv4 address used to infer the managed proxy location. */
29789
+ /**
29790
+ * @description Where LinkedIn sees this account connecting from: a supported ISO 3166-1 alpha-2 country code (e.g. US, DE; case-insensitive). Pick the country the account owner normally signs in from. A new connect needs exactly one of country, ip or proxy. Strict by default: the connect fails rather than use another country, unless allow_country_fallback is true.
29791
+ * @enum {string}
29792
+ */
29793
+ country?: "AE" | "AO" | "AR" | "AT" | "AU" | "BD" | "BE" | "BG" | "BR" | "CA" | "CH" | "CL" | "CN" | "CO" | "CY" | "CZ" | "DE" | "DK" | "EE" | "EG" | "ES" | "FI" | "FR" | "GB" | "GT" | "HK" | "ID" | "IE" | "IL" | "IN" | "IT" | "JP" | "KR" | "KZ" | "MA" | "MX" | "MY" | "NL" | "NO" | "PA" | "PH" | "PK" | "PL" | "PR" | "PT" | "RO" | "SA" | "SE" | "SG" | "TH" | "TN" | "TR" | "UA" | "US" | "VN" | "ZA";
29794
+ /** @description A public IPv4 address; its country becomes the connection location (strict by default). An alternative to country: send exactly one of country, ip or proxy on a new connect. */
28526
29795
  ip?: string;
28527
- /** @description Managed-proxy egress configuration for this account's outbound traffic. */
29796
+ /** @description Optional. false (the default with country or ip): only ever connect from that country; a connect fails when no connection is free there. true: a connection from another country may be used when none is free in the chosen one. Not accepted with proxy. */
29797
+ allow_country_fallback?: boolean;
29798
+ /** @description Your own proxy for this account's traffic. The proxy decides where LinkedIn sees the account connecting from, so country, ip and allow_country_fallback are not accepted with it. */
28528
29799
  proxy?: {
28529
29800
  /**
28530
- * @description Proxy protocol. One of http, https, socks5.
29801
+ * @description Proxy protocol. One of http, https, socks5, socks4.
28531
29802
  * @enum {string}
28532
29803
  */
28533
- protocol: "http" | "https" | "socks5";
29804
+ protocol: "http" | "https" | "socks5" | "socks4";
28534
29805
  /** @description Proxy host or IP. */
28535
29806
  host: string;
28536
29807
  /** @description Proxy port (1-65535). */
28537
29808
  port: number;
28538
29809
  /** @description Proxy auth username (optional). */
28539
29810
  username?: string;
28540
- /** @description Proxy auth password (optional). Encrypted at rest, never logged or returned. */
29811
+ /** @description Proxy auth password (optional). Passed to the connection only: never stored, logged or returned. */
28541
29812
  password?: string;
28542
29813
  };
28543
29814
  /** @description Exact browser User-Agent to pin for this account. REQUIRED for a cookie connect: send the User-Agent of the browser the li_at cookie was copied from. Optional for a credentials connect, where it helps an account that hits disconnection issues. */
@@ -28574,6 +29845,22 @@ export interface operations {
28574
29845
  status?: "active";
28575
29846
  /** @description Your own id for this account's end user, as set on connect or PATCH. Null when none. Not unique. */
28576
29847
  external_id?: string | null;
29848
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. */
29849
+ connection_location?: {
29850
+ /** @description Configured country (ISO 3166-1 alpha-2). */
29851
+ country?: string | null;
29852
+ /** @description Country of the connection in use right now. */
29853
+ current_country?: string | null;
29854
+ /**
29855
+ * @description auto: managed connection. custom: your own proxy.
29856
+ * @enum {string|null}
29857
+ */
29858
+ mode?: "auto" | "custom" | null;
29859
+ /** @description true: never connects from another country. */
29860
+ strict?: boolean | null;
29861
+ /** @description Present only when this connect landed on an account you already had and changed its configured country (to another one, to unknown with ip, or to your own proxy). It names the country before. */
29862
+ previous_country?: string;
29863
+ };
28577
29864
  safety_warning?: components["schemas"]["SafetyWarning"];
28578
29865
  };
28579
29866
  };
@@ -28610,6 +29897,22 @@ export interface operations {
28610
29897
  external_id?: string | null;
28611
29898
  /** @description Present and true only when this connect reactivated an account you had previously disconnected, instead of opening a brand-new one. Absent on a normal connect. The account keeps its original id, and its status reflects its real observed state, which may need a reconnect. */
28612
29899
  recovered?: boolean;
29900
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. */
29901
+ connection_location?: {
29902
+ /** @description Configured country (ISO 3166-1 alpha-2). */
29903
+ country?: string | null;
29904
+ /** @description Country of the connection in use right now. */
29905
+ current_country?: string | null;
29906
+ /**
29907
+ * @description auto: managed connection. custom: your own proxy.
29908
+ * @enum {string|null}
29909
+ */
29910
+ mode?: "auto" | "custom" | null;
29911
+ /** @description true: never connects from another country. */
29912
+ strict?: boolean | null;
29913
+ /** @description Present only when this connect landed on an account you already had and changed its configured country (to another one, to unknown with ip, or to your own proxy). It names the country before. */
29914
+ previous_country?: string;
29915
+ };
28613
29916
  safety_warning?: components["schemas"]["SafetyWarning"];
28614
29917
  };
28615
29918
  };
@@ -28659,7 +29962,7 @@ export interface operations {
28659
29962
  };
28660
29963
  };
28661
29964
  };
28662
- /** @description INVALID_REQUEST. The most common causes: the auth block is at the top level instead of nested (send `credentials: { email, password }` or `cookie: { li_at }`, not bare `email`/`password`/`li_at`); `seat_id` is missing on a new connect; or a cookie connect has no top-level `user_agent`. SEAT_NOT_FOUND if the seat id is unknown or is not yours. */
29965
+ /** @description CONNECTION_LOCATION_REQUIRED: a new connect names no location; send exactly one of `country` (a supported ISO code, e.g. `US`), `ip` (a public IPv4) or your own `proxy`. INVALID_REQUEST. The most common causes: two location sources at once (`ip` overrides `country`, `proxy` overrides both, so send one); an unsupported `country` (use `proxy` for a location we don't serve); a private or reserved `ip`; `allow_country_fallback` together with `proxy`; your own proxy rejected its credentials, could not be reached or timed out (the message names which); the auth block is at the top level instead of nested (send `credentials: { email, password }` or `cookie: { li_at }`, not bare `email`/`password`/`li_at`); `seat_id` is missing on a new connect; or a cookie connect has no top-level `user_agent`. SEAT_NOT_FOUND if the seat id is unknown or is not yours. */
28663
29966
  400: {
28664
29967
  headers: {
28665
29968
  [name: string]: unknown;
@@ -28695,7 +29998,7 @@ export interface operations {
28695
29998
  "application/json": components["schemas"]["Error"];
28696
29999
  };
28697
30000
  };
28698
- /** @description This LinkedIn account is already linked (names your own account_id when your tenant owns it). */
30001
+ /** @description ACCOUNT_ALREADY_LINKED: this LinkedIn account is already linked. It names your own account_id when your tenant owns it; otherwise no id is named, it is not one you can manage here, and retrying will not help. CONNECTION_IN_PROGRESS: another connection attempt for this identity is open; wait for it to finish or expire. */
28699
30002
  409: {
28700
30003
  headers: {
28701
30004
  [name: string]: unknown;
@@ -28713,7 +30016,7 @@ export interface operations {
28713
30016
  "application/json": components["schemas"]["Error"];
28714
30017
  };
28715
30018
  };
28716
- /** @description The verification challenge cannot be resolved automatically (a dead-end challenge such as a CAPTCHA or a phone-number registration). For those two dead-ends the error body carries a machine-readable challenge_type (captcha | phone_register) so a client can render the right guidance; other unsupported challenges carry no challenge_type. */
30019
+ /** @description CONNECTION_LOCATION_UNAVAILABLE: no connection is free in the country you chose right now (it is strict); try a nearby country, or send allow_country_fallback: true. Also returned when the connect re-attached an account you already had and its location could not be changed here (sent as ip): the body carries connection_location, and PATCH /v1/accounts/{account_id} with country moves it. CHECKPOINT_UNSUPPORTED: the verification challenge cannot be resolved automatically (a dead-end challenge such as a CAPTCHA or a phone-number registration). For those two dead-ends the error body carries a machine-readable challenge_type (captcha | phone_register) so a client can render the right guidance; other unsupported challenges carry no challenge_type. */
28717
30020
  422: {
28718
30021
  headers: {
28719
30022
  [name: string]: unknown;
@@ -28818,6 +30121,22 @@ export interface operations {
28818
30121
  external_id?: string | null;
28819
30122
  /** @description Present and true only when this connect reactivated an account you had previously disconnected, instead of opening a brand-new one. Absent on a normal connect. The account keeps its original id, and its status reflects its real observed state, which may need a reconnect. */
28820
30123
  recovered?: boolean;
30124
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. */
30125
+ connection_location?: {
30126
+ /** @description Configured country (ISO 3166-1 alpha-2). */
30127
+ country?: string | null;
30128
+ /** @description Country of the connection in use right now. */
30129
+ current_country?: string | null;
30130
+ /**
30131
+ * @description auto: managed connection. custom: your own proxy.
30132
+ * @enum {string|null}
30133
+ */
30134
+ mode?: "auto" | "custom" | null;
30135
+ /** @description true: never connects from another country. */
30136
+ strict?: boolean | null;
30137
+ /** @description Present only when this connect landed on an account you already had and changed its configured country (to another one, to unknown with ip, or to your own proxy). It names the country before. */
30138
+ previous_country?: string;
30139
+ };
28821
30140
  safety_warning?: components["schemas"]["SafetyWarning"];
28822
30141
  };
28823
30142
  };
@@ -28901,7 +30220,7 @@ export interface operations {
28901
30220
  "application/json": components["schemas"]["Error"];
28902
30221
  };
28903
30222
  };
28904
- /** @description The submitted code was incorrect, or the challenge type is unsupported. */
30223
+ /** @description The submitted code was incorrect, or the challenge type is unsupported. CONNECTION_LOCATION_UNAVAILABLE: the connect completed onto an account you already had, and the location you sent could not be applied (no connection free in that country, or it was an ip); the account stays connected, the body carries its actual connection_location, and PATCH /v1/accounts/{account_id} with country moves it. */
28905
30224
  422: {
28906
30225
  headers: {
28907
30226
  [name: string]: unknown;
@@ -29197,6 +30516,22 @@ export interface operations {
29197
30516
  attached_seat_id?: string | null;
29198
30517
  /** @description Your own id for this account's end user, as passed on connect. Present on status:"active". */
29199
30518
  external_id?: string | null;
30519
+ /** @description Where LinkedIn sees this account connecting from. country: the configured country (ISO 3166-1 alpha-2), the one the account is set to use. current_country: the country of the connection in use right now; it differs from country only after a fallback, which can happen only when strict is false. mode: auto (a managed connection in country) or custom (your own proxy). strict: true when the account never connects from another country, null when unknown. Each field is null until known; an account connected through ip or your own proxy may show null until the next background refresh. Change it with PATCH /v1/accounts/{account_id} (country), or by reconnecting with country. Present on object:"account". */
30520
+ connection_location?: {
30521
+ /** @description Configured country (ISO 3166-1 alpha-2). */
30522
+ country?: string | null;
30523
+ /** @description Country of the connection in use right now. */
30524
+ current_country?: string | null;
30525
+ /**
30526
+ * @description auto: managed connection. custom: your own proxy.
30527
+ * @enum {string|null}
30528
+ */
30529
+ mode?: "auto" | "custom" | null;
30530
+ /** @description true: never connects from another country. */
30531
+ strict?: boolean | null;
30532
+ /** @description Present only when this connect landed on an account you already had and changed its configured country (to another one, to unknown with ip, or to your own proxy). It names the country before. */
30533
+ previous_country?: string;
30534
+ };
29200
30535
  /** @description ISO-8601 expiry. Present on status:"pending" and status:"checkpoint_required". */
29201
30536
  expires_at?: string;
29202
30537
  /**
@@ -29251,7 +30586,7 @@ export interface operations {
29251
30586
  "application/json": components["schemas"]["Error"];
29252
30587
  };
29253
30588
  };
29254
- /** @description The pending checkpoint is code-based, not mobile_app_approval, use submit instead. */
30589
+ /** @description The pending checkpoint is code-based, not mobile_app_approval, use submit instead. CONNECTION_LOCATION_UNAVAILABLE: the approval completed onto an account you already had, and the location you sent could not be applied; the account stays connected, the body carries its actual connection_location, and PATCH /v1/accounts/{account_id} with country moves it. */
29255
30590
  422: {
29256
30591
  headers: {
29257
30592
  [name: string]: unknown;
@@ -29918,7 +31253,7 @@ export interface operations {
29918
31253
  * @description The event source this webhook subscribes to.
29919
31254
  * @enum {string}
29920
31255
  */
29921
- source?: "messaging" | "user" | "account_status";
31256
+ source?: "messaging" | "user" | "account_status" | "post";
29922
31257
  /** @description The URL that receives delivery POST requests. */
29923
31258
  request_url?: string;
29924
31259
  name?: string | null;
@@ -30080,6 +31415,30 @@ export interface operations {
30080
31415
  }[];
30081
31416
  /** @description Account-status events to subscribe to (default: all 12 lifecycle events) */
30082
31417
  events?: ("account.created" | "account.connected" | "account.synced" | "account.reconnected" | "account.reconnect_needed" | "account.restricted" | "account.creation_failed" | "account.disconnected" | "account.error" | "account.paused" | "account.connecting" | "account.permission_revoked" | "account.initial_sync.running" | "account.initial_sync.completed" | "account.initial_sync.failed")[];
31418
+ } | {
31419
+ /** @constant */
31420
+ source: "post";
31421
+ /** @description HTTPS URL that receives webhook deliveries. Must be a publicly reachable host on the default https port; private, loopback and link-local addresses are rejected. */
31422
+ request_url: string;
31423
+ /** @description Human-readable name for this webhook (1-100 chars) */
31424
+ name?: string;
31425
+ /** @description Per-account targeting. Required and non-empty; each id must be an acc_-prefixed id owned by the tenant. */
31426
+ account_ids: string[];
31427
+ /**
31428
+ * @description A disabled webhook is created but delivers nothing
31429
+ * @default true
31430
+ */
31431
+ enabled?: boolean;
31432
+ /**
31433
+ * @description Custom headers added to each delivery POST. Names must be valid HTTP header names and values must be printable ASCII (no line breaks or control characters). Reserved names are rejected at registration; they include Content-Type, User-Agent, Host, any Curviate-* or Sec-* name, and the hop-by-hop headers. At most 10 headers, 1024 characters per value, 4096 bytes in total. Custom headers are not covered by the delivery signature, so treat them as a hint, not as proof of origin. Values are encrypted at rest and are never returned by a read. A read shows the header name plus a 8-character keyed fingerprint of the value, which carries no part of the value and no indication of its length. It is deterministic within your account, so a fingerprint confirms a rotation took effect and tells you whether two of your webhooks carry the same credential; fingerprints are not comparable across accounts. The header name is what identifies which credential is configured.
31434
+ * @default []
31435
+ */
31436
+ headers?: {
31437
+ key: string;
31438
+ value: string;
31439
+ }[];
31440
+ /** @description Post events to subscribe to (default: both post.published and post.publish_failed) */
31441
+ events?: ("post.published" | "post.publish_failed")[];
30083
31442
  };
30084
31443
  };
30085
31444
  };
@@ -30104,7 +31463,7 @@ export interface operations {
30104
31463
  * @description The event source this webhook subscribes to.
30105
31464
  * @enum {string}
30106
31465
  */
30107
- source?: "messaging" | "user" | "account_status";
31466
+ source?: "messaging" | "user" | "account_status" | "post";
30108
31467
  /** @description The URL that receives delivery POST requests. */
30109
31468
  request_url?: string;
30110
31469
  /** @description Human-readable label. */
@@ -30122,7 +31481,7 @@ export interface operations {
30122
31481
  }[];
30123
31482
  /** @description Canonical event names this webhook subscribes to. */
30124
31483
  events?: string[];
30125
- /** @description Field-remapping keys for the delivery payload (messaging and user sources only). */
31484
+ /** @description Field-remapping keys for the delivery payload (messaging and user sources only; post and account_status have none). */
30126
31485
  data?: string[];
30127
31486
  /**
30128
31487
  * @description HMAC signing secret, 64 hexadecimal characters, returned exactly once at creation. Store it securely.
@@ -30224,7 +31583,7 @@ export interface operations {
30224
31583
  object?: "webhook_event_catalogue";
30225
31584
  /** @description Event types grouped by source. */
30226
31585
  sources?: {
30227
- /** @description Event source group (messaging, user, account_status, recruiter, sales_nav). */
31586
+ /** @description Event source group (messaging, user, account_status, post, recruiter, sales_nav). */
30228
31587
  source?: string;
30229
31588
  events?: {
30230
31589
  /** @description Canonical event name. */
@@ -30382,7 +31741,7 @@ export interface operations {
30382
31741
  * @description The event source this webhook subscribes to (immutable).
30383
31742
  * @enum {string}
30384
31743
  */
30385
- source?: "messaging" | "user" | "account_status";
31744
+ source?: "messaging" | "user" | "account_status" | "post";
30386
31745
  /** @description The URL that receives delivery POST requests. */
30387
31746
  request_url?: string;
30388
31747
  /** @description Human-readable label. */
@@ -30400,7 +31759,7 @@ export interface operations {
30400
31759
  }[];
30401
31760
  /** @description Canonical event names this webhook subscribes to. */
30402
31761
  events?: string[];
30403
- /** @description Field-remapping keys for the delivery payload (messaging and user sources only). */
31762
+ /** @description Field-remapping keys for the delivery payload (messaging and user sources only; post and account_status have none). */
30404
31763
  data?: string[];
30405
31764
  /** @description First 8 characters of the signing secret. The full secret is never returned on edit, it is preserved unchanged. */
30406
31765
  secret_prefix?: string;
@@ -30578,7 +31937,7 @@ export interface operations {
30578
31937
  * @description The event source this webhook subscribes to (immutable).
30579
31938
  * @enum {string}
30580
31939
  */
30581
- source?: "messaging" | "user" | "account_status";
31940
+ source?: "messaging" | "user" | "account_status" | "post";
30582
31941
  /** @description The URL that receives delivery POST requests. */
30583
31942
  request_url?: string;
30584
31943
  /** @description Human-readable label. */
@@ -30596,7 +31955,7 @@ export interface operations {
30596
31955
  }[];
30597
31956
  /** @description Canonical event names this webhook subscribes to. */
30598
31957
  events?: string[];
30599
- /** @description Field-remapping keys for the delivery payload (messaging and user sources only). */
31958
+ /** @description Field-remapping keys for the delivery payload (messaging and user sources only; post and account_status have none). */
30600
31959
  data?: string[];
30601
31960
  /** @description First 8 characters of the signing secret. The full secret is never returned on edit, it is preserved unchanged. */
30602
31961
  secret_prefix?: string;
@@ -31701,7 +33060,7 @@ export interface operations {
31701
33060
  "application/json": components["schemas"]["Error"];
31702
33061
  };
31703
33062
  };
31704
- /** @description The purchase failed after today's charge was taken; the charge was refunded in full and the seat count was confirmed unchanged, so no seats were added. Safe to retry. */
33063
+ /** @description No seats were added. Branch on retry_likely_to_succeed. true: today's charge was refunded in full and the seat count was confirmed unchanged, so a retry is safe. false: whether today's charge went through could not be confirmed; a retry is a new purchase and could charge twice, so check your invoices first. */
31705
33064
  502: {
31706
33065
  headers: {
31707
33066
  [name: string]: unknown;