@graph8/sdk 0.295.2 → 0.302.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.
@@ -5,6 +5,6 @@
5
5
  * both together (the version-parity gate already pins package.json, the
6
6
  * lockfile and the CHANGELOG to each other).
7
7
  */
8
- export declare const SDK_VERSION = "0.295.2";
8
+ export declare const SDK_VERSION = "0.302.0";
9
9
  /** Value of the `X-G8-Client` header every SDK request carries (I-13). */
10
- export declare const SDK_CLIENT_ID = "js-sdk/0.295.2";
10
+ export declare const SDK_CLIENT_ID = "js-sdk/0.302.0";
package/docs/agents.md CHANGED
@@ -9,7 +9,7 @@ grows every week and your training data is older than this file.
9
9
 
10
10
  graph8 is a B2B go-to-market platform: CRM (contacts, companies, deals, custom objects), a 700M-person
11
11
  data index with enrichment, intent signals, sequences and campaigns across email/SMS/LinkedIn/voice, a unified
12
- inbox, meetings, workflows and more. This SDK reaches all of it: **3255 Developer API
12
+ inbox, meetings, workflows and more. This SDK reaches all of it: **3258 Developer API
13
13
  operations** in 141 areas.
14
14
 
15
15
  ## 1. The short version
@@ -92,7 +92,7 @@ g8.init({ apiKey: process.env.G8_API_KEY! });
92
92
  | | Hand-written clients | `g8.api` (generated) |
93
93
  |---|---|---|
94
94
  | Example | `g8.contacts.upsert({ list_id, work_email })` | `g8.api.assertUpsert.assertContact({ body: { list_id, work_email } })` |
95
- | Coverage | 289 methods, reaching 258 operations | all 3255 operations |
95
+ | Coverage | 289 methods, reaching 258 operations | all 3258 operations |
96
96
  | Returns | the unwrapped value (usually `data`) | the full envelope; read `result.data` |
97
97
  | Arguments | positional / friendly names | `{ path?, query?, headers?, body? }`, exactly as the contract names them |
98
98
  | Reference | [sdk-clients.md](sdk-clients.md) | [api/README.md](api/README.md) |
@@ -141,7 +141,7 @@ Hand-written modules:
141
141
  | [`g8.webhooks`](sdk-clients.md#g8-webhooks) | 1 | API key |
142
142
  | [`g8.workflows`](sdk-clients.md#g8-workflows) | 21 | API key |
143
143
 
144
- `g8.api` namespaces (operation counts): `accounts` (16), `adCampaigns` (19), `adCreatives` (40), `agency` (24), `agent` (8), `agents` (65), `aiInbox` (79), `analytics` (51), `apiKeys` (6), `appDeployments` (7), `appDomains` (5), `appLogs` (2), `appObjects` (10), `appPages` (16), `appPlatformTokens` (3), `appointments` (92), `apps` (22), `assertUpsert` (6), `audienceSyncs` (8), `brandKit` (30), `bugReports` (7), `calendarInvites` (3), `campaignWorkflows` (5), `campaigns` (29), `channels` (5), `cliCampaigns` (6), `cliPipelines` (12), `clickHouse` (2), `companies` (50), `companyIntelligence` (14), `contacts` (70), `content` (41), `contentGridSkills` (6), `copilot` (39), `crmSyncs` (6), `customerSuccess` (19), `deals` (48), `deliverability` (17), `desk` (71), `dialer` (46), `dialerAnalytics` (6), `documents` (35), `duplicates` (7), `eSign` (1), `eSignature` (7), `enrichment` (115), `events` (1), `fields` (8), `forms` (35), `gtmCampaigns` (22), `gtmContext` (51), `gtmDeliverability` (1), `gtmKnowledgeBase` (2), `gtmLaunchHelpers` (2), `gtmLibrary` (20), `health` (1), `imageLibrary` (14), `imports` (3), `inbox` (22), `install` (6), `installedApps` (4), `integrationStatus` (6), `integrations` (83), `intent` (16), `knowledge` (21), `knowledgeBase` (2), `landingPages` (59), `leads` (4), `library` (9), `linkedIn` (5), `linkedInOutreach` (20), `lists` (36), `logs` (1), `mailboxes` (38), `marketingIntelligence` (10), `marketplace` (142), `mcp` (1), `me` (1), `meetings` (17), `newsletter` (61), `notes` (19), `notifications` (2), `objects` (18), `openSearch` (4), `ops` (5), `orgGovernance` (17), `orgVideos` (6), `organizationSettings` (22), `phoneNumbers` (16), `profile` (14), `programmaticPages` (15), `providerDomains` (34), `providerUsage` (5), `public` (1), `publicCopilot` (1), `publicSignals` (1), `publicVisitors` (2), `quotes` (56), `radar` (42), `radarReports` (8), `recordRoles` (4), `repos` (4), `research` (13), `revenue` (14), `revenueAnalytics` (6), `revenueLifecycle` (5), `revenueRecords` (15), `roles` (21), `salesCoach` (37), `sandbox` (9), `scans` (2), `scheduleBuy` (9), `scraping` (10), `sdrAnalytics` (5), `search` (19), `seo` (11), `sequenceLifecycle` (8), `sequences` (71), `settings` (18), `signals` (56), `signatures` (24), `skills` (12), `snippet` (3), `socialPublishing` (22), `studioDocuments` (9), `support` (1), `suppressions` (6), `surveys` (21), `tasks` (25), `teamMembers` (21), `teams` (35), `usage` (9), `visitors` (26), `voice` (187), `webAnalytics` (38), `webChat` (46), `webhooks` (8), `websiteEditor` (12), `work` (59), `workbench` (107), `workflows` (59).
144
+ `g8.api` namespaces (operation counts): `accounts` (16), `adCampaigns` (19), `adCreatives` (40), `agency` (24), `agent` (8), `agents` (65), `aiInbox` (79), `analytics` (51), `apiKeys` (6), `appDeployments` (7), `appDomains` (5), `appLogs` (2), `appObjects` (10), `appPages` (16), `appPlatformTokens` (3), `appointments` (92), `apps` (22), `assertUpsert` (6), `audienceSyncs` (8), `brandKit` (30), `bugReports` (7), `calendarInvites` (3), `campaignWorkflows` (5), `campaigns` (29), `channels` (5), `cliCampaigns` (6), `cliPipelines` (12), `clickHouse` (2), `companies` (50), `companyIntelligence` (14), `contacts` (70), `content` (41), `contentGridSkills` (6), `copilot` (39), `crmSyncs` (6), `customerSuccess` (19), `deals` (48), `deliverability` (17), `desk` (71), `dialer` (46), `dialerAnalytics` (6), `documents` (35), `duplicates` (7), `eSign` (1), `eSignature` (7), `enrichment` (115), `events` (1), `fields` (8), `forms` (35), `gtmCampaigns` (22), `gtmContext` (51), `gtmDeliverability` (1), `gtmKnowledgeBase` (2), `gtmLaunchHelpers` (2), `gtmLibrary` (20), `health` (1), `imageLibrary` (14), `imports` (3), `inbox` (22), `install` (6), `installedApps` (4), `integrationStatus` (6), `integrations` (83), `intent` (16), `knowledge` (21), `knowledgeBase` (2), `landingPages` (59), `leads` (4), `library` (9), `linkedIn` (5), `linkedInOutreach` (20), `lists` (36), `logs` (1), `mailboxes` (38), `marketingIntelligence` (10), `marketplace` (142), `mcp` (1), `me` (1), `meetings` (17), `newsletter` (61), `notes` (19), `notifications` (2), `objects` (18), `openSearch` (4), `ops` (5), `orgGovernance` (17), `orgVideos` (6), `organizationSettings` (22), `phoneNumbers` (16), `profile` (14), `programmaticPages` (15), `providerDomains` (34), `providerUsage` (5), `public` (1), `publicCopilot` (1), `publicSignals` (1), `publicVisitors` (2), `quotes` (56), `radar` (42), `radarReports` (8), `recordRoles` (4), `repos` (4), `research` (13), `revenue` (14), `revenueAnalytics` (6), `revenueLifecycle` (5), `revenueRecords` (15), `roles` (21), `salesCoach` (37), `sandbox` (9), `scans` (2), `scheduleBuy` (9), `scraping` (10), `sdrAnalytics` (5), `search` (19), `seo` (14), `sequenceLifecycle` (8), `sequences` (71), `settings` (18), `signals` (56), `signatures` (24), `skills` (12), `snippet` (3), `socialPublishing` (22), `studioDocuments` (9), `support` (1), `suppressions` (6), `surveys` (21), `tasks` (25), `teamMembers` (21), `teams` (35), `usage` (9), `visitors` (26), `voice` (187), `webAnalytics` (38), `webChat` (46), `webhooks` (8), `websiteEditor` (12), `work` (59), `workbench` (107), `workflows` (59).
145
145
 
146
146
  ## 5. How to find the right call
147
147
 
@@ -196,7 +196,7 @@ Every operation carries a tier:
196
196
 
197
197
  | Tier | What it means | Count |
198
198
  |---|---|---|
199
- | `read` | reads data; safe to call and to retry | 1510 |
199
+ | `read` | reads data; safe to call and to retry | 1513 |
200
200
  | `write` | creates or changes records; the SDK sends an Idempotency-Key and retries transient failures | 811 |
201
201
  | `destructive` | deletes or archives data; confirm with a human before calling | 300 |
202
202
  | `billable` | spends credits; the SDK never blindly retries it; confirm cost before bulk use | 383 |
@@ -2,7 +2,7 @@
2
2
 
3
3
  # `g8.api`: every Developer API operation
4
4
 
5
- `g8.api` is generated from the published OpenAPI contract, so it covers all 3255 operations across 141 namespaces (1510 read, 811 write, 300 destructive, 383 billable, 251 external).
5
+ `g8.api` is generated from the published OpenAPI contract, so it covers all 3258 operations across 141 namespaces (1513 read, 811 write, 300 destructive, 383 billable, 251 external).
6
6
 
7
7
  - Found a REST path in a curl example or the web docs? Look it up in [by-path.md](by-path.md).
8
8
  - Prefer a hand-written method where one exists: [../sdk-clients.md](../sdk-clients.md).
@@ -137,7 +137,7 @@
137
137
  | `g8.api.scraping` | Scraping | 10 | none | [scraping.md](scraping.md) | [scraping.d.ts](scraping.d.ts) |
138
138
  | `g8.api.sdrAnalytics` | SDR Analytics | 5 | none | [sdrAnalytics.md](sdrAnalytics.md) | [sdrAnalytics.d.ts](sdrAnalytics.d.ts) |
139
139
  | `g8.api.search` | Search | 19 | 4 | [search.md](search.md) | [search.d.ts](search.d.ts) |
140
- | `g8.api.seo` | SEO | 11 | none | [seo.md](seo.md) | [seo.d.ts](seo.d.ts) |
140
+ | `g8.api.seo` | SEO | 14 | none | [seo.md](seo.md) | [seo.d.ts](seo.d.ts) |
141
141
  | `g8.api.sequenceLifecycle` | Sequence Lifecycle | 8 | 6 | [sequenceLifecycle.md](sequenceLifecycle.md) | [sequenceLifecycle.d.ts](sequenceLifecycle.d.ts) |
142
142
  | `g8.api.sequences` | Sequences | 71 | 6 | [sequences.md](sequences.md) | [sequences.d.ts](sequences.d.ts) |
143
143
  | `g8.api.settings` | Settings | 18 | none | [settings.md](settings.md) | [settings.d.ts](settings.d.ts) |
@@ -2466,6 +2466,9 @@ Every Developer API route, sorted by path, with the SDK call that reaches it. Th
2466
2466
  | POST | `/api/v1/seo/audits` | [`g8.api.seo.startSeoAudit`](seo.md#op-startseoaudit) | billable |
2467
2467
  | GET | `/api/v1/seo/audits/{audit_id}` | [`g8.api.seo.getSeoAudit`](seo.md#op-getseoaudit) | read |
2468
2468
  | GET | `/api/v1/seo/audits/{audit_id}/issues` | [`g8.api.seo.getSeoAuditIssues`](seo.md#op-getseoauditissues) | read |
2469
+ | GET | `/api/v1/seo/domains/tracked` | [`g8.api.seo.listSeoTrackedDomains`](seo.md#op-listseotrackeddomains) | read |
2470
+ | GET | `/api/v1/seo/domains/tracked/{domain}` | [`g8.api.seo.getSeoTrackedDomain`](seo.md#op-getseotrackeddomain) | read |
2471
+ | GET | `/api/v1/seo/domains/tracked/{domain}/pages` | [`g8.api.seo.listSeoDomainPages`](seo.md#op-listseodomainpages) | read |
2469
2472
  | GET | `/api/v1/seo/domains/{domain}/backlinks` | [`g8.api.seo.getSeoDomainBacklinks`](seo.md#op-getseodomainbacklinks) | billable |
2470
2473
  | GET | `/api/v1/seo/domains/{domain}/overview` | [`g8.api.seo.getSeoDomainOverview`](seo.md#op-getseodomainoverview) | billable |
2471
2474
  | POST | `/api/v1/seo/keywords/research` | [`g8.api.seo.researchSeoKeywords`](seo.md#op-researchseokeywords) | billable |
@@ -1074,6 +1074,13 @@ export interface Column {
1074
1074
  id?: number | null;
1075
1075
  /** Automatically computed: True if object_id is None/empty, False otherwise. */
1076
1076
  is_global: boolean;
1077
+ /**
1078
+ * Human-readable display name (CF-09), e.g. ``CONTACT_FIRST_NAME`` ->
1079
+ * "First name", ``COMPANY_NAICS`` -> "Company NAICS". Custom columns keep
1080
+ * their own title. Additive and read-only: ``name`` / ``title`` stay the
1081
+ * storage key, because callers send them back as identifiers.
1082
+ */
1083
+ label: string | null;
1077
1084
  name?: string | null;
1078
1085
  object_id?: string | null;
1079
1086
  source?: ColumnSource;
@@ -1479,6 +1479,7 @@ Other envelope fields: `pagination` (PaginationMeta).
1479
1479
  | Field | Type | Required | Description |
1480
1480
  |---|---|---|---|
1481
1481
  | `is_global` | `boolean` | yes | Automatically computed: True if object_id is None/empty, False otherwise. |
1482
+ | `label` | `string \| null` | yes | Human-readable display name (CF-09), e.g. ``CONTACT_FIRST_NAME`` -> "First name", ``COMPANY_NAICS`` -> "Company NAICS". Custom columns keep their own title. Additive and read-only: ``name`` / ``title`` stay the storage key, because callers send them back as identifiers. |
1482
1483
  | `title` | `string` | yes | |
1483
1484
  | `data_type` | `ColumnType` | no | default `"text"` |
1484
1485
  | `id` | `integer \| null` | no | |
@@ -1422,6 +1422,13 @@ export interface Column {
1422
1422
  id?: number | null;
1423
1423
  /** Automatically computed: True if object_id is None/empty, False otherwise. */
1424
1424
  is_global: boolean;
1425
+ /**
1426
+ * Human-readable display name (CF-09), e.g. ``CONTACT_FIRST_NAME`` ->
1427
+ * "First name", ``COMPANY_NAICS`` -> "Company NAICS". Custom columns keep
1428
+ * their own title. Additive and read-only: ``name`` / ``title`` stay the
1429
+ * storage key, because callers send them back as identifiers.
1430
+ */
1431
+ label: string | null;
1425
1432
  name?: string | null;
1426
1433
  object_id?: string | null;
1427
1434
  source?: ColumnSource;
@@ -1772,6 +1772,7 @@ Other envelope fields: `pagination` (PaginationMeta).
1772
1772
  | Field | Type | Required | Description |
1773
1773
  |---|---|---|---|
1774
1774
  | `is_global` | `boolean` | yes | Automatically computed: True if object_id is None/empty, False otherwise. |
1775
+ | `label` | `string \| null` | yes | Human-readable display name (CF-09), e.g. ``CONTACT_FIRST_NAME`` -> "First name", ``COMPANY_NAICS`` -> "Company NAICS". Custom columns keep their own title. Additive and read-only: ``name`` / ``title`` stay the storage key, because callers send them back as identifiers. |
1775
1776
  | `title` | `string` | yes | |
1776
1777
  | `data_type` | `ColumnType` | no | default `"text"` |
1777
1778
  | `id` | `integer \| null` | no | |
@@ -2618,16 +2618,24 @@ export interface EnrichmentPreflightResponse {
2618
2618
  contact_count: number;
2619
2619
  /** Contact IDs that will be enriched: duplicates removed, order kept */
2620
2620
  contact_ids: Array<number>;
2621
+ /** Waterfall only: the most one contact can cost, in graph8 credits. A record is charged its dearest graph8-funded step that finds a value (steps are not added together); steps on your own key cost 0. Null when the pipeline could not be priced. */
2622
+ credits_per_record?: number | null;
2621
2623
  /** How many repeated contact IDs were dropped */
2622
2624
  duplicates_removed?: number;
2623
2625
  list_id: number;
2624
2626
  list_name?: string | null;
2627
+ /** Waterfall only: priced_records x credits_per_record, the most this run can charge. Records the pipeline skips (values already present, run conditions) cost less. Null when not priced. */
2628
+ max_total_credits?: number | null;
2625
2629
  /** Providers whose step would be skipped because the org has no key for them */
2626
2630
  missing_credentials?: Array<string>;
2627
2631
  /** Resolved mode: 'waterfall' or 'ai-research' */
2628
2632
  mode: string;
2629
2633
  /** Contact IDs that are not on the list; the run skips them and does not charge for them */
2630
2634
  not_in_list?: Array<number>;
2635
+ /** column_id of the saved waterfall pipeline the run would reuse. Null when the run would create a new pipeline (it is created on confirm) or in 'ai-research' mode. Pass it to POST /enrichment/waterfall/validate-credits for the record-exact quote. */
2636
+ pipeline_column_id?: string | null;
2637
+ /** Waterfall only: contacts the price covers (unique contacts that are on the list). */
2638
+ priced_records?: number | null;
2631
2639
  /** Providers that would run, in order (empty = the saved pipeline) */
2632
2640
  providers?: Array<string>;
2633
2641
  providers_detail?: Array<ProviderStepDetail>;
@@ -3312,10 +3312,14 @@ Other envelope fields: `pagination` (PaginationMeta).
3312
3312
  | `contact_ids` | `Array<integer>` | yes | Contact IDs that will be enriched: duplicates removed, order kept |
3313
3313
  | `list_id` | `integer` | yes | |
3314
3314
  | `mode` | `string` | yes | Resolved mode: 'waterfall' or 'ai-research' |
3315
+ | `credits_per_record` | `integer \| null` | no | Waterfall only: the most one contact can cost, in graph8 credits. A record is charged its dearest graph8-funded step that finds a value (steps are not added together); steps on your own key cost 0. Null when the pipeline could not be priced. |
3315
3316
  | `duplicates_removed` | `integer` | no | How many repeated contact IDs were dropped default `0` |
3316
3317
  | `list_name` | `string \| null` | no | |
3318
+ | `max_total_credits` | `integer \| null` | no | Waterfall only: priced_records x credits_per_record, the most this run can charge. Records the pipeline skips (values already present, run conditions) cost less. Null when not priced. |
3317
3319
  | `missing_credentials` | `Array<string>` | no | Providers whose step would be skipped because the org has no key for them |
3318
3320
  | `not_in_list` | `Array<integer>` | no | Contact IDs that are not on the list; the run skips them and does not charge for them |
3321
+ | `pipeline_column_id` | `string \| null` | no | column_id of the saved waterfall pipeline the run would reuse. Null when the run would create a new pipeline (it is created on confirm) or in 'ai-research' mode. Pass it to POST /enrichment/waterfall/validate-credits for the record-exact quote. |
3322
+ | `priced_records` | `integer \| null` | no | Waterfall only: contacts the price covers (unique contacts that are on the list). |
3319
3323
  | `providers` | `Array<string>` | no | Providers that would run, in order (empty = the saved pipeline) |
3320
3324
  | `providers_detail` | `Array<ProviderStepDetail>` | no | |
3321
3325
  | `target_field` | `string \| null` | no | Canonical column for target_field, when given |
@@ -469,6 +469,8 @@ export interface ListsOperations {
469
469
  page?: number;
470
470
  /** Items per page (max 200) */
471
471
  limit?: number;
472
+ /** Case-insensitive substring match on the list title. Omit for every list. */
473
+ search?: string | null;
472
474
  };
473
475
  headers?: {
474
476
  "X-Target-Org-Id"?: string | null;
@@ -1016,6 +1018,10 @@ export interface ListResponse {
1016
1018
  /** Source of the list */
1017
1019
  source?: string | null;
1018
1020
  status?: string | null;
1021
+ /** Human-readable explanation of status_reason. */
1022
+ status_detail?: string | null;
1023
+ /** Why the list is not usable, or null when it is fine: 'import_failed' (a file import raised; status_detail carries the reason when known), 'import_not_finished' (an uploaded list still processing with no records an hour after it was created: the import never ran) or 'build_failed' (a list built another way, e.g. from Search, failed; re-run it from its source). */
1024
+ status_reason?: string | null;
1019
1025
  tags?: Array<string>;
1020
1026
  title: string;
1021
1027
  total?: number;
package/docs/api/lists.md CHANGED
@@ -1063,7 +1063,7 @@ const result = await g8.api.lists.listListFolders();
1063
1063
  - API-key scope: `lists:read`
1064
1064
  - ★ Hand-written: [`g8.lists.list()`](../sdk-clients.md#g8-lists-list)
1065
1065
 
1066
- List all lists (audiences) in the organization.
1066
+ List all lists (audiences) in the organization, optionally filtered by title.
1067
1067
 
1068
1068
  **Input**
1069
1069
 
@@ -1071,6 +1071,7 @@ List all lists (audiences) in the organization.
1071
1071
  |---|---|---|---|
1072
1072
  | `query.page` | `integer` | no | Page number (1-indexed) default `1` |
1073
1073
  | `query.limit` | `integer` | no | Items per page (max 200) default `50` |
1074
+ | `query.search` | `string \| null` | no | Case-insensitive substring match on the list title. Omit for every list. |
1074
1075
 
1075
1076
  **Returns** `ApiResponse_list_ListResponse__`: the envelope `{ data: Array<ListResponse>, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
1076
1077
 
@@ -1090,6 +1091,8 @@ Other envelope fields: `pagination` (PaginationMeta).
1090
1091
  | `is_dynamic` | `boolean` | no | default `false` |
1091
1092
  | `source` | `string \| null` | no | Source of the list |
1092
1093
  | `status` | `string \| null` | no | |
1094
+ | `status_detail` | `string \| null` | no | Human-readable explanation of status_reason. |
1095
+ | `status_reason` | `string \| null` | no | Why the list is not usable, or null when it is fine: 'import_failed' (a file import raised; status_detail carries the reason when known), 'import_not_finished' (an uploaded list still processing with no records an hour after it was created: the import never ran) or 'build_failed' (a list built another way, e.g. from Search, failed; re-run it from its source). |
1093
1096
  | `tags` | `Array<string>` | no | |
1094
1097
  | `total` | `integer` | no | default `0` |
1095
1098
  | `type` | `string \| null` | no | List type (contacts, companies, suppressions, deals, leads) |
@@ -1504,6 +1507,8 @@ Other envelope fields: `pagination` (PaginationMeta).
1504
1507
  | `is_dynamic` | `boolean` | no | default `false` |
1505
1508
  | `source` | `string \| null` | no | Source of the list |
1506
1509
  | `status` | `string \| null` | no | |
1510
+ | `status_detail` | `string \| null` | no | Human-readable explanation of status_reason. |
1511
+ | `status_reason` | `string \| null` | no | Why the list is not usable, or null when it is fine: 'import_failed' (a file import raised; status_detail carries the reason when known), 'import_not_finished' (an uploaded list still processing with no records an hour after it was created: the import never ran) or 'build_failed' (a list built another way, e.g. from Search, failed; re-run it from its source). |
1507
1512
  | `tags` | `Array<string>` | no | |
1508
1513
  | `total` | `integer` | no | default `0` |
1509
1514
  | `type` | `string \| null` | no | List type (contacts, companies, suppressions, deals, leads) |
package/docs/api/seo.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /* Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. */
2
2
 
3
3
  /**
4
- * Types for `g8.api.seo` (SEO): 11 operations.
4
+ * Types for `g8.api.seo` (SEO): 14 operations.
5
5
  *
6
6
  * For reading. In code, import from the package instead:
7
7
  * import type { ApiInput, ApiOutput, G8Contract } from "@graph8/sdk";
@@ -18,7 +18,10 @@ export interface SeoMembers {
18
18
  getSeoDomainBacklinks: "get_seo_domain_backlinks_seo_domains__domain__backlinks_get";
19
19
  getSeoDomainOverview: "get_seo_domain_overview_seo_domains__domain__overview_get";
20
20
  getSeoRankHistory: "get_seo_rank_history_seo_rank_tracking__keyword_id__history_get";
21
+ getSeoTrackedDomain: "get_seo_tracked_domain_seo_domains_tracked__domain__get";
21
22
  listSeoAudits: "list_seo_audits_seo_audits_get";
23
+ listSeoDomainPages: "list_seo_domain_pages_seo_domains_tracked__domain__pages_get";
24
+ listSeoTrackedDomains: "list_seo_tracked_domains_seo_domains_tracked_get";
22
25
  listSeoTrackedKeywords: "list_seo_tracked_keywords_seo_rank_tracking_get";
23
26
  removeSeoTrackedKeywords: "remove_seo_tracked_keywords_seo_rank_tracking_keywords_remove_post";
24
27
  researchSeoKeywords: "research_seo_keywords_seo_keywords_research_post";
@@ -115,6 +118,23 @@ export interface SeoOperations {
115
118
  };
116
119
  output: ApiResponse_SeoRankHistory_;
117
120
  };
121
+ /**
122
+ * GET /seo/domains/tracked/{domain}
123
+ * Get Seo Tracked Domain
124
+ * tier: read · scope: intent:read
125
+ */
126
+ get_seo_tracked_domain_seo_domains_tracked__domain__get: {
127
+ input: {
128
+ path: {
129
+ /** A saved domain from `GET /seo/domains/tracked`. */
130
+ domain: string;
131
+ };
132
+ headers?: {
133
+ "X-Target-Org-Id"?: string | null;
134
+ };
135
+ };
136
+ output: ApiResponse_SeoTrackedDomainDetail_;
137
+ };
118
138
  /**
119
139
  * GET /seo/audits
120
140
  * List Seo Audits
@@ -131,6 +151,47 @@ export interface SeoOperations {
131
151
  };
132
152
  output: ApiResponse_List_SeoAudit__;
133
153
  };
154
+ /**
155
+ * GET /seo/domains/tracked/{domain}/pages
156
+ * List Seo Domain Pages
157
+ * tier: read · scope: intent:read
158
+ */
159
+ list_seo_domain_pages_seo_domains_tracked__domain__pages_get: {
160
+ input: {
161
+ path: {
162
+ /** A saved domain from `GET /seo/domains/tracked`. */
163
+ domain: string;
164
+ };
165
+ query?: {
166
+ /** Rows to skip (the saved pages are capped at 1,000). */
167
+ offset?: number;
168
+ /** Rows to return. */
169
+ limit?: number;
170
+ /** Sort column: estimated_traffic, ranking_keywords_count, best_position, url, traffic_change_30d or audit_issues. */
171
+ sort?: string;
172
+ order?: "asc" | "desc";
173
+ /** Only pages whose URL contains this text. */
174
+ q?: string | null;
175
+ };
176
+ headers?: {
177
+ "X-Target-Org-Id"?: string | null;
178
+ };
179
+ };
180
+ output: ApiResponse_SeoDomainPages_;
181
+ };
182
+ /**
183
+ * GET /seo/domains/tracked
184
+ * List Seo Tracked Domains
185
+ * tier: read · scope: intent:read
186
+ */
187
+ list_seo_tracked_domains_seo_domains_tracked_get: {
188
+ input: {
189
+ headers?: {
190
+ "X-Target-Org-Id"?: string | null;
191
+ };
192
+ };
193
+ output: ApiResponse_SeoTrackedDomains_;
194
+ };
134
195
  /**
135
196
  * GET /seo/rank-tracking
136
197
  * List Seo Tracked Keywords
@@ -206,7 +267,7 @@ export interface SeoOperations {
206
267
  };
207
268
  }
208
269
 
209
- // 27 schemas referenced above (the same as G8Contract.<Name>).
270
+ // 37 schemas referenced above (the same as G8Contract.<Name>).
210
271
 
211
272
  export interface ApiResponse_List_SeoAudit__ {
212
273
  data: Array<SeoAudit>;
@@ -238,6 +299,11 @@ export interface ApiResponse_SeoDomainOverviewResponse_ {
238
299
  pagination?: PaginationMeta | null;
239
300
  }
240
301
 
302
+ export interface ApiResponse_SeoDomainPages_ {
303
+ data: SeoDomainPages;
304
+ pagination?: PaginationMeta | null;
305
+ }
306
+
241
307
  export interface ApiResponse_SeoRankHistory_ {
242
308
  data: SeoRankHistory;
243
309
  pagination?: PaginationMeta | null;
@@ -253,6 +319,16 @@ export interface ApiResponse_SeoResearchKeywordsResponse_ {
253
319
  pagination?: PaginationMeta | null;
254
320
  }
255
321
 
322
+ export interface ApiResponse_SeoTrackedDomainDetail_ {
323
+ data: SeoTrackedDomainDetail;
324
+ pagination?: PaginationMeta | null;
325
+ }
326
+
327
+ export interface ApiResponse_SeoTrackedDomains_ {
328
+ data: SeoTrackedDomains;
329
+ pagination?: PaginationMeta | null;
330
+ }
331
+
256
332
  export interface PaginationMeta {
257
333
  /** Whether there are more pages */
258
334
  has_next: boolean;
@@ -335,6 +411,16 @@ export interface SeoBacklinksOverview {
335
411
  total_backlinks?: number | null;
336
412
  }
337
413
 
414
+ /**
415
+ * Mirrors `DomainChangeDTO`: the current snapshot against the one nearest
416
+ * 30 days back. `traffic_pct` is null when the baseline traffic was zero.
417
+ */
418
+ export interface SeoDomainChange {
419
+ keywords_delta?: number | null;
420
+ since?: string | null;
421
+ traffic_pct?: number | null;
422
+ }
423
+
338
424
  /**
339
425
  * Mirrors `DomainOverviewResponse`. `data_freshness` labels how old the
340
426
  * provider's view of the domain is - research surfaces must say.
@@ -346,6 +432,29 @@ export interface SeoDomainOverviewResponse {
346
432
  top_pages: Array<Record<string, unknown>>;
347
433
  }
348
434
 
435
+ /** Mirrors `DomainPageDTO`. */
436
+ export interface SeoDomainPage {
437
+ audit_issues?: number | null;
438
+ best_position?: number | null;
439
+ estimated_traffic: number;
440
+ ranking_keywords_count: number;
441
+ top_keyword?: string | null;
442
+ traffic_change_30d?: number | null;
443
+ url: string;
444
+ }
445
+
446
+ /**
447
+ * Mirrors `DomainPagesResponse`. `refreshed_at` is null when the pages
448
+ * were never fetched; `total` counts every saved page, `rows` is one page.
449
+ */
450
+ export interface SeoDomainPages {
451
+ audit_completed_at?: string | null;
452
+ cap: number;
453
+ refreshed_at?: string | null;
454
+ rows: Array<SeoDomainPage>;
455
+ total: number;
456
+ }
457
+
349
458
  /** Mirrors `KeywordRow`. */
350
459
  export interface SeoKeywordRow {
351
460
  competition?: number;
@@ -437,6 +546,64 @@ export interface SeoTrackKeywordItem {
437
546
  search_volume?: number | null;
438
547
  }
439
548
 
549
+ /**
550
+ * Mirrors `TrackedDomainDTO`. `kind` is `own` for the organisation's own
551
+ * sites and `competitor` for the Radar competitors shown beside them.
552
+ */
553
+ export interface SeoTrackedDomain {
554
+ change_30d?: SeoDomainChange | null;
555
+ domain: string;
556
+ is_primary?: boolean;
557
+ kind: "own" | "competitor";
558
+ metrics?: SeoTrackedDomainMetrics | null;
559
+ name?: string | null;
560
+ snapshot_at?: string | null;
561
+ }
562
+
563
+ /**
564
+ * Mirrors `TrackedDomainDetailResponse`: one domain's saved snapshot,
565
+ * rendered without any paid call. Empty until the first refresh in the app.
566
+ */
567
+ export interface SeoTrackedDomainDetail {
568
+ backlinks?: SeoBacklinksOverview | null;
569
+ change_30d?: SeoDomainChange | null;
570
+ data_freshness?: string;
571
+ domain: string;
572
+ is_primary?: boolean;
573
+ kind: "own" | "competitor";
574
+ metrics?: SeoTrackedDomainMetrics | null;
575
+ name?: string | null;
576
+ overview?: Record<string, unknown> | null;
577
+ refreshed?: boolean;
578
+ snapshot_at?: string | null;
579
+ top_keywords?: Array<Record<string, unknown>>;
580
+ top_pages?: Array<Record<string, unknown>>;
581
+ }
582
+
583
+ /** Mirrors `TrackedDomainMetricsDTO`. */
584
+ export interface SeoTrackedDomainMetrics {
585
+ authority_score?: number | null;
586
+ estimated_traffic?: number | null;
587
+ organic_keywords?: number | null;
588
+ referring_domains?: number | null;
589
+ top3_positions?: number | null;
590
+ }
591
+
592
+ /**
593
+ * Mirrors `TrackedDomainsResponse`: the saved domains (own first, primary
594
+ * first, then competitors) plus the credit price of each paid refresh, so a
595
+ * caller can quote the cost before anyone asks for one.
596
+ */
597
+ export interface SeoTrackedDomains {
598
+ domains: Array<SeoTrackedDomain>;
599
+ max_own_domains: number;
600
+ page_keywords_credits: number;
601
+ page_keywords_limit: number;
602
+ pages_cap: number;
603
+ pages_max_credits: number;
604
+ refresh_credits: number;
605
+ }
606
+
440
607
  /** Mirrors `TrackedKeywordDTO`. */
441
608
  export interface SeoTrackedKeyword {
442
609
  cadence: string;