@zinn-digital/sdk 0.1.1382 → 0.1.1384

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.
@@ -17426,8 +17426,8 @@ export interface paths {
17426
17426
  cookie?: never;
17427
17427
  };
17428
17428
  /**
17429
- * Competitor ad groups in every language - thresholds and the last run (za-15).
17430
- * @description Gated on `ads.view`. On the caller's own connection. The daily audit (Temporal) reads the account's own search terms and proposes, for approval, one ad group `<Rival> alternative` per rival per language market whose searches reach the thresholds, with PHRASE keywords and one responsive search ad copied from an approved ad in that campaign (or the English ad translated in one batched call), with no competitor name in the ad text (docs/1006 §81). Proposals are ordinary approve-first changes (`listAdsChanges`). `enabled` is the competitor switch AND a plan carrying `ads_competitor_groups`. Read from stored rows, never a network call in the request.
17429
+ * Competitor ad groups in every language - thresholds and the last run (za-15, za-71).
17430
+ * @description za-71 (docs/1006 §89): a rival the house table says must not be built (a free host, or a local brand searched off its market) is BLOCKED with EXACT campaign negatives instead, each verdict behind its own customer switch (`block_free_hosts`, `block_off_market`, Recommended on); in the customer's Automatic mode builds and blocks are sent through the change gate (kill switch, good standing) with an Undo, otherwise queued for approval. Gated on `ads.view`. On the caller's own connection. The daily audit (Temporal) reads the account's own search terms and proposes, for approval, one ad group `<Rival> alternative` per rival per language market whose searches reach the thresholds, with PHRASE keywords and one responsive search ad copied from an approved ad in that campaign (or the English ad translated in one batched call), with no competitor name in the ad text (docs/1006 §81). Proposals are ordinary approve-first changes (`listAdsChanges`). `enabled` is the competitor switch AND a plan carrying `ads_competitor_groups`. Read from stored rows, never a network call in the request.
17431
17431
  */
17432
17432
  get: operations["getAdsCompetitorGroups"];
17433
17433
  put?: never;
@@ -32338,7 +32338,7 @@ export interface paths {
32338
32338
  put?: never;
32339
32339
  /**
32340
32340
  * Record translations the repository committed (batch).
32341
- * @description i18n fix A (2026-10-16): when a lane commits a translation into the repository after the engine translated the SAME English, the repository's copy wins, and the export (`scripts/i18n-sync.mjs export`) hands it back here so the engine and the repo hold one truth. Each item is accepted only while `source_hash` still equals the string's current English hash; an item whose English moved on (`stale`) or whose string is unknown (`missing`) is reported and left alone, so a changed source keeps re-translating through the ordinary batched pipeline (CLAUDE.md §2.19). An accepted row is `up_to_date`, its `translated_at` is now, and it is attributed `repo` — indistinguishable from any other translation to every consumer. Idempotent: the same text again changes nothing.
32341
+ * @description i18n fix A (2026-10-16): when a lane commits a translation into the repository after the engine translated the SAME English, the repository's copy wins, and the export (`scripts/i18n-sync.mjs export`) hands it back here so the engine and the repo hold one truth. Each item is accepted only while `source_hash` still equals the string's current English hash; an item whose English moved on (`stale`) or whose string is unknown (`missing`) is reported and left alone, so a changed source keeps re-translating through the ordinary batched pipeline (CLAUDE.md §2.19). An accepted row is `up_to_date`, its `translated_at` is now, and it is attributed `repo` — indistinguishable from any other translation to every consumer. Idempotent: the same text again changes nothing. An item whose text drops a required term rendering for its locale (`engine/engine/i18n/term_renderings.py`, e.g. de "Zinn® Managed WordPress") is `refused` and left alone: a pin outranks the repository, exactly as it outranks a new machine answer.
32342
32342
  */
32343
32343
  post: operations["recordRepoTranslations"];
32344
32344
  delete?: never;
@@ -62302,15 +62302,32 @@ export interface components {
62302
62302
  headlines?: string[];
62303
62303
  impressions?: number;
62304
62304
  keywords?: string[];
62305
+ /**
62306
+ * @description za-71: a built group, or a blocked rival's campaign negatives.
62307
+ * @enum {string}
62308
+ */
62309
+ kind?: "group" | "block";
62305
62310
  /** @description The market's language code. */
62306
62311
  language: string;
62307
- /** @description Why it waits - noApprovedAd, noLandingPage, gateRefused, noBid (no enabled group bid and no Maximise-clicks ceiling to start the new group on). */
62312
+ /** @description za-71: the EXACT campaign negatives of a block. */
62313
+ negatives?: string[];
62314
+ /** @description Why it waits - noApprovedAd, noLandingPage, gateRefused, noBid (no enabled group bid and no Maximise-clicks ceiling to start the new group on), refused, failed, conflict. */
62308
62315
  reason?: string;
62316
+ /** @description Searches of a block the pre-check refused (an enabled keyword's query, or a search that converted); the rest were still sent. */
62317
+ refused?: string[];
62309
62318
  rival: string;
62310
62319
  /** @enum {string} */
62311
- source?: "copied" | "translated";
62312
- /** @enum {string} */
62313
- status: "proposed" | "waiting";
62320
+ source?: "copied" | "translated" | "written";
62321
+ /**
62322
+ * @description applied = sent by the Automatic mode, with an Undo (za-71).
62323
+ * @enum {string}
62324
+ */
62325
+ status: "proposed" | "applied" | "waiting" | "refused" | "failed" | "off";
62326
+ /**
62327
+ * @description za-71: why a block blocks.
62328
+ * @enum {string}
62329
+ */
62330
+ verdict?: "free_host" | "wrong_market";
62314
62331
  };
62315
62332
  AdsCompetitorGroupsEnvelope: {
62316
62333
  data: {
@@ -62319,6 +62336,8 @@ export interface components {
62319
62336
  /** @description Proposals waiting for approval. */
62320
62337
  pending: number;
62321
62338
  settings: {
62339
+ block_free_hosts: components["schemas"]["AdsCompetitorGroupsSwitch"];
62340
+ block_off_market: components["schemas"]["AdsCompetitorGroupsSwitch"];
62322
62341
  lookback_days: components["schemas"]["AdsCompetitorGroupsThreshold"];
62323
62342
  max_keywords: components["schemas"]["AdsCompetitorGroupsThreshold"];
62324
62343
  min_clicks: components["schemas"]["AdsCompetitorGroupsThreshold"];
@@ -62328,14 +62347,22 @@ export interface components {
62328
62347
  };
62329
62348
  };
62330
62349
  AdsCompetitorGroupsPatch: {
62350
+ /** @description za-71: block searches for a free host. null = Recommended (on). */
62351
+ block_free_hosts?: boolean | null;
62352
+ /** @description za-71: block a local brand searched outside its market. null = Recommended (on). */
62353
+ block_off_market?: boolean | null;
62331
62354
  lookback_days?: number | null;
62332
62355
  max_keywords?: number | null;
62333
62356
  min_clicks?: number | null;
62334
62357
  min_impressions?: number | null;
62335
62358
  };
62336
62359
  AdsCompetitorGroupsRun: {
62360
+ /** @description za-71: builds and blocks the Automatic mode sent. */
62361
+ applied?: number;
62337
62362
  /** Format: date-time */
62338
62363
  at: string;
62364
+ /** @description za-71: blocks decided this run (applied or proposed). */
62365
+ blocked?: number;
62339
62366
  /** @description Rival + language pairs that already have a group or a decided proposal. */
62340
62367
  covered: number;
62341
62368
  groups: components["schemas"]["AdsCompetitorGroup"][];
@@ -62344,6 +62371,12 @@ export interface components {
62344
62371
  skipped: string;
62345
62372
  waiting: number;
62346
62373
  };
62374
+ AdsCompetitorGroupsSwitch: {
62375
+ /** @description True when the customer set it; false = Recommended. */
62376
+ custom: boolean;
62377
+ recommended: boolean;
62378
+ value: boolean;
62379
+ };
62347
62380
  AdsCompetitorGroupsThreshold: {
62348
62381
  /** @description True when the customer set it; false = Recommended. */
62349
62382
  custom: boolean;
@@ -162428,7 +162461,7 @@ export interface operations {
162428
162461
  };
162429
162462
  };
162430
162463
  responses: {
162431
- /** @description How many items were recorded, already equal, stale or unknown. */
162464
+ /** @description How many items were recorded, already equal, stale, unknown or refused. */
162432
162465
  200: {
162433
162466
  headers: {
162434
162467
  [name: string]: unknown;
@@ -162437,6 +162470,8 @@ export interface operations {
162437
162470
  "application/json": {
162438
162471
  missing: number;
162439
162472
  recorded: number;
162473
+ /** @description Items whose text breaks a term rendering pinned for its locale; the engine's row is kept unchanged. */
162474
+ refused: number;
162440
162475
  stale: number;
162441
162476
  unchanged: number;
162442
162477
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zinn-digital/sdk",
3
- "version": "0.1.1382",
3
+ "version": "0.1.1384",
4
4
  "description": "Typed TypeScript client for the Zinn Digital Platform API, generated from its OpenAPI spec.",
5
5
  "license": "MIT",
6
6
  "author": "Neil Lock \u2014 CEO, Zinn Digital\u00ae Ltd <office@zinndigital.com>",