@curviate/sdk 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -40,6 +40,18 @@ var ERROR_CODES = [
40
40
  "CHECKPOINT_ALREADY_RESOLVED",
41
41
  "CHECKPOINT_UNSUPPORTED",
42
42
  "CONNECTION_IN_PROGRESS",
43
+ // One-premium boundary rejection — LinkedIn permits only one individual
44
+ // Premium subscription per profile. Surfaces on connect/reconnect (a seat
45
+ // resolving to both premiums) and on the billing seat/tier endpoints (a
46
+ // "naked enable" of one premium while the seat already holds the other).
47
+ // user_fixable, never retryable — the remedy is two seats, or pairing
48
+ // enable with disable of the current premium in one call.
49
+ "PREMIUM_CONFLICT",
50
+ // A reconnect whose seat-derived scope differs from the account's recorded
51
+ // scope was attempted with cookie auth — a cookie replay cannot change
52
+ // scope, so a full credentials re-authentication is required. user_fixable,
53
+ // never retryable.
54
+ "REAUTH_REQUIRED",
43
55
  // LinkedIn-specific connect errors
44
56
  "LINKEDIN_AUTH_FAILED",
45
57
  "LINKEDIN_RATE_LIMITED",
@@ -405,6 +417,17 @@ var AuthResource = class {
405
417
  * LinkedIn identity already present on the workspace (claiming it into your
406
418
  * account) rather than connecting a brand-new one — it is absent on a normal
407
419
  * connect.
420
+ *
421
+ * Connection scope (which LinkedIn products are enabled: classic, company,
422
+ * a premium tier) is **seat-derived**: there is no products input on this
423
+ * body, and the recorded scope is readable back as `requested_products` on
424
+ * the account (`accounts.list()` / `accounts.get()`). A reconnect that
425
+ * would change scope must use `auth_method: "credentials"`, since a cookie
426
+ * replay cannot change scope and throws `CurviateError(code:
427
+ * "REAUTH_REQUIRED")` instead. A seat resolving to both individual-Premium
428
+ * tiers at once throws `CurviateError(code: "PREMIUM_CONFLICT")` (LinkedIn
429
+ * permits only one per profile). Pin a managed proxy with the optional
430
+ * `country`/`ip`, or supply `proxy` to override it entirely.
408
431
  */
409
432
  intent(body) {
410
433
  return this.ctx.request({
@@ -495,8 +518,12 @@ var MessagingResource = class {
495
518
  }
496
519
  /**
497
520
  * Start a new chat with one or more members. `POST /v1/{account_id}/chats`
498
- * `attachments[]`, when supplied, carry base64-encoded file bytes — always
521
+ * `attachments[]`, when supplied, carry base64-encoded file bytes, always
499
522
  * sent as JSON, never multipart.
523
+ *
524
+ * Company pages are reply-only and cannot start a conversation this way.
525
+ * Reply to an existing one instead, with `sendMessage()` using a
526
+ * `COMPANY_` chat id from `inboxes.listChats()`.
500
527
  */
501
528
  startChat(body) {
502
529
  return this.ctx.request({
@@ -536,9 +563,31 @@ var MessagingResource = class {
536
563
  }
537
564
  /**
538
565
  * Send a message in a chat. `POST /v1/{account_id}/chats/{chat_id}/messages`
539
- * `attachments[]`, when supplied, carry base64-encoded file bytes — always
566
+ * `attachments[]`, when supplied, carry base64-encoded file bytes, always
540
567
  * sent as JSON, never multipart. At least one of `text`/`attachments` is
541
568
  * required (enforced server-side).
569
+ *
570
+ * Sending on behalf of a company page: this same method is the reply
571
+ * surface for a company page, there is no separate send-as-page method.
572
+ * Pass a `COMPANY_` chat id (from `inboxes.listChats()`, e.g.
573
+ * `"COMPANY_83734124_2-YTQ3ODU3Njgt"`) and the message sends AS THE PAGE,
574
+ * no extra parameter needed. Any other chat id sends as the connected
575
+ * member. Company pages are reply-only: they can answer an existing
576
+ * conversation this way, but `startChat()` cannot start one on their
577
+ * behalf.
578
+ *
579
+ * The response echoes `sent_as`, the acting identity actually used:
580
+ * `{ kind: "company", company_id, name }` (`company_id` is `null` when
581
+ * the page could not be correlated to a managed page) or
582
+ * `{ kind: "personal" }`. Never infer the acting identity from a
583
+ * message's `sender` field, only from `sent_as`.
584
+ *
585
+ * @example
586
+ * const acc = curviate.account("acc_YOUR_ACCOUNT_ID");
587
+ * const result = await acc.messaging.sendMessage("COMPANY_83734124_2-YTQ3ODU3Njgt", {
588
+ * text: "Thanks for reaching out!",
589
+ * });
590
+ * console.log(result.sent_as); // { kind: "company", company_id: "112013061", name: "Acme Inc" }
542
591
  */
543
592
  sendMessage(chatId, body) {
544
593
  return this.ctx.request({
@@ -608,6 +657,20 @@ var MessagingResource = class {
608
657
  body
609
658
  });
610
659
  }
660
+ /**
661
+ * Free-text search the account's own inbox — matches participant names
662
+ * and message content. `GET /v1/{account_id}/chats/search`
663
+ *
664
+ * @param params - `query` (required free-text term) plus `limit` and an
665
+ * opaque `cursor` for pagination.
666
+ */
667
+ searchChats(params) {
668
+ return this.ctx.request({
669
+ method: "GET",
670
+ path: "/v1/{account_id}/chats/search",
671
+ query: params
672
+ });
673
+ }
611
674
  };
612
675
 
613
676
  // src/resources/users.ts
@@ -893,6 +956,48 @@ var SearchResource = class {
893
956
  } : {}
894
957
  });
895
958
  }
959
+ /**
960
+ * Search LinkedIn groups by keyword.
961
+ * `GET /v1/{account_id}/search/groups`
962
+ */
963
+ groups(query) {
964
+ return this.ctx.request({
965
+ method: "GET",
966
+ path: "/v1/{account_id}/search/groups",
967
+ query
968
+ });
969
+ }
970
+ /**
971
+ * Search Services Marketplace providers with structured filters.
972
+ * `POST /v1/{account_id}/search/services`
973
+ * `limit`/`cursor` are top-level query params, never in the body. Resolve
974
+ * `service_category`/`location` filter values with `getServiceParameters()`
975
+ * first — both take opaque ids, not free text.
976
+ */
977
+ services(body) {
978
+ const split = splitPagination(body);
979
+ return this.ctx.request({
980
+ method: "POST",
981
+ path: "/v1/{account_id}/search/services",
982
+ body: split.body,
983
+ ...split.query ? { query: split.query } : {}
984
+ });
985
+ }
986
+ /**
987
+ * Resolve human-readable service-filter terms into the opaque ids
988
+ * `services()` accepts.
989
+ * `GET /v1/{account_id}/search/services/parameters`
990
+ *
991
+ * @param query - `type` selects `service_category` (default) or `location`;
992
+ * `keywords` is the free-text term to resolve.
993
+ */
994
+ getServiceParameters(query) {
995
+ return this.ctx.request({
996
+ method: "GET",
997
+ path: "/v1/{account_id}/search/services/parameters",
998
+ query
999
+ });
1000
+ }
896
1001
  };
897
1002
 
898
1003
  // src/resources/posts.ts
@@ -984,6 +1089,58 @@ var PostsResource = class {
984
1089
  ...params ? { query: params } : {}
985
1090
  });
986
1091
  }
1092
+ /**
1093
+ * List the connected account's own saved posts (a private bookmark list)
1094
+ * — newest-saved-first. A self resource: there is no other-member
1095
+ * saved-posts view, so this takes no target param. Each item is a
1096
+ * PREVIEW — `snippet` capped at ≤140 chars, never the full post body.
1097
+ * `GET /v1/{account_id}/saved-posts`
1098
+ *
1099
+ * @param params - optional `limit` (default 20, a page-aligned lower
1100
+ * bound) and an opaque `cursor` from a prior response.
1101
+ */
1102
+ listSaved(params) {
1103
+ return this.ctx.request({
1104
+ method: "GET",
1105
+ path: "/v1/{account_id}/saved-posts",
1106
+ ...params ? { query: params } : {}
1107
+ });
1108
+ }
1109
+ /**
1110
+ * Save a post to the connected account's private bookmark list. Any post
1111
+ * may be saved — it does not notify the author and is never visible to
1112
+ * third parties. Idempotent: saving an already-saved post re-asserts
1113
+ * `saved:true`.
1114
+ * `POST /v1/{account_id}/saved-posts`
1115
+ *
1116
+ * @param postId - the post to save. Accepts `urn:li:activity:<id>` or a
1117
+ * bare numeric `<id>` — both normalize to the same target. Any other
1118
+ * shape (`urn:li:ugcPost:…`, `urn:li:share:…`, a URL) is rejected with
1119
+ * `400 INVALID_REQUEST`.
1120
+ */
1121
+ save(postId) {
1122
+ const body = { post_id: postId };
1123
+ return this.ctx.request({
1124
+ method: "POST",
1125
+ path: "/v1/{account_id}/saved-posts",
1126
+ body
1127
+ });
1128
+ }
1129
+ /**
1130
+ * Unsave a post — the reverse of {@link save}, over the SAME underlying
1131
+ * save-state call (a distinct product endpoint, one substrate call).
1132
+ * Idempotent: unsaving a not-currently-saved post re-asserts
1133
+ * `saved:false`.
1134
+ * `DELETE /v1/{account_id}/saved-posts/{post_id}`
1135
+ *
1136
+ * @param postId - the post to unsave, same accepted shapes as {@link save}.
1137
+ */
1138
+ unsave(postId) {
1139
+ return this.ctx.request({
1140
+ method: "DELETE",
1141
+ path: `/v1/{account_id}/saved-posts/${postId}`
1142
+ });
1143
+ }
987
1144
  };
988
1145
 
989
1146
  // src/resources/comments.ts
@@ -1094,6 +1251,320 @@ var CommentsResource = class {
1094
1251
  }
1095
1252
  };
1096
1253
 
1254
+ // src/resources/profile.ts
1255
+ var ProfileResource = class {
1256
+ constructor(ctx) {
1257
+ this.ctx = ctx;
1258
+ }
1259
+ /**
1260
+ * Read the connected account's premium subscription — its full entitlement
1261
+ * inventory, primary plan title, and LinkedIn management links.
1262
+ * `GET /v1/{account_id}/profile/subscription`
1263
+ *
1264
+ * A free account is a valid, non-error result: `has_premium` is `false`,
1265
+ * `plan_title` is `null`, and `subscriptions` is empty. Read
1266
+ * `subscriptions` for the complete set of active plans; the flat fields
1267
+ * mirror the primary plan only.
1268
+ */
1269
+ subscription() {
1270
+ return this.ctx.request({
1271
+ method: "GET",
1272
+ path: `/v1/{account_id}/profile/subscription`
1273
+ });
1274
+ }
1275
+ /**
1276
+ * Read the connected account's performance headline metrics — profile
1277
+ * viewers, followers, post impressions, and search appearances.
1278
+ * `GET /v1/{account_id}/profile/analytics`
1279
+ *
1280
+ * Each metric is a headline scalar over a fixed reporting window set by
1281
+ * LinkedIn (viewers 90d, impressions 7d, search last completed week,
1282
+ * followers running total); there is no window selector. A `count` of `0`
1283
+ * is a real zero; a per-metric `null` means that one card was unavailable.
1284
+ */
1285
+ analytics() {
1286
+ return this.ctx.request({
1287
+ method: "GET",
1288
+ path: `/v1/{account_id}/profile/analytics`
1289
+ });
1290
+ }
1291
+ /**
1292
+ * List the people who recently viewed the connected account's profile,
1293
+ * cursor-paginated and classified by disclosure fidelity.
1294
+ * `GET /v1/{account_id}/profile/visitors`
1295
+ *
1296
+ * Each item's `kind` is `identified`, `semi-anonymous`, or `aggregate` —
1297
+ * a Premium account sees identified viewers, a free account is capped at a
1298
+ * lower fidelity (still a `200`, never a permission error). Page with the
1299
+ * returned `cursor`: a non-null `cursor` means more may exist, even if a
1300
+ * page held zero identified individuals; `cursor: null` means exhausted.
1301
+ *
1302
+ * @param params - `limit` (1–100, default 20) and an opaque `cursor` from
1303
+ * a prior response.
1304
+ */
1305
+ visitors(params) {
1306
+ return this.ctx.request({
1307
+ method: "GET",
1308
+ path: `/v1/{account_id}/profile/visitors`,
1309
+ ...params ? { query: params } : {}
1310
+ });
1311
+ }
1312
+ /**
1313
+ * Read the connected account's Social Selling Index — the overall score,
1314
+ * its four pillar breakdowns, and industry/network percentile ranks.
1315
+ * `GET /v1/{account_id}/profile/ssi`
1316
+ *
1317
+ * A low score on a low-activity account is a normal `200`; a genuine
1318
+ * zero-activity account returns all scalars `null` with `active_seat`
1319
+ * `false`. Scores preserve full float precision.
1320
+ */
1321
+ ssi() {
1322
+ return this.ctx.request({
1323
+ method: "GET",
1324
+ path: `/v1/{account_id}/profile/ssi`
1325
+ });
1326
+ }
1327
+ };
1328
+
1329
+ // src/resources/groups.ts
1330
+ var GroupsResource = class {
1331
+ constructor(ctx) {
1332
+ this.ctx = ctx;
1333
+ }
1334
+ /**
1335
+ * List the LinkedIn groups a member belongs to, each enriched to full
1336
+ * group detail. `GET /v1/{account_id}/profile/groups`
1337
+ *
1338
+ * Reads the connected account's own groups by default; pass `{ profile }`
1339
+ * (a member's public identifier) to read another member's group set. The
1340
+ * `id` on each returned group is the same id `members()` consumes.
1341
+ *
1342
+ * @param params - optional `{ profile }` to target another member, plus
1343
+ * `limit` and an opaque `cursor` for pagination.
1344
+ */
1345
+ list(params) {
1346
+ return this.ctx.request({
1347
+ method: "GET",
1348
+ path: `/v1/{account_id}/profile/groups`,
1349
+ ...params ? { query: params } : {}
1350
+ });
1351
+ }
1352
+ /**
1353
+ * Retrieve a single LinkedIn group's full detail — its name, description,
1354
+ * member count, membership status, and admin contact.
1355
+ * `GET /v1/{account_id}/groups/{group}`
1356
+ *
1357
+ * @param group - the group's id or LinkedIn group URL.
1358
+ */
1359
+ get(group) {
1360
+ return this.ctx.request({
1361
+ method: "GET",
1362
+ path: `/v1/{account_id}/groups/${group}`
1363
+ });
1364
+ }
1365
+ /**
1366
+ * List a group's members, cursor-paginated, each carrying its profile URL,
1367
+ * name, and headline. `GET /v1/{account_id}/groups/{group}/members`
1368
+ *
1369
+ * Pass `{ name }` to search the roster by member name — the folded-in
1370
+ * member search, not a separate endpoint.
1371
+ *
1372
+ * @param group - the group's id or LinkedIn group URL.
1373
+ * @param params - optional `{ name }` filter plus `limit` and an opaque
1374
+ * `cursor` for pagination.
1375
+ */
1376
+ members(group, params) {
1377
+ return this.ctx.request({
1378
+ method: "GET",
1379
+ path: `/v1/{account_id}/groups/${group}/members`,
1380
+ ...params ? { query: params } : {}
1381
+ });
1382
+ }
1383
+ };
1384
+
1385
+ // src/resources/feed.ts
1386
+ var FeedResource = class {
1387
+ constructor(ctx) {
1388
+ this.ctx = ctx;
1389
+ }
1390
+ /**
1391
+ * Read the connected account's LinkedIn home feed as agent-actionable posts.
1392
+ * `GET /v1/{account_id}/feed/home`
1393
+ *
1394
+ * Pass `{ sort }` to choose the order: `recent` (reverse-chronological,
1395
+ * the default) or `relevant` (LinkedIn's ranked "top" feed). The feed is an
1396
+ * unbounded, reordering stream with no total count — walk it with the
1397
+ * returned `cursor` until `cursor` is null. When a `cursor` is supplied its
1398
+ * carrier is authoritative and `sort` is ignored.
1399
+ *
1400
+ * @param params - optional `{ sort }`, `limit` (1–100, default 20), and an
1401
+ * opaque `cursor` from a prior response.
1402
+ */
1403
+ home(params) {
1404
+ return this.ctx.request({
1405
+ method: "GET",
1406
+ path: `/v1/{account_id}/feed/home`,
1407
+ ...params ? { query: params } : {}
1408
+ });
1409
+ }
1410
+ };
1411
+
1412
+ // src/resources/inboxes.ts
1413
+ var InboxesResource = class {
1414
+ constructor(ctx) {
1415
+ this.ctx = ctx;
1416
+ }
1417
+ /**
1418
+ * List the account's inboxes: its own personal inbox, plus, when the
1419
+ * company product is attached, one entry per company page (id like
1420
+ * `"COMPANY_83734124_PRIMARY"`). `GET /v1/{account_id}/inboxes`
1421
+ *
1422
+ * Company inboxes carry `reply_only: true`: reply to an existing
1423
+ * conversation via `messaging.sendMessage()`, never `startChat()`.
1424
+ * `company_id` is resolved by correlating the page name against the
1425
+ * account's managed pages. An uncorrelatable page reports
1426
+ * `company_id: null`, never a fabricated id. When no company inbox
1427
+ * exists, `hint` names the Company Pages reconnect requirement instead of
1428
+ * an empty list.
1429
+ *
1430
+ * Beta.
1431
+ *
1432
+ * @param params - optional `{ kind }` (`"personal"` or `"company"`)
1433
+ * and/or `{ company_id }` filters. Omit to list every inbox.
1434
+ *
1435
+ * @example
1436
+ * const acc = curviate.account("acc_YOUR_ACCOUNT_ID");
1437
+ * const { items, hint } = await acc.inboxes.list({ kind: "company" });
1438
+ * const companyPage = (items ?? []).find((i) => i.kind === "company");
1439
+ * console.log(companyPage?.id, companyPage?.name, hint);
1440
+ * // companyPage?.id is what you pass to listChats(), e.g. "COMPANY_83734124_PRIMARY"
1441
+ */
1442
+ list(params) {
1443
+ return this.ctx.request({
1444
+ method: "GET",
1445
+ path: `/v1/{account_id}/inboxes`,
1446
+ ...params ? { query: params } : {}
1447
+ });
1448
+ }
1449
+ /**
1450
+ * List an inbox's conversations, newest-activity-first, cursor-paginated.
1451
+ * `GET /v1/{account_id}/inboxes/{inbox_id}/chats`
1452
+ *
1453
+ * Every chat's `id` is already send-ready: pass it directly to
1454
+ * `messaging.sendMessage(chatId, { text })` to reply. A company inbox's
1455
+ * chat id (e.g. `"COMPANY_83734124_2-YTQ3ODU3Njgt"`) replies AS THE PAGE,
1456
+ * no separate parameter needed. This is the full reply-as-a-page flow:
1457
+ *
1458
+ * ```ts
1459
+ * const { items: inboxes } = await acc.inboxes.list({ kind: "company" });
1460
+ * const pageInbox = inboxes[0]!; // e.g. id "COMPANY_83734124_PRIMARY", reply_only: true
1461
+ *
1462
+ * const { items: chats } = await acc.inboxes.listChats(pageInbox.id);
1463
+ * const chatId = chats[0]!.id as string; // e.g. "COMPANY_83734124_2-YTQ3ODU3Njgt"
1464
+ *
1465
+ * const sent = await acc.messaging.sendMessage(chatId, { text: "Thanks for reaching out!" });
1466
+ * console.log(sent.sent_as); // { kind: "company", company_id: "112013061", name: "Acme Inc" }
1467
+ * ```
1468
+ *
1469
+ * Works identically for personal (`CLASSIC_`) inboxes: pass a `CLASSIC_`
1470
+ * chat id and the send goes out as the connected member. An unknown
1471
+ * `inbox_id` returns `RESOURCE_NOT_FOUND` (404). Beta.
1472
+ *
1473
+ * @param inboxId - the inbox id from `list()` (e.g. `"CLASSIC_PRIMARY"`
1474
+ * or `"COMPANY_83734124_PRIMARY"`).
1475
+ * @param params - optional `limit` (1–25, default 20) and an opaque
1476
+ * `cursor` for pagination.
1477
+ */
1478
+ listChats(inboxId, params) {
1479
+ return this.ctx.request({
1480
+ method: "GET",
1481
+ path: `/v1/{account_id}/inboxes/${inboxId}/chats`,
1482
+ ...params ? { query: params } : {}
1483
+ });
1484
+ }
1485
+ };
1486
+
1487
+ // src/resources/notifications.ts
1488
+ var NotificationsResource = class {
1489
+ constructor(ctx) {
1490
+ this.ctx = ctx;
1491
+ }
1492
+ /**
1493
+ * List the connected account's notification cards — newest first, plus
1494
+ * the account-level `unread_count` (the unseen badge — NOT a count of
1495
+ * `items`) and `latest_published_at` (a cheap poll watermark). Injected
1496
+ * promo/suggestion cards are included and flagged (`injected:true`),
1497
+ * never filtered.
1498
+ * `GET /v1/{account_id}/notifications`
1499
+ *
1500
+ * @param params - optional `filter` (7-token enum, default `all`),
1501
+ * `limit` (1-100, default 20), and an opaque `cursor` from a prior
1502
+ * response. Page until the returned `cursor` is `null`.
1503
+ */
1504
+ list(params) {
1505
+ return this.ctx.request({
1506
+ method: "GET",
1507
+ path: "/v1/{account_id}/notifications",
1508
+ ...params ? { query: params } : {}
1509
+ });
1510
+ }
1511
+ /**
1512
+ * Delete one of the connected account's own notification cards by its
1513
+ * card urn. A self-action — no third party is notified. This cannot be
1514
+ * undone.
1515
+ *
1516
+ * **Safe to retry.** Idempotent: deleting a card you already deleted
1517
+ * succeeds with `200`, not an error — a client that retries after a
1518
+ * timeout is never punished for it. Only a `card_urn` that never existed
1519
+ * on this account 404s.
1520
+ *
1521
+ * **Timing.** The removal takes effect within a few seconds; a
1522
+ * {@link list} read immediately after this call may still include the
1523
+ * card for a moment. That is not a failure signal — the `200` is already
1524
+ * confirmation the card was resolved and the removal accepted. Re-read
1525
+ * after a short delay, not instantly, if you need to visually confirm.
1526
+ *
1527
+ * `DELETE /v1/{account_id}/notifications/{card_urn}`
1528
+ *
1529
+ * @param cardUrn - the card's entity urn, raw/unencoded (the `card_urn`
1530
+ * field of a {@link list} item — `urn:li:fsd_notificationCard:(…)`,
1531
+ * NOT `object_urn`, which targets the wrong notification). The SDK
1532
+ * percent-encodes it into the path.
1533
+ */
1534
+ delete(cardUrn) {
1535
+ return this.ctx.request({
1536
+ method: "DELETE",
1537
+ path: `/v1/{account_id}/notifications/${encodeURIComponent(cardUrn)}`
1538
+ });
1539
+ }
1540
+ /**
1541
+ * Apply "show less like this" to the source of one of the connected
1542
+ * account's own notification cards — a self-action, same card handle and
1543
+ * timing/retry contract as {@link delete}. For network-activity cards (a
1544
+ * repost, comment, or reaction by your network) this **removes the
1545
+ * card**, the same effect as `delete` — LinkedIn exposes no separate,
1546
+ * softer signal for these cards; this method exists so the calling
1547
+ * intent reads clearly, not because it behaves differently. This cannot
1548
+ * be undone.
1549
+ *
1550
+ * **Safe to retry**, same timing as {@link delete}: idempotent (a repeat
1551
+ * is a `200`, not an error), effective within a few seconds — a
1552
+ * still-visible card on an immediate {@link list} re-read is not a
1553
+ * failure signal.
1554
+ *
1555
+ * `POST /v1/{account_id}/notifications/{card_urn}/show-less`
1556
+ *
1557
+ * @param cardUrn - the card's entity urn, raw/unencoded (see
1558
+ * {@link delete}). The SDK percent-encodes it into the path.
1559
+ */
1560
+ showLess(cardUrn) {
1561
+ return this.ctx.request({
1562
+ method: "POST",
1563
+ path: `/v1/{account_id}/notifications/${encodeURIComponent(cardUrn)}/show-less`
1564
+ });
1565
+ }
1566
+ };
1567
+
1097
1568
  // src/resources/sales-navigator.ts
1098
1569
  var SalesNavigatorResource = class {
1099
1570
  constructor(ctx) {
@@ -1764,6 +2235,122 @@ var CompaniesResource = class {
1764
2235
  ...params ? { query: params } : {}
1765
2236
  });
1766
2237
  }
2238
+ /**
2239
+ * List the pages the connected account administers.
2240
+ * `GET /v1/{account_id}/companies/managed`
2241
+ *
2242
+ * The `id` on each returned page is the numeric provider_id `followers()`,
2243
+ * `invitableFollowers()`, `employees()`, `posts()`, and `jobs()` consume.
2244
+ * An empty `items[]` is valid — the account administers no pages.
2245
+ */
2246
+ managed(params) {
2247
+ return this.ctx.request({
2248
+ method: "GET",
2249
+ path: `/v1/{account_id}/companies/managed`,
2250
+ ...params ? { query: params } : {}
2251
+ });
2252
+ }
2253
+ /**
2254
+ * List a company page's followers, newest first.
2255
+ * `GET /v1/{account_id}/companies/{identifier}/followers`
2256
+ *
2257
+ * The connected account must administer the page (see `managed()`).
2258
+ * `identifier` must be the company's numeric provider_id.
2259
+ */
2260
+ followers(identifier, params) {
2261
+ return this.ctx.request({
2262
+ method: "GET",
2263
+ path: `/v1/{account_id}/companies/${identifier}/followers`,
2264
+ ...params ? { query: params } : {}
2265
+ });
2266
+ }
2267
+ /**
2268
+ * List the connected account's connections who are invitable to follow the
2269
+ * company page. `GET /v1/{account_id}/companies/{identifier}/invitable-followers`
2270
+ *
2271
+ * The connected account must administer the page. `identifier` must be the
2272
+ * company's numeric provider_id. An empty `items[]` is valid — nobody is
2273
+ * currently invitable.
2274
+ */
2275
+ invitableFollowers(identifier, params) {
2276
+ return this.ctx.request({
2277
+ method: "GET",
2278
+ path: `/v1/{account_id}/companies/${identifier}/invitable-followers`,
2279
+ ...params ? { query: params } : {}
2280
+ });
2281
+ }
2282
+ /**
2283
+ * List the conversations in a company page's admin message inbox,
2284
+ * newest-activity-first.
2285
+ * `GET /v1/{account_id}/companies/{identifier}/chats`
2286
+ *
2287
+ * The connected account must administer the page. `identifier` must be the
2288
+ * company's numeric provider_id. Content passes through verbatim and is
2289
+ * never stored. Beta — single-page listing and termination are verified;
2290
+ * deep pagination (many pages / large cursor round-trips) is provisional
2291
+ * until validated against a busier inbox.
2292
+ */
2293
+ chats(identifier, params) {
2294
+ return this.ctx.request({
2295
+ method: "GET",
2296
+ path: `/v1/{account_id}/companies/${identifier}/chats`,
2297
+ ...params ? { query: params } : {}
2298
+ });
2299
+ }
2300
+ /**
2301
+ * Retrieve one conversation from a company page's admin inbox.
2302
+ * `GET /v1/{account_id}/companies/{identifier}/chats/{chat_id}`
2303
+ *
2304
+ * The connected account must administer the page. Beta — see `chats()`.
2305
+ */
2306
+ chat(identifier, chatId) {
2307
+ return this.ctx.request({
2308
+ method: "GET",
2309
+ path: `/v1/{account_id}/companies/${identifier}/chats/${chatId}`
2310
+ });
2311
+ }
2312
+ /**
2313
+ * List a company-inbox conversation's messages, newest first.
2314
+ * `GET /v1/{account_id}/companies/{identifier}/chats/{chat_id}/messages`
2315
+ *
2316
+ * The connected account must administer the page. Content passes through
2317
+ * verbatim and is never stored. Beta — see `chats()`.
2318
+ */
2319
+ messages(identifier, chatId, params) {
2320
+ return this.ctx.request({
2321
+ method: "GET",
2322
+ path: `/v1/{account_id}/companies/${identifier}/chats/${chatId}/messages`,
2323
+ ...params ? { query: params } : {}
2324
+ });
2325
+ }
2326
+ /**
2327
+ * Retrieve one message from a company-inbox conversation.
2328
+ * `GET /v1/{account_id}/companies/{identifier}/chats/{chat_id}/messages/{message_id}`
2329
+ *
2330
+ * The connected account must administer the page. Beta — see `chats()`.
2331
+ */
2332
+ message(identifier, chatId, messageId) {
2333
+ return this.ctx.request({
2334
+ method: "GET",
2335
+ path: `/v1/{account_id}/companies/${identifier}/chats/${chatId}/messages/${messageId}`
2336
+ });
2337
+ }
2338
+ /**
2339
+ * Search or filter a company page's admin inbox.
2340
+ * `GET /v1/{account_id}/companies/{identifier}/chats/search`
2341
+ *
2342
+ * Exactly one mode per call: free-text `query` (matches participant names
2343
+ * and message content), a `topic` card, or `unread`-only — the three are
2344
+ * mutually exclusive and enforced server-side. The connected account must
2345
+ * administer the page. Beta — see `chats()`.
2346
+ */
2347
+ searchChats(identifier, params) {
2348
+ return this.ctx.request({
2349
+ method: "GET",
2350
+ path: `/v1/{account_id}/companies/${identifier}/chats/search`,
2351
+ ...params ? { query: params } : {}
2352
+ });
2353
+ }
1767
2354
  };
1768
2355
 
1769
2356
  // src/resources/webhooks.ts
@@ -1850,6 +2437,11 @@ function buildNamespaces(ctx) {
1850
2437
  search: new SearchResource(ctx),
1851
2438
  posts: new PostsResource(ctx),
1852
2439
  comments: new CommentsResource(ctx),
2440
+ profile: new ProfileResource(ctx),
2441
+ groups: new GroupsResource(ctx),
2442
+ feed: new FeedResource(ctx),
2443
+ inboxes: new InboxesResource(ctx),
2444
+ notifications: new NotificationsResource(ctx),
1853
2445
  salesNavigator: new SalesNavigatorResource(ctx),
1854
2446
  recruiter: new RecruiterResource(ctx),
1855
2447
  jobs: new JobsResource(ctx),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curviate/sdk",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "private": false,
5
5
  "description": "TypeScript SDK for the Curviate API.",
6
6
  "license": "MIT",