@zinn-digital/sdk 0.1.1427 → 0.1.1430

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.
@@ -15989,6 +15989,26 @@ export interface paths {
15989
15989
  patch?: never;
15990
15990
  trace?: never;
15991
15991
  };
15992
+ "/v1/ads/analytics/impact": {
15993
+ parameters: {
15994
+ query?: never;
15995
+ header?: never;
15996
+ path?: never;
15997
+ cookie?: never;
15998
+ };
15999
+ /**
16000
+ * How Zinn® Ads helped - money saved, fraud blocked, refunds won, conversions recovered, changes and before vs after (za-281).
16001
+ * @description Over the same filters as the other analytics reads: wasted spend blocked (search terms and keywords the audit found spending with no conversion, then blocked or paused, with the measured cost and clicks before the block), invalid clicks excluded by the click shield (their measured cost), credits the network granted for invalid activity, conversions Zinn® Ads uploaded that the network's own tag had missed, the changes Zinn® Ads made by kind (changes the customer made, in the dashboard or with their own API key, are not counted) with how many can still be undone, the self-check verdicts of the changes scored in the period, and ROAS over the 90 days before the first account was connected and since. `money_saved_micros` is waste blocked plus, per account and currency, the larger of fraud blocked and refunds won (a credit refunds the same invalid clicks the exclusions measured, so that money is counted once), all measured. `hours_saved` is a MODEL (changes times the stated minutes per change), flagged `modelled: true`. Each list is the latest 20 items with the full `count` beside it; a waste item carries the change that blocked it and whether it can still be undone. Network and account filters apply to every section. The campaign filter narrows waste blocked, fraud blocked (account-level exclusions stay), the self-check verdicts and before vs after; refunds won, conversions recovered and changes made are account-wide and ignore it. Country and product/site filters apply to before vs after only. A fraud item's Undo is offered only where the server accepts it: Google has named it, no removal is under way, and it was applied inside the 30-day undo window. Gated on `ads.view` over the organisations the person can view; `org_id` narrows to that organisation and its client organisations. Stored rows only, never a network call. Money is integer micros of the reporting `currency` at the current stored rate (`fx`).
16002
+ */
16003
+ get: operations["getAdsAnalyticsImpact"];
16004
+ put?: never;
16005
+ post?: never;
16006
+ delete?: never;
16007
+ options?: never;
16008
+ head?: never;
16009
+ patch?: never;
16010
+ trace?: never;
16011
+ };
15992
16012
  "/v1/ads/analytics/summary": {
15993
16013
  parameters: {
15994
16014
  query?: never;
@@ -20477,7 +20497,7 @@ export interface paths {
20477
20497
  put?: never;
20478
20498
  /**
20479
20499
  * Undo one click-shield exclusion (one click).
20480
- * @description Gated on `ads.manage` (IPROTATE, za-59). The person's click approves the removal of that one exclusion at Google (sent by the apply workflow, through the metered driver) and the exclusion is never proposed again for its campaign. Refused (422) when it is not at Google (`notApplied`), Google has not confirmed it yet (`notYetAtGoogle`) or a removal is already on its way (`alreadyRemoving`). The daily e-mail's Undo link for one exclusion runs this same path through `actOnAdsEmailLink`. A Microsoft website exclusion is removed from the campaign's list the same way; a Meta `listed` one only leaves the Zinn-held block list (nothing is sent to Meta) and is never listed again.
20500
+ * @description Gated on `ads.manage` (IPROTATE, za-59). The person's click approves the removal of that one exclusion at Google (sent by the apply workflow, through the metered driver) and the exclusion is never proposed again for its campaign. Refused (422) when it is not at Google (`notApplied`), Google has not confirmed it yet (`notYetAtGoogle`), a removal is already on its way (`alreadyRemoving`) or it was applied more than 30 days ago (`refusal.adsconnect.undoExpired`, the same undo window as every Zinn® Ads change). The daily e-mail's Undo link for one exclusion runs this same path through `actOnAdsEmailLink`. A Microsoft website exclusion is removed from the campaign's list the same way; a Meta `listed` one only leaves the Zinn-held block list (nothing is sent to Meta) and is never listed again.
20481
20501
  */
20482
20502
  post: operations["undoAdsShieldExclusion"];
20483
20503
  delete?: never;
@@ -62479,6 +62499,117 @@ export interface components {
62479
62499
  rate: string;
62480
62500
  to: string;
62481
62501
  };
62502
+ AdsAnalyticsImpact: components["schemas"]["AdsAnalyticsFrame"] & {
62503
+ before_after: {
62504
+ after: components["schemas"]["AdsAnalyticsImpactPeriod"];
62505
+ before: components["schemas"]["AdsAnalyticsImpactPeriod"];
62506
+ /** Format: date */
62507
+ started_on: string | null;
62508
+ };
62509
+ changes: {
62510
+ by_kind: {
62511
+ count: number;
62512
+ kind: string;
62513
+ undoable: number;
62514
+ }[];
62515
+ total: number;
62516
+ undoable: number;
62517
+ };
62518
+ effect: {
62519
+ better: number;
62520
+ /** Format: int64 */
62521
+ conversions_gained_milli: number;
62522
+ no_data: number;
62523
+ same: number;
62524
+ worse: number;
62525
+ };
62526
+ fraud: {
62527
+ /** Format: int64 */
62528
+ clicks: number;
62529
+ /** Format: int64 */
62530
+ cost_micros: number;
62531
+ count: number;
62532
+ items: {
62533
+ /** Format: date-time */
62534
+ blocked_at: string | null;
62535
+ can_undo: boolean;
62536
+ clicks: number;
62537
+ /** Format: uuid */
62538
+ connection_id: string;
62539
+ /** Format: int64 */
62540
+ cost_micros: number;
62541
+ /** Format: uuid */
62542
+ id: string;
62543
+ kind: string;
62544
+ label: string;
62545
+ }[];
62546
+ };
62547
+ hours_saved: {
62548
+ default_minutes: number;
62549
+ minutes: number;
62550
+ minutes_per_change: {
62551
+ [key: string]: number;
62552
+ };
62553
+ /** @description Always true - an estimate from the stated minutes per change */
62554
+ modelled: boolean;
62555
+ };
62556
+ /**
62557
+ * Format: int64
62558
+ * @description Waste blocked plus fraud blocked plus refunds won (measured).
62559
+ */
62560
+ money_saved_micros: number;
62561
+ recovered: {
62562
+ conversions: number;
62563
+ /** Format: int64 */
62564
+ value_micros: number;
62565
+ };
62566
+ refunds: {
62567
+ count: number;
62568
+ /** Format: int64 */
62569
+ credited_micros: number;
62570
+ items: {
62571
+ /** Format: uuid */
62572
+ connection_id: string;
62573
+ /** Format: int64 */
62574
+ credited_micros: number;
62575
+ /** Format: uuid */
62576
+ id: string;
62577
+ /** Format: date */
62578
+ month: string | null;
62579
+ }[];
62580
+ };
62581
+ waste: {
62582
+ /** Format: int64 */
62583
+ clicks: number;
62584
+ /** Format: int64 */
62585
+ cost_micros: number;
62586
+ count: number;
62587
+ items: {
62588
+ /** Format: date-time */
62589
+ blocked_at: string | null;
62590
+ campaign: string;
62591
+ can_undo: boolean;
62592
+ /** Format: uuid */
62593
+ change_id: string | null;
62594
+ clicks: number;
62595
+ /** Format: uuid */
62596
+ connection_id: string;
62597
+ /** Format: int64 */
62598
+ cost_micros: number;
62599
+ /** Format: uuid */
62600
+ id: string;
62601
+ /** @enum {string} */
62602
+ kind: "waste_term" | "poor_keyword";
62603
+ text: string;
62604
+ }[];
62605
+ };
62606
+ };
62607
+ AdsAnalyticsImpactPeriod: (components["schemas"]["AdsAnalyticsFigures"] & {
62608
+ /** Format: date */
62609
+ first_day: string;
62610
+ /** Format: date */
62611
+ last_day: string;
62612
+ }) | null;
62482
62613
  AdsAnalyticsPoint: components["schemas"]["AdsAnalyticsFigures"] & {
62483
62614
  /** Format: date */
62484
62615
  bucket: string;
@@ -119352,7 +119483,7 @@ export interface operations {
119352
119483
  query?: {
119353
119484
  /** @description `true` restricts to still-open purchases past their due date. A completed job past its deadline is not overdue -- it was delivered. */
119354
119485
  overdue?: "true";
119355
- /** @description `open` (default: awaiting_staff + fulfilling), `all`, or one exact status. `fulfilling` is in the default set on purpose: an automated extra stuck mid-workflow is also work nobody is doing. */
119486
+ /** @description `open` (default: awaiting_staff + fulfilling), `all`, or one exact status. `fulfilling` is in the default set on purpose: an automated extra stuck mid-workflow is also work nobody is doing. An AI Move's $0 purchase is left out of `open` while the AI is running it and shown once it escalates (needs staff, taken over, or past its SLA). */
119356
119487
  status?: string;
119357
119488
  };
119358
119489
  header?: never;
@@ -136348,6 +136479,54 @@ export interface operations {
136348
136479
  429: components["responses"]["TooManyRequests"];
136349
136480
  };
136350
136481
  };
136482
+ getAdsAnalyticsImpact: {
136483
+ parameters: {
136484
+ query?: {
136485
+ /** @description Comma-separated `<connection_id>:<campaign_id>` tokens. */
136486
+ campaign?: components["parameters"]["AdsAnalyticsCampaign"];
136487
+ compare?: components["parameters"]["AdsAnalyticsCompare"];
136488
+ /** @description Comma-separated ad-account connection ids. */
136489
+ connection?: components["parameters"]["AdsAnalyticsConnection"];
136490
+ /** @description Comma-separated ISO 3166-1 alpha-2 codes. Reads the country-level figures. */
136491
+ country?: components["parameters"]["AdsAnalyticsCountry"];
136492
+ /** @description Reporting currency (ISO 4217). Default the one currency in play, else the organisation's. */
136493
+ currency?: components["parameters"]["AdsAnalyticsCurrency"];
136494
+ from?: components["parameters"]["AdsAnalyticsFrom"];
136495
+ /** @description Bucket size. Default day up to 92 days, week up to 366, month beyond. */
136496
+ grain?: components["parameters"]["AdsAnalyticsGrain"];
136497
+ /** @description Comma-separated networks (google, microsoft, meta, linkedin, tiktok, x, pinterest, amazon). */
136498
+ network?: components["parameters"]["AdsAnalyticsNetwork"];
136499
+ /** @description Comma-separated product/site ids (za-290), or `unassigned`. */
136500
+ offering?: components["parameters"]["AdsAnalyticsOffering"];
136501
+ org_id?: string;
136502
+ /** @description The period. `custom` takes `from` and `to`. */
136503
+ range?: components["parameters"]["AdsAnalyticsRange"];
136504
+ to?: components["parameters"]["AdsAnalyticsTo"];
136505
+ };
136506
+ header?: never;
136507
+ path?: never;
136508
+ cookie?: never;
136509
+ };
136510
+ requestBody?: never;
136511
+ responses: {
136512
+ /** @description The figures. */
136513
+ 200: {
136514
+ headers: {
136515
+ [name: string]: unknown;
136516
+ };
136517
+ content: {
136518
+ "application/json": {
136519
+ data: components["schemas"]["AdsAnalyticsImpact"];
136520
+ };
136521
+ };
136522
+ };
136523
+ 401: components["responses"]["Unauthorized"];
136524
+ 403: components["responses"]["Forbidden"];
136525
+ 404: components["responses"]["NotFound"];
136526
+ 422: components["responses"]["UnprocessableEntity"];
136527
+ 429: components["responses"]["TooManyRequests"];
136528
+ };
136529
+ };
136351
136530
  getAdsAnalyticsSummary: {
136352
136531
  parameters: {
136353
136532
  query?: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zinn-digital/sdk",
3
- "version": "0.1.1427",
3
+ "version": "0.1.1430",
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>",