@apostra/sdk 0.40.0 → 0.41.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/cli-login.js CHANGED
@@ -65,27 +65,39 @@ function parseEntry(value) {
65
65
  if (!isRecord(value))
66
66
  return undefined;
67
67
  const text = ['issuer', 'resource', 'clientId', 'accessToken', 'refreshToken'];
68
+ const expiresAt = typeof value.expiresAt === 'string' &&
69
+ !Number.isNaN(Date.parse(value.expiresAt))
70
+ ? new Date(value.expiresAt).toISOString()
71
+ : undefined;
68
72
  if (!text.every((k) => typeof value[k] === 'string' && value[k]) ||
69
- typeof value.expiresAt !== 'string' ||
70
- Number.isNaN(Date.parse(value.expiresAt)) ||
73
+ !expiresAt ||
71
74
  typeof value.accountId !== 'string' ||
72
75
  !Array.isArray(value.scopes) ||
73
76
  !value.scopes.every((s) => typeof s === 'string'))
74
77
  return undefined;
75
- return value;
78
+ // Credential stores round-trip text. Canonicalise at their boundary so a
79
+ // value with sub-millisecond precision cannot oscillate between clients.
80
+ return { ...value, expiresAt };
76
81
  }
77
- function readFileLogins() {
82
+ function readFileStore() {
78
83
  const { fs } = node();
79
84
  try {
80
85
  const file = JSON.parse(fs.readFileSync(credentialsPath(), 'utf8'));
81
- return isRecord(file) && isRecord(file.logins) ? file.logins : {};
86
+ if (!isRecord(file) || !isRecord(file.logins))
87
+ return { logins: {}, authoritative: new Set() };
88
+ return {
89
+ logins: file.logins,
90
+ authoritative: new Set(Array.isArray(file.authoritativeFileLogins)
91
+ ? file.authoritativeFileLogins.filter((resource) => typeof resource === 'string')
92
+ : []),
93
+ };
82
94
  }
83
95
  catch {
84
- return {};
96
+ return { logins: {}, authoritative: new Set() };
85
97
  }
86
98
  }
87
99
  /** Atomic (temp file + rename), directory 0700, file 0600. */
88
- function writeFileLogins(logins) {
100
+ function writeFileLogins(logins, authoritative = new Set()) {
89
101
  const { fs, path } = node();
90
102
  const file = credentialsPath();
91
103
  const dir = path.dirname(file);
@@ -98,7 +110,17 @@ function writeFileLogins(logins) {
98
110
  const temp = `${file}.${proc().pid}.${Math.random().toString(36).slice(2)}.tmp`;
99
111
  const fd = fs.openSync(temp, 'wx', 0o600);
100
112
  try {
101
- fs.writeSync(fd, `${JSON.stringify({ version: 1, logins }, null, 2)}\n`);
113
+ fs.writeSync(fd, `${JSON.stringify({
114
+ version: 1,
115
+ logins,
116
+ ...(authoritative.size > 0
117
+ ? {
118
+ authoritativeFileLogins: [...authoritative]
119
+ .filter((resource) => resource in logins)
120
+ .sort(),
121
+ }
122
+ : {}),
123
+ }, null, 2)}\n`);
102
124
  }
103
125
  finally {
104
126
  fs.closeSync(fd);
@@ -176,7 +198,8 @@ function warnFileFallback() {
176
198
  */
177
199
  function migrateFileLogins(lockHeld = false) {
178
200
  const { fs, path } = node();
179
- const fileLogins = readFileLogins();
201
+ const fileStore = readFileStore();
202
+ const fileLogins = fileStore.logins;
180
203
  const entries = Object.entries(fileLogins).flatMap(([resource, value]) => {
181
204
  const entry = parseEntry(value);
182
205
  return entry ? [[resource, entry]] : [];
@@ -202,17 +225,30 @@ function migrateFileLogins(lockHeld = false) {
202
225
  }
203
226
  }
204
227
  try {
228
+ const remaining = { ...fileLogins };
229
+ const remainingAuthoritative = new Set(fileStore.authoritative);
205
230
  for (const [resource, entry] of entries) {
206
231
  // A keyring value is authoritative: preserving it avoids overwriting a
207
232
  // token another process has already refreshed during an interrupted
208
- // earlier migration.
233
+ // earlier migration, unless the protected fallback marks a replacement
234
+ // as authoritative after a failed secure-store rotation.
209
235
  const stored = readSecureLogin(resource);
210
- if (stored.entry)
236
+ if (!fileStore.authoritative.has(resource) && stored.entry) {
237
+ delete remaining[resource];
238
+ remainingAuthoritative.delete(resource);
211
239
  continue;
212
- if (!stored.available || !writeSecureLogin(resource, entry))
240
+ }
241
+ if (!stored.available || !writeSecureLogin(resource, entry)) {
242
+ // Retain only entries that still need migration. Otherwise a
243
+ // successfully migrated authoritative login could shadow its next
244
+ // secure-store refresh while another login remains in the file.
245
+ writeFileLogins(remaining, remainingAuthoritative);
213
246
  return false;
247
+ }
248
+ delete remaining[resource];
249
+ remainingAuthoritative.delete(resource);
214
250
  }
215
- fs.rmSync(credentialsPath(), { force: true });
251
+ writeFileLogins(remaining, remainingAuthoritative);
216
252
  return true;
217
253
  }
218
254
  finally {
@@ -229,17 +265,24 @@ function migrateFileLogins(lockHeld = false) {
229
265
  }
230
266
  export function readCliLogin(baseUrl) {
231
267
  const resource = normalizeBaseUrl(baseUrl);
268
+ const fileStore = readFileStore();
269
+ const fileEntry = parseEntry(fileStore.logins[resource]);
270
+ // A refresh token can rotate before a credential store reports an update
271
+ // failure. This marker makes its 0600 fallback authoritative over the now
272
+ // invalid secure-store value until a later read can migrate it safely.
273
+ if (fileStore.authoritative.has(resource) && fileEntry)
274
+ return fileEntry;
232
275
  const secure = readSecureLogin(resource);
233
276
  if (secure.entry)
234
277
  return secure.entry;
235
- const fileLogins = readFileLogins();
278
+ const fileLogins = fileStore.logins;
236
279
  if (Object.keys(fileLogins).length === 0)
237
280
  return undefined;
238
281
  if (migrateFileLogins())
239
282
  return readSecureLogin(resource).entry;
240
283
  if (!secure.available)
241
284
  warnFileFallback();
242
- return parseEntry(fileLogins[resource]);
285
+ return fileEntry;
243
286
  }
244
287
  /** Like `readCliLogin`, but never throws: for the SDK's default credential chain. */
245
288
  export function storedCliLogin(baseUrl) {
@@ -360,13 +403,24 @@ export async function withCliLoginLock(fn) {
360
403
  /** Save a login. Call inside `withCliLoginLock`. */
361
404
  export function writeCliLogin(baseUrl, entry) {
362
405
  const resource = normalizeBaseUrl(baseUrl);
406
+ const normalised = parseEntry(entry);
407
+ if (!normalised)
408
+ throw new TypeError('Apostra login is invalid');
363
409
  // Callers hold the cross-process lock, so the legacy file cannot overwrite
364
410
  // a rotated credential while it is being migrated.
365
411
  migrateFileLogins(true);
366
- if (writeSecureLogin(resource, entry))
412
+ const existing = readSecureLogin(resource);
413
+ if (writeSecureLogin(resource, normalised))
367
414
  return;
368
415
  warnFileFallback();
369
- writeFileLogins({ ...readFileLogins(), [resource]: entry });
416
+ const fileStore = readFileStore();
417
+ // A refresh token may rotate while the OS credential store disappears. Its
418
+ // next read could reveal the older credential, so the protected fallback is
419
+ // authoritative both when we saw an old entry and when availability is
420
+ // unknown.
421
+ if (!existing.available || existing.entry)
422
+ fileStore.authoritative.add(resource);
423
+ writeFileLogins({ ...fileStore.logins, [resource]: normalised }, fileStore.authoritative);
370
424
  }
371
425
  async function send(fetcher, url, init = {}) {
372
426
  return fetcher(url, {
@@ -530,8 +584,10 @@ export async function logoutCliLogin(baseUrl, { fetch: f = globalThis.fetch } =
530
584
  // A prior fallback login can still be present even when the credential
531
585
  // store has no entry (or is available again). Remove it unconditionally:
532
586
  // otherwise its refresh token could be migrated back after logout.
533
- const { [key]: _removed, ...rest } = readFileLogins();
534
- writeFileLogins(rest);
587
+ const fileStore = readFileStore();
588
+ const { [key]: _removed, ...rest } = fileStore.logins;
589
+ fileStore.authoritative.delete(key);
590
+ writeFileLogins(rest, fileStore.authoritative);
535
591
  return { found: true, revoked };
536
592
  });
537
593
  }
@@ -49,9 +49,6 @@ export type LogEventError = Wire.LogEventErrors[keyof Wire.LogEventErrors];
49
49
  export type OpenAdvertisersPageInput = Wire.OpenAdvertisersPageData['body'];
50
50
  export type OpenAdvertisersPageResult = Wire.OpenAdvertisersPageResponses[200]['data'];
51
51
  export type OpenAdvertisersPageError = Wire.OpenAdvertisersPageErrors[keyof Wire.OpenAdvertisersPageErrors];
52
- export type OpenAgentCertificationPageInput = Wire.OpenAgentCertificationPageData['body'];
53
- export type OpenAgentCertificationPageResult = Wire.OpenAgentCertificationPageResponses[200]['data'];
54
- export type OpenAgentCertificationPageError = Wire.OpenAgentCertificationPageErrors[keyof Wire.OpenAgentCertificationPageErrors];
55
52
  export type OpenAgentPageInput = Wire.OpenAgentPageData['body'];
56
53
  export type OpenAgentPageResult = Wire.OpenAgentPageResponses[200]['data'];
57
54
  export type OpenAgentPageError = Wire.OpenAgentPageErrors[keyof Wire.OpenAgentPageErrors];
@@ -287,10 +284,6 @@ export interface OperationTypes {
287
284
  input: OpenAdvertisersPageInput;
288
285
  result: OpenAdvertisersPageResult;
289
286
  };
290
- "open_agent_certification_page": {
291
- input: OpenAgentCertificationPageInput;
292
- result: OpenAgentCertificationPageResult;
293
- };
294
287
  "open_agent_page": {
295
288
  input: OpenAgentPageInput;
296
289
  result: OpenAgentPageResult;
@@ -623,13 +616,13 @@ export declare class Apostra extends Transport {
623
616
  /** Show a seller what reporting we received for one buyer media buy, whether each receipt was accepted, and the current computed daily totals. Opens the Media Buy Timeline Glance. Returns the data together with response headers and request ID. */
624
617
  getSellerReportingReceiptsWithResponse(input: GetSellerReportingReceiptsInput, options?: RequestOptions): Promise<ResponseDetails<GetSellerReportingReceiptsResult>>;
625
618
  /**
626
- * Current account, state, blockers, exact fixes, and reachable accounts. For seller demand, use it to tell whether readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, and next call.
619
+ * Current account, state, blockers, exact fixes, accounts to pick from. For seller demand, tells if readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, next call.
627
620
  *
628
621
  * @example
629
622
  * await client.getStatus(input)
630
623
  */
631
624
  getStatus(input?: GetStatusInput, options?: RequestOptions): Promise<GetStatusResult>;
632
- /** Current account, state, blockers, exact fixes, and reachable accounts. For seller demand, use it to tell whether readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, and next call. Returns the data together with response headers and request ID. */
625
+ /** Current account, state, blockers, exact fixes, accounts to pick from. For seller demand, tells if readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, next call. Returns the data together with response headers and request ID. */
633
626
  getStatusWithResponse(input?: GetStatusInput, options?: RequestOptions): Promise<ResponseDetails<GetStatusResult>>;
634
627
  /**
635
628
  * Send up to 10,000 AdCP conversion events (log_event) to an event source the advertiser registered with save_event_source. Events must also pass the v2 rules: no raw email or phone in user_match, each event_type + event_id once per call. One invalid event refuses the whole call.
@@ -649,15 +642,6 @@ export declare class Apostra extends Transport {
649
642
  openAdvertisersPage(input: OpenAdvertisersPageInput, options?: RequestOptions): Promise<OpenAdvertisersPageResult>;
650
643
  /** Open the Advertisers Page: every advertiser with its campaign and draft counts and one next action each. Use it for "show my advertisers" or "where do I start"; the Page self-fetches. To add or set up an advertiser, pass intent: "add". For a text answer use search(kind: "advertiser"). Returns the data together with response headers and request ID. */
651
644
  openAdvertisersPageWithResponse(input: OpenAdvertisersPageInput, options?: RequestOptions): Promise<ResponseDetails<OpenAdvertisersPageResult>>;
652
- /**
653
- * Open one agent’s Test & certify Page: live certification per use case, recent test runs, AdCP 4.0 readiness and capability declarations. Read-only.
654
- *
655
- * @example
656
- * await client.openAgentCertificationPage(input)
657
- */
658
- openAgentCertificationPage(input: OpenAgentCertificationPageInput, options?: RequestOptions): Promise<OpenAgentCertificationPageResult>;
659
- /** Open one agent’s Test & certify Page: live certification per use case, recent test runs, AdCP 4.0 readiness and capability declarations. Read-only. Returns the data together with response headers and request ID. */
660
- openAgentCertificationPageWithResponse(input: OpenAgentCertificationPageInput, options?: RequestOptions): Promise<ResponseDetails<OpenAgentCertificationPageResult>>;
661
645
  /**
662
646
  * Open one agent owned by this Developer account.
663
647
  *
@@ -740,13 +724,13 @@ export declare class Apostra extends Transport {
740
724
  /** Open the buyer Creative Engines Page. Optionally focus an engine, connection, or its secure setup control; the buyer starts setup in the Page, and this does not authorize a provider or start generation. Returns the data together with response headers and request ID. */
741
725
  openCreativeEnginesPageWithResponse(input: OpenCreativeEnginesPageInput, options?: RequestOptions): Promise<ResponseDetails<OpenCreativeEnginesPageResult>>;
742
726
  /**
743
- * Open Creative Library. Use search for a plain object answer. Composer needs campaignId; assembly needs no Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format.
727
+ * Open Creative Library. Use search for a plain object answer. The composer can start from an advertiser or a campaign and does not need a Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format.
744
728
  *
745
729
  * @example
746
730
  * await client.openCreativeLibrary(input, { idempotencyKey: 'stable-key' })
747
731
  */
748
732
  openCreativeLibrary(input: OpenCreativeLibraryInput, options: WriteRequestOptions): Promise<OpenCreativeLibraryResult>;
749
- /** Open Creative Library. Use search for a plain object answer. Composer needs campaignId; assembly needs no Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format. Returns the data together with response headers and request ID. */
733
+ /** Open Creative Library. Use search for a plain object answer. The composer can start from an advertiser or a campaign and does not need a Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format. Returns the data together with response headers and request ID. */
750
734
  openCreativeLibraryWithResponse(input: OpenCreativeLibraryInput, options: WriteRequestOptions): Promise<ResponseDetails<OpenCreativeLibraryResult>>;
751
735
  /**
752
736
  * Open the Developer home for this Developer account: its agents, their stages and what to do next.
@@ -812,13 +796,13 @@ export declare class Apostra extends Transport {
812
796
  /** Show a saved Creative Session’s variants (find via search/get kind creative_session). Not for generating new variants. Returns the data together with response headers and request ID. */
813
797
  openVariantGalleryWithResponse(input: OpenVariantGalleryInput, options?: RequestOptions): Promise<ResponseDetails<OpenVariantGalleryResult>>;
814
798
  /**
815
- * Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy.
799
+ * Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy. scope accounts re-lists the source's accounts instead.
816
800
  *
817
801
  * @example
818
802
  * await client.refreshInventorySourceHealth(input, { idempotencyKey: 'stable-key' })
819
803
  */
820
804
  refreshInventorySourceHealth(input: RefreshInventorySourceHealthInput, options: WriteRequestOptions): Promise<RefreshInventorySourceHealthResult>;
821
- /** Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy. Returns the data together with response headers and request ID. */
805
+ /** Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy. scope accounts re-lists the source's accounts instead. Returns the data together with response headers and request ID. */
822
806
  refreshInventorySourceHealthWithResponse(input: RefreshInventorySourceHealthInput, options: WriteRequestOptions): Promise<ResponseDetails<RefreshInventorySourceHealthResult>>;
823
807
  /**
824
808
  * Request a Buyer child under the selected Organization. Nothing is created until an Organization administrator approves it on our site; the result is approval_required with a link to show the person. Repeat with the same idempotencyKey and name for the outcome.
@@ -911,13 +895,13 @@ export declare class Apostra extends Transport {
911
895
  /** Confirm a Sales Agent product mode, register a Sales or Creative Agent, or update an owned Agent: rename it or allow certification buys. To connect from a URL, send agentUrl with dryRun: true, show what was read, then send it without dryRun. A connected agent is not yet verified as theirs. Returns the data together with response headers and request ID. */
912
896
  saveAgentWithResponse(input: SaveAgentInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveAgentResult>>;
913
897
  /**
914
- * File or update a typed ask in the Apostra Support workflow; returns askId. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first.
898
+ * File or update a typed ask in the Apostra Support workflow; returns askId. kind create files a new ask; kind update sends only id and requester. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first.
915
899
  *
916
900
  * @example
917
901
  * await client.saveAsk(input, { idempotencyKey: 'stable-key' })
918
902
  */
919
903
  saveAsk(input: SaveAskInput, options: WriteRequestOptions): Promise<SaveAskResult>;
920
- /** File or update a typed ask in the Apostra Support workflow; returns askId. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first. Returns the data together with response headers and request ID. */
904
+ /** File or update a typed ask in the Apostra Support workflow; returns askId. kind create files a new ask; kind update sends only id and requester. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first. Returns the data together with response headers and request ID. */
921
905
  saveAskWithResponse(input: SaveAskInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveAskResult>>;
922
906
  /**
923
907
  * Sync first-party CRM audiences for a buyer advertiser. Each audiences[] item may add, remove, or delete members. Returns an operationId; use get(kind: audience, advertiserId: "...") to read match status after it settles.
@@ -992,22 +976,22 @@ export declare class Apostra extends Transport {
992
976
  /** Manage seller or creative-engine authorization, accounts and advertiser mappings. Seller-only: reporting, selection, billing, policy, activation. Returns the data together with response headers and request ID. */
993
977
  saveConnectionWithResponse(input: SaveConnectionInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveConnectionResult>>;
994
978
  /**
995
- * Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, and `removeProperties` change named items only. Read authorization; never assume it.
979
+ * Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, `removeProperties`, and `refresh` act on named items only. Read authorization; never assume it.
996
980
  *
997
981
  * @example
998
982
  * await client.saveCoverage(input, { idempotencyKey: 'stable-key' })
999
983
  */
1000
984
  saveCoverage(input: SaveCoverageInput, options: WriteRequestOptions): Promise<SaveCoverageResult>;
1001
- /** Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, and `removeProperties` change named items only. Read authorization; never assume it. Returns the data together with response headers and request ID. */
985
+ /** Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, `removeProperties`, and `refresh` act on named items only. Read authorization; never assume it. Returns the data together with response headers and request ID. */
1002
986
  saveCoverageWithResponse(input: SaveCoverageInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveCoverageResult>>;
1003
987
  /**
1004
- * advertiserId/campaignId:name,message;assets/landing_page_url/social/sourceAssetRef/sourceAssets;Supplied content/assets only;generate new media (radio spots):save_creative_session;exactly one format selector:formatKind/formatParams,creativeFormatId/formatOptionRef;libraryRole:Buyer Account only.
988
+ * Save content you supply: advertiserId/campaignId, name, message, assets (landing_page_url, social, sourceAssetRef/sourceAssets). New media like radio spots: use save_creative_session. One format selector: formatKind+formatParams or creativeFormatId+formatOptionRef. libraryRole: Buyer Account only.
1005
989
  *
1006
990
  * @example
1007
991
  * await client.saveCreative(input, { idempotencyKey: 'stable-key' })
1008
992
  */
1009
993
  saveCreative(input: SaveCreativeInput, options: WriteRequestOptions): Promise<SaveCreativeResult>;
1010
- /** advertiserId/campaignId:name,message;assets/landing_page_url/social/sourceAssetRef/sourceAssets;Supplied content/assets only;generate new media (radio spots):save_creative_session;exactly one format selector:formatKind/formatParams,creativeFormatId/formatOptionRef;libraryRole:Buyer Account only. Returns the data together with response headers and request ID. */
994
+ /** Save content you supply: advertiserId/campaignId, name, message, assets (landing_page_url, social, sourceAssetRef/sourceAssets). New media like radio spots: use save_creative_session. One format selector: formatKind+formatParams or creativeFormatId+formatOptionRef. libraryRole: Buyer Account only. Returns the data together with response headers and request ID. */
1011
995
  saveCreativeWithResponse(input: SaveCreativeInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveCreativeResult>>;
1012
996
  /**
1013
997
  * Manage collections. Create with one owner and name: campaignId or advertiserId. Only advertiser mutations of an existing collection need expectedUpdatedAt; campaign writes and creates do not. isArchived archives or restores advertiser collections.
@@ -1055,13 +1039,13 @@ export declare class Apostra extends Transport {
1055
1039
  /** Create, change, archive, or restore up to 50 advertiser conversion event sources (pixels, server feeds). Each entry is keyed by eventSourceId and succeeds or fails alone. Setup is not proof events flow: check health with get, then use eventSourceId in an optimization goal. Returns the data together with response headers and request ID. */
1056
1040
  saveEventSourceWithResponse(input: SaveEventSourceInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveEventSourceResult>>;
1057
1041
  /**
1058
- * Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Pass only `agentId` or `adServer` to open the form that connects an agent or an ad server. Credentials are never passed here; a source that needs one returns the page that collects it.
1042
+ * Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Add a sales agent with only `agentId`, never its address, or an ad server with only `adServer`; each opens a form. Credentials are never passed here; a source that needs one returns its form.
1059
1043
  *
1060
1044
  * @example
1061
1045
  * await client.saveInventorySource(input, { idempotencyKey: 'stable-key' })
1062
1046
  */
1063
1047
  saveInventorySource(input: SaveInventorySourceInput, options: WriteRequestOptions): Promise<SaveInventorySourceResult>;
1064
- /** Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Pass only `agentId` or `adServer` to open the form that connects an agent or an ad server. Credentials are never passed here; a source that needs one returns the page that collects it. Returns the data together with response headers and request ID. */
1048
+ /** Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Add a sales agent with only `agentId`, never its address, or an ad server with only `adServer`; each opens a form. Credentials are never passed here; a source that needs one returns its form. Returns the data together with response headers and request ID. */
1065
1049
  saveInventorySourceWithResponse(input: SaveInventorySourceInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveInventorySourceResult>>;
1066
1050
  /**
1067
1051
  * Manage seller lessons in a seller account; send the accountId of that account. propose requires lesson; approve and retire require lessonId; preview requires lessonId and brief. Preserve seller words from a private Session note and ask if kind or scope is unclear.
@@ -1091,13 +1075,13 @@ export declare class Apostra extends Transport {
1091
1075
  /** Create or update seller Materials. Seller beta: preview, delete, Undo deletion, or Include again for one imported Library document. Delete archives it, excludes its source until Include again, and purges it after 30 days. https://docs.apostra.com/v3/delete-from-apostra Returns the data together with response headers and request ID. */
1092
1076
  saveMaterialWithResponse(input: SaveMaterialInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveMaterialResult>>;
1093
1077
  /**
1094
- * Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit buy/product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates.
1078
+ * Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates.
1095
1079
  *
1096
1080
  * @example
1097
1081
  * await client.saveMediaBuy(input, { idempotencyKey: 'stable-key' })
1098
1082
  */
1099
1083
  saveMediaBuy(input: SaveMediaBuyInput, options: WriteRequestOptions): Promise<SaveMediaBuyResult>;
1100
- /** Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit buy/product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates. Returns the data together with response headers and request ID. */
1084
+ /** Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates. Returns the data together with response headers and request ID. */
1101
1085
  saveMediaBuyWithResponse(input: SaveMediaBuyInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveMediaBuyResult>>;
1102
1086
  /**
1103
1087
  * Deprecated compatibility tool ("listing" is the modern term). It writes only the legacy businessProfile and does not update the canonical buyer-visible listing. New clients must read with `get({ kind: "seller", include: ["listing"] })` and write with `save_seller`.
@@ -1154,13 +1138,13 @@ export declare class Apostra extends Transport {
1154
1138
  /** Change one RFP turn: release it, request or cancel a proposal file, append feedback, or record its outcome. One of these per call; revise, endorse and attach a response with save_rfp. Returns the data together with response headers and request ID. */
1155
1139
  saveRfpTurnWithResponse(input: SaveRfpTurnInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveRfpTurnResult>>;
1156
1140
  /**
1157
- * Save Seller identity, capabilities, Apostra listing, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, or the intake hold. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get(kind:"distribution").
1141
+ * Save Seller identity, capabilities, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, the intake hold, or the demo's expiry and sample sources. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get.
1158
1142
  *
1159
1143
  * @example
1160
1144
  * await client.saveSeller(input, { idempotencyKey: 'stable-key' })
1161
1145
  */
1162
1146
  saveSeller(input: SaveSellerInput, options: WriteRequestOptions): Promise<SaveSellerResult>;
1163
- /** Save Seller identity, capabilities, Apostra listing, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, or the intake hold. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get(kind:"distribution"). Returns the data together with response headers and request ID. */
1147
+ /** Save Seller identity, capabilities, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, the intake hold, or the demo's expiry and sample sources. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get. Returns the data together with response headers and request ID. */
1164
1148
  saveSellerWithResponse(input: SaveSellerInput, options: WriteRequestOptions): Promise<ResponseDetails<SaveSellerResult>>;
1165
1149
  /**
1166
1150
  * Create, replace, or archive a signal. Managed writes need a complete draft; read before updates. Without sourceId, writes the seller catalog.
@@ -82,13 +82,13 @@ export class Apostra extends Transport {
82
82
  /** Show a seller what reporting we received for one buyer media buy, whether each receipt was accepted, and the current computed daily totals. Opens the Media Buy Timeline Glance. Returns the data together with response headers and request ID. */
83
83
  getSellerReportingReceiptsWithResponse(input, options) { return this.requestDetailed("get_seller_reporting_receipts", input, options); }
84
84
  /**
85
- * Current account, state, blockers, exact fixes, and reachable accounts. For seller demand, use it to tell whether readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, and next call.
85
+ * Current account, state, blockers, exact fixes, accounts to pick from. For seller demand, tells if readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, next call.
86
86
  *
87
87
  * @example
88
88
  * await client.getStatus(input)
89
89
  */
90
90
  getStatus(input = {}, options) { return this.request("get_status", input, options); }
91
- /** Current account, state, blockers, exact fixes, and reachable accounts. For seller demand, use it to tell whether readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, and next call. Returns the data together with response headers and request ID. */
91
+ /** Current account, state, blockers, exact fixes, accounts to pick from. For seller demand, tells if readiness stops requests before source calls; read before diagnosing source health, empty responses, or demand. A Developer account adds each agent's stage, blocker, next call. Returns the data together with response headers and request ID. */
92
92
  getStatusWithResponse(input = {}, options) { return this.requestDetailed("get_status", input, options); }
93
93
  /**
94
94
  * Send up to 10,000 AdCP conversion events (log_event) to an event source the advertiser registered with save_event_source. Events must also pass the v2 rules: no raw email or phone in user_match, each event_type + event_id once per call. One invalid event refuses the whole call.
@@ -108,15 +108,6 @@ export class Apostra extends Transport {
108
108
  openAdvertisersPage(input, options) { return this.request("open_advertisers_page", input, options); }
109
109
  /** Open the Advertisers Page: every advertiser with its campaign and draft counts and one next action each. Use it for "show my advertisers" or "where do I start"; the Page self-fetches. To add or set up an advertiser, pass intent: "add". For a text answer use search(kind: "advertiser"). Returns the data together with response headers and request ID. */
110
110
  openAdvertisersPageWithResponse(input, options) { return this.requestDetailed("open_advertisers_page", input, options); }
111
- /**
112
- * Open one agent’s Test & certify Page: live certification per use case, recent test runs, AdCP 4.0 readiness and capability declarations. Read-only.
113
- *
114
- * @example
115
- * await client.openAgentCertificationPage(input)
116
- */
117
- openAgentCertificationPage(input, options) { return this.request("open_agent_certification_page", input, options); }
118
- /** Open one agent’s Test & certify Page: live certification per use case, recent test runs, AdCP 4.0 readiness and capability declarations. Read-only. Returns the data together with response headers and request ID. */
119
- openAgentCertificationPageWithResponse(input, options) { return this.requestDetailed("open_agent_certification_page", input, options); }
120
111
  /**
121
112
  * Open one agent owned by this Developer account.
122
113
  *
@@ -199,13 +190,13 @@ export class Apostra extends Transport {
199
190
  /** Open the buyer Creative Engines Page. Optionally focus an engine, connection, or its secure setup control; the buyer starts setup in the Page, and this does not authorize a provider or start generation. Returns the data together with response headers and request ID. */
200
191
  openCreativeEnginesPageWithResponse(input, options) { return this.requestDetailed("open_creative_engines_page", input, options); }
201
192
  /**
202
- * Open Creative Library. Use search for a plain object answer. Composer needs campaignId; assembly needs no Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format.
193
+ * Open Creative Library. Use search for a plain object answer. The composer can start from an advertiser or a campaign and does not need a Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format.
203
194
  *
204
195
  * @example
205
196
  * await client.openCreativeLibrary(input, { idempotencyKey: 'stable-key' })
206
197
  */
207
198
  openCreativeLibrary(input, options) { return this.request("open_creative_library", input, options); }
208
- /** Open Creative Library. Use search for a plain object answer. Composer needs campaignId; assembly needs no Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format. Returns the data together with response headers and request ID. */
199
+ /** Open Creative Library. Use search for a plain object answer. The composer can start from an advertiser or a campaign and does not need a Creative Engine. To save a draft, use exactly one format: a canonical format such as image, hosted video, or hosted audio, or a seller format. Returns the data together with response headers and request ID. */
209
200
  openCreativeLibraryWithResponse(input, options) { return this.requestDetailed("open_creative_library", input, options); }
210
201
  /**
211
202
  * Open the Developer home for this Developer account: its agents, their stages and what to do next.
@@ -271,13 +262,13 @@ export class Apostra extends Transport {
271
262
  /** Show a saved Creative Session’s variants (find via search/get kind creative_session). Not for generating new variants. Returns the data together with response headers and request ID. */
272
263
  openVariantGalleryWithResponse(input, options) { return this.requestDetailed("open_variant_gallery", input, options); }
273
264
  /**
274
- * Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy.
265
+ * Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy. scope accounts re-lists the source's accounts instead.
275
266
  *
276
267
  * @example
277
268
  * await client.refreshInventorySourceHealth(input, { idempotencyKey: 'stable-key' })
278
269
  */
279
270
  refreshInventorySourceHealth(input, options) { return this.request("refresh_inventory_source_health", input, options); }
280
- /** Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy. Returns the data together with response headers and request ID. */
271
+ /** Rechecks one external sales-agent source with no-spend get_products and, if it publishes one, a catalog refresh. Returns each check, findings still open, evidence IDs and readiness; no source configuration or media buy. scope accounts re-lists the source's accounts instead. Returns the data together with response headers and request ID. */
281
272
  refreshInventorySourceHealthWithResponse(input, options) { return this.requestDetailed("refresh_inventory_source_health", input, options); }
282
273
  /**
283
274
  * Request a Buyer child under the selected Organization. Nothing is created until an Organization administrator approves it on our site; the result is approval_required with a link to show the person. Repeat with the same idempotencyKey and name for the outcome.
@@ -370,13 +361,13 @@ export class Apostra extends Transport {
370
361
  /** Confirm a Sales Agent product mode, register a Sales or Creative Agent, or update an owned Agent: rename it or allow certification buys. To connect from a URL, send agentUrl with dryRun: true, show what was read, then send it without dryRun. A connected agent is not yet verified as theirs. Returns the data together with response headers and request ID. */
371
362
  saveAgentWithResponse(input, options) { return this.requestDetailed("save_agent", input, options); }
372
363
  /**
373
- * File or update a typed ask in the Apostra Support workflow; returns askId. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first.
364
+ * File or update a typed ask in the Apostra Support workflow; returns askId. kind create files a new ask; kind update sends only id and requester. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first.
374
365
  *
375
366
  * @example
376
367
  * await client.saveAsk(input, { idempotencyKey: 'stable-key' })
377
368
  */
378
369
  saveAsk(input, options) { return this.request("save_ask", input, options); }
379
- /** File or update a typed ask in the Apostra Support workflow; returns askId. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first. Returns the data together with response headers and request ID. */
370
+ /** File or update a typed ask in the Apostra Support workflow; returns askId. kind create files a new ask; kind update sends only id and requester. Supply is buyer inventory. Call immediately with type support when a person explicitly asks for a human; do not diagnose first. Returns the data together with response headers and request ID. */
380
371
  saveAskWithResponse(input, options) { return this.requestDetailed("save_ask", input, options); }
381
372
  /**
382
373
  * Sync first-party CRM audiences for a buyer advertiser. Each audiences[] item may add, remove, or delete members. Returns an operationId; use get(kind: audience, advertiserId: "...") to read match status after it settles.
@@ -451,22 +442,22 @@ export class Apostra extends Transport {
451
442
  /** Manage seller or creative-engine authorization, accounts and advertiser mappings. Seller-only: reporting, selection, billing, policy, activation. Returns the data together with response headers and request ID. */
452
443
  saveConnectionWithResponse(input, options) { return this.requestDetailed("save_connection", input, options); }
453
444
  /**
454
- * Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, and `removeProperties` change named items only. Read authorization; never assume it.
445
+ * Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, `removeProperties`, and `refresh` act on named items only. Read authorization; never assume it.
455
446
  *
456
447
  * @example
457
448
  * await client.saveCoverage(input, { idempotencyKey: 'stable-key' })
458
449
  */
459
450
  saveCoverage(input, options) { return this.request("save_coverage", input, options); }
460
- /** Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, and `removeProperties` change named items only. Read authorization; never assume it. Returns the data together with response headers and request ID. */
451
+ /** Declare publisher domains this Seller sells and its claimed properties. `domains` replaces the complete set; `add`, `remove`, `declareProperties`, `removeProperties`, and `refresh` act on named items only. Read authorization; never assume it. Returns the data together with response headers and request ID. */
461
452
  saveCoverageWithResponse(input, options) { return this.requestDetailed("save_coverage", input, options); }
462
453
  /**
463
- * advertiserId/campaignId:name,message;assets/landing_page_url/social/sourceAssetRef/sourceAssets;Supplied content/assets only;generate new media (radio spots):save_creative_session;exactly one format selector:formatKind/formatParams,creativeFormatId/formatOptionRef;libraryRole:Buyer Account only.
454
+ * Save content you supply: advertiserId/campaignId, name, message, assets (landing_page_url, social, sourceAssetRef/sourceAssets). New media like radio spots: use save_creative_session. One format selector: formatKind+formatParams or creativeFormatId+formatOptionRef. libraryRole: Buyer Account only.
464
455
  *
465
456
  * @example
466
457
  * await client.saveCreative(input, { idempotencyKey: 'stable-key' })
467
458
  */
468
459
  saveCreative(input, options) { return this.request("save_creative", input, options); }
469
- /** advertiserId/campaignId:name,message;assets/landing_page_url/social/sourceAssetRef/sourceAssets;Supplied content/assets only;generate new media (radio spots):save_creative_session;exactly one format selector:formatKind/formatParams,creativeFormatId/formatOptionRef;libraryRole:Buyer Account only. Returns the data together with response headers and request ID. */
460
+ /** Save content you supply: advertiserId/campaignId, name, message, assets (landing_page_url, social, sourceAssetRef/sourceAssets). New media like radio spots: use save_creative_session. One format selector: formatKind+formatParams or creativeFormatId+formatOptionRef. libraryRole: Buyer Account only. Returns the data together with response headers and request ID. */
470
461
  saveCreativeWithResponse(input, options) { return this.requestDetailed("save_creative", input, options); }
471
462
  /**
472
463
  * Manage collections. Create with one owner and name: campaignId or advertiserId. Only advertiser mutations of an existing collection need expectedUpdatedAt; campaign writes and creates do not. isArchived archives or restores advertiser collections.
@@ -514,13 +505,13 @@ export class Apostra extends Transport {
514
505
  /** Create, change, archive, or restore up to 50 advertiser conversion event sources (pixels, server feeds). Each entry is keyed by eventSourceId and succeeds or fails alone. Setup is not proof events flow: check health with get, then use eventSourceId in an optimization goal. Returns the data together with response headers and request ID. */
515
506
  saveEventSourceWithResponse(input, options) { return this.requestDetailed("save_event_source", input, options); }
516
507
  /**
517
- * Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Pass only `agentId` or `adServer` to open the form that connects an agent or an ad server. Credentials are never passed here; a source that needs one returns the page that collects it.
508
+ * Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Add a sales agent with only `agentId`, never its address, or an ad server with only `adServer`; each opens a form. Credentials are never passed here; a source that needs one returns its form.
518
509
  *
519
510
  * @example
520
511
  * await client.saveInventorySource(input, { idempotencyKey: 'stable-key' })
521
512
  */
522
513
  saveInventorySource(input, options) { return this.request("save_inventory_source", input, options); }
523
- /** Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Pass only `agentId` or `adServer` to open the form that connects an agent or an ad server. Credentials are never passed here; a source that needs one returns the page that collects it. Returns the data together with response headers and request ID. */
514
+ /** Create or update where a seller's inventory comes from. Pass `id` to change a source or omit it to add one. Add a sales agent with only `agentId`, never its address, or an ad server with only `adServer`; each opens a form. Credentials are never passed here; a source that needs one returns its form. Returns the data together with response headers and request ID. */
524
515
  saveInventorySourceWithResponse(input, options) { return this.requestDetailed("save_inventory_source", input, options); }
525
516
  /**
526
517
  * Manage seller lessons in a seller account; send the accountId of that account. propose requires lesson; approve and retire require lessonId; preview requires lessonId and brief. Preserve seller words from a private Session note and ask if kind or scope is unclear.
@@ -550,13 +541,13 @@ export class Apostra extends Transport {
550
541
  /** Create or update seller Materials. Seller beta: preview, delete, Undo deletion, or Include again for one imported Library document. Delete archives it, excludes its source until Include again, and purges it after 30 days. https://docs.apostra.com/v3/delete-from-apostra Returns the data together with response headers and request ID. */
551
542
  saveMaterialWithResponse(input, options) { return this.requestDetailed("save_material", input, options); }
552
543
  /**
553
- * Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit buy/product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates.
544
+ * Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates.
554
545
  *
555
546
  * @example
556
547
  * await client.saveMediaBuy(input, { idempotencyKey: 'stable-key' })
557
548
  */
558
549
  saveMediaBuy(input, options) { return this.request("save_media_buy", input, options); }
559
- /** Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit buy/product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates. Returns the data together with response headers and request ID. */
550
+ /** Create DRAFT buy; no spend until confirmed. Meta: shared campaign=seller_optimized; ad sets=fixed; ask if unclear. Shared: omit product budgets. Pause/resume: mediaBuyId + isPaused. Proposal: flight + total budget; omit products. channelGroupId: required if grouped; invalid ungrouped/updates. Returns the data together with response headers and request ID. */
560
551
  saveMediaBuyWithResponse(input, options) { return this.requestDetailed("save_media_buy", input, options); }
561
552
  /**
562
553
  * Deprecated compatibility tool ("listing" is the modern term). It writes only the legacy businessProfile and does not update the canonical buyer-visible listing. New clients must read with `get({ kind: "seller", include: ["listing"] })` and write with `save_seller`.
@@ -613,13 +604,13 @@ export class Apostra extends Transport {
613
604
  /** Change one RFP turn: release it, request or cancel a proposal file, append feedback, or record its outcome. One of these per call; revise, endorse and attach a response with save_rfp. Returns the data together with response headers and request ID. */
614
605
  saveRfpTurnWithResponse(input, options) { return this.requestDetailed("save_rfp_turn", input, options); }
615
606
  /**
616
- * Save Seller identity, capabilities, Apostra listing, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, or the intake hold. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get(kind:"distribution").
607
+ * Save Seller identity, capabilities, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, the intake hold, or the demo's expiry and sample sources. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get.
617
608
  *
618
609
  * @example
619
610
  * await client.saveSeller(input, { idempotencyKey: 'stable-key' })
620
611
  */
621
612
  saveSeller(input, options) { return this.request("save_seller", input, options); }
622
- /** Save Seller identity, capabilities, Apostra listing, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, or the intake hold. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get(kind:"distribution"). Returns the data together with response headers and request ID. */
613
+ /** Save Seller identity, capabilities, buyer-visible listing (mediaKit is a deprecated alias), Distribution's OpenAI challenge token, an admission, the intake hold, or the demo's expiry and sample sources. Scope3 eligibility and Market Maker entitlements are read-only here. Read Distribution with get. Returns the data together with response headers and request ID. */
623
614
  saveSellerWithResponse(input, options) { return this.requestDetailed("save_seller", input, options); }
624
615
  /**
625
616
  * Create, replace, or archive a signal. Managed writes need a complete draft; read before updates. Without sourceId, writes the seller catalog.