@synterai/sdk-js 0.1.1 → 0.2.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/CHANGELOG.md +11 -0
- package/README.md +66 -4
- package/dist/index.d.mts +187 -11
- package/dist/index.d.ts +187 -11
- package/dist/index.js +222 -19
- package/dist/index.mjs +217 -19
- package/package.json +9 -8
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.2.0 — 2026-10-02
|
|
4
|
+
|
|
5
|
+
Metadata: public repo link (Synter-Media-AI/synter-docs), synterai.com homepage, hello@synterai.com author, and the official-packages provenance line in the README.
|
|
6
|
+
|
|
7
|
+
Default production URLs and documentation links now use synterai.com. The artifact API uses api.synterai.com where applicable.
|
|
8
|
+
|
|
9
|
+
Explicit `baseUrl` and `artifactBaseUrl` options take precedence over `SYNTER_API_URL` and `SYNTER_ARTIFACT_API_URL` in Node.js. Browser clients can use the options without a `process` global.
|
|
10
|
+
|
|
11
|
+
The syntermedia.ai machine endpoints remain dual-served for previously published versions and explicit overrides.
|
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# @synterai/sdk-js
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for the [Synter](https://syntermedia.ai) advertising API — manage campaigns across Google Ads, Meta, LinkedIn, Microsoft
|
|
3
|
+
TypeScript SDK for the [Synter](https://syntermedia.ai) advertising API — manage campaigns across 27 ad platforms (Google Ads, Meta, LinkedIn, Microsoft, Reddit, TikTok, X, Amazon DSP, Amazon Ads, Pinterest, Snap, Spotify, OpenAI Ads, The Trade Desk, FreeWheel, DV360, CM360, Walmart Connect, Instacart Ads, Target Roundel, Criteo) from your own code, with full types and IDE autocomplete.
|
|
4
4
|
|
|
5
|
-
> **`0.1.
|
|
5
|
+
> **`0.1.2` — live on npm.** Pre-1.0: the surface may change before a stable `1.0`. Pin a version in production. `0.1.2` fixes `analytics.getPerformance({ platform: "google" | "linkedin" })`, which in `0.1.0`/`0.1.1` sent the script *filename* (`pull_google_ads_data`) instead of the canonical script name (`pull_google_ads`); the backend rejected it with `400 UNKNOWN_TOOL` until it gained an alias on 2026-08-27 (synter-media PR #9684).
|
|
6
6
|
|
|
7
7
|
## What this actually talks to
|
|
8
8
|
|
|
9
|
-
Every method in this SDK calls the same live, production endpoint that powers Synter's MCP server (`@synterai/mcp-server`) and the `synter` CLI: `POST https://syntermedia.ai/api/v1/tools/run`. There is no separate "SDK backend" — if a method works here, it works because the exact same call already works for every MCP client (Claude, Cursor, Codex, ChatGPT) today.
|
|
9
|
+
Every method in this SDK calls the same live, production endpoint that powers Synter's MCP server (`@synterai/mcp-server`) and the `synter` CLI: `POST https://syntermedia.ai/api/v1/tools/run`. There is no separate "SDK backend" — if a method works here, it works because the exact same call already works for every MCP client (Claude, Cursor, Codex, Devin, ChatGPT) today.
|
|
10
10
|
|
|
11
11
|
See [`../sdk-shared/SPEC.md`](../sdk-shared/SPEC.md) and [`../sdk-shared/catalog.json`](../sdk-shared/catalog.json) for the full transport contract this SDK — and every sibling-language SDK — implements.
|
|
12
12
|
|
|
@@ -18,7 +18,7 @@ npm install @synterai/sdk-js
|
|
|
18
18
|
|
|
19
19
|
## Authentication
|
|
20
20
|
|
|
21
|
-
Get an API key at [syntermedia.ai/developer](https://syntermedia.ai/developer). Keys look like `syn_` followed by 32 base64url characters.
|
|
21
|
+
Get an API key at [syntermedia.ai/developer](https://syntermedia.ai/developer). Keys look like `syn_` followed by 32 base64url characters. Keys issued from a sandbox workspace use the `syn_test_` prefix instead and only work against that sandbox — no live ad-account risk.
|
|
22
22
|
|
|
23
23
|
> **⚠️ Server-side only.** Your `SYNTER_API_KEY` is a secret that can spend money and modify your ad accounts. Use this SDK from a **backend** — a Node service, a Next.js API route or Server Action, an edge/serverless function. **Never** instantiate `Synter` in client-side code (React components, browser bundles, mobile apps); the key would ship to every visitor. For a React/SPA frontend, call your own backend, and have the backend call Synter.
|
|
24
24
|
|
|
@@ -64,6 +64,68 @@ const image = await synter.creative.generateImage({ prompt: 'a running shoe on a
|
|
|
64
64
|
await synter.execute('google_ads_list_audiences', { status: 'ENABLED' }, 'google');
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
+
## Post-Write Readback Verification (Agent Safety Pattern)
|
|
68
|
+
|
|
69
|
+
When coding agents or automated scripts modify campaign state (such as pausing overspending campaigns or halving daily budgets), **never trust an HTTP 200 `{success: true}` alone**. Always execute an explicit post-write readback to verify that the upstream ad platform actually persisted and confirmed the state change:
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { Synter } from '@synterai/sdk-js';
|
|
73
|
+
|
|
74
|
+
const synter = new Synter(process.env.SYNTER_API_KEY!);
|
|
75
|
+
|
|
76
|
+
async function optimizeCampaignBudget(campaignId: string, targetCpa: number, isDryRun = true) {
|
|
77
|
+
// 1. Fetch 7-day performance
|
|
78
|
+
const perf = await synter.analytics.getPerformance({ platform: 'google', date_range: 'LAST_7_DAYS' });
|
|
79
|
+
const campaign = (perf.campaigns as any[])?.find(c => c.id === campaignId || c.campaign_id === campaignId);
|
|
80
|
+
|
|
81
|
+
if (!campaign) throw new Error(`Campaign ${campaignId} not found`);
|
|
82
|
+
|
|
83
|
+
const cost = Number(campaign.cost || 0);
|
|
84
|
+
const conversions = Number(campaign.conversions || 0);
|
|
85
|
+
|
|
86
|
+
// Handle missing or zero conversions explicitly — never guess a CPA
|
|
87
|
+
if (conversions <= 0) {
|
|
88
|
+
console.log(`[SKIP] Campaign ${campaignId}: 0 conversions recorded, CPA is undefined.`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const cpa = cost / conversions;
|
|
93
|
+
if (cpa <= targetCpa) {
|
|
94
|
+
console.log(`[OK] Campaign ${campaignId}: CPA $${cpa.toFixed(2)} <= threshold $${targetCpa}. No action needed.`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const currentBudget = Number(campaign.daily_budget || campaign.budget || 50);
|
|
99
|
+
const newBudget = Math.max(1, Math.round(currentBudget * 0.5));
|
|
100
|
+
|
|
101
|
+
console.log(`[ACTION] Campaign ${campaignId}: CPA $${cpa.toFixed(2)} > threshold $${targetCpa}. Target: PAUSE and cut budget to $${newBudget}/day.`);
|
|
102
|
+
|
|
103
|
+
if (isDryRun) {
|
|
104
|
+
console.log(`[DRY RUN] Would pause campaign ${campaignId} and reduce daily budget from $${currentBudget} to $${newBudget}.`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 2. Execute mutations in apply mode
|
|
109
|
+
const pauseResult = await synter.campaigns.pause({ campaign_id: campaignId, platform: 'google' });
|
|
110
|
+
const budgetResult = await synter.campaigns.updateBudget({ campaign_id: campaignId, platform: 'google', daily_budget: newBudget });
|
|
111
|
+
|
|
112
|
+
// 3. MANDATORY POST-WRITE READBACK VERIFICATION
|
|
113
|
+
// Re-read campaign state from Google Ads to verify provider applied the mutations
|
|
114
|
+
const refreshed = await synter.campaigns.list({ platform: 'google' });
|
|
115
|
+
const verified = (refreshed.campaigns as any[])?.find(c => c.id === campaignId || c.campaign_id === campaignId);
|
|
116
|
+
|
|
117
|
+
if (!verified) {
|
|
118
|
+
throw new Error(`Readback verification failed: Campaign ${campaignId} not returned in refreshed list.`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (verified.status !== 'PAUSED') {
|
|
122
|
+
throw new Error(`Readback verification failed: Campaign ${campaignId} status is '${verified.status}', expected 'PAUSED'.`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
console.log(`[VERIFIED] Campaign ${campaignId} successfully paused and daily budget reduced to $${newBudget}. Confirmed on live platform.`);
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
67
129
|
## API surface
|
|
68
130
|
|
|
69
131
|
Methods are grouped by category, matching the tool catalog:
|
package/dist/index.d.mts
CHANGED
|
@@ -153,6 +153,34 @@ declare class CampaignsResource {
|
|
|
153
153
|
* dispatches with `platform=google` regardless of input.
|
|
154
154
|
*/
|
|
155
155
|
updateBudget(input: UpdateCampaignBudgetInput): Promise<Record<string, unknown>>;
|
|
156
|
+
/**
|
|
157
|
+
* Update campaign budget with deterministic readback verification.
|
|
158
|
+
*
|
|
159
|
+
* Executes the budget update, waits for propagation, and reads back
|
|
160
|
+
* campaign status from the platform to verify the update succeeded on the wire.
|
|
161
|
+
*/
|
|
162
|
+
updateBudgetAndVerify(input: UpdateCampaignBudgetInput & {
|
|
163
|
+
maxWaitMs?: number;
|
|
164
|
+
pollIntervalMs?: number;
|
|
165
|
+
}): Promise<{
|
|
166
|
+
mutation: Record<string, unknown>;
|
|
167
|
+
verified: boolean;
|
|
168
|
+
readback?: Record<string, unknown>;
|
|
169
|
+
}>;
|
|
170
|
+
/**
|
|
171
|
+
* Pause a campaign with deterministic readback verification.
|
|
172
|
+
*
|
|
173
|
+
* Executes the pause command, waits for propagation, and reads back
|
|
174
|
+
* campaign status from the platform to verify status === 'PAUSED' on the wire.
|
|
175
|
+
*/
|
|
176
|
+
pauseAndVerify(input: PauseCampaignInput & {
|
|
177
|
+
maxWaitMs?: number;
|
|
178
|
+
pollIntervalMs?: number;
|
|
179
|
+
}): Promise<{
|
|
180
|
+
mutation: Record<string, unknown>;
|
|
181
|
+
verified: boolean;
|
|
182
|
+
readback?: Record<string, unknown>;
|
|
183
|
+
}>;
|
|
156
184
|
}
|
|
157
185
|
|
|
158
186
|
/**
|
|
@@ -161,9 +189,7 @@ declare class CampaignsResource {
|
|
|
161
189
|
* Both are custom-dispatch per SPEC.md's testing bar (not forced through
|
|
162
190
|
* the generic argMapping-only path): get_performance has a platform-scoped
|
|
163
191
|
* `onlyForPlatform` flag and a `dateRangeToDays` transform; get_daily_spend
|
|
164
|
-
*
|
|
165
|
-
* any other tool) also re-emits that resolved platform as an uppercased
|
|
166
|
-
* CLI flag.
|
|
192
|
+
* uses the same platform-routed pull scripts with `--days` (default 7).
|
|
167
193
|
*/
|
|
168
194
|
|
|
169
195
|
interface GetPerformanceInput {
|
|
@@ -219,7 +245,8 @@ declare class KeywordsResource {
|
|
|
219
245
|
|
|
220
246
|
/**
|
|
221
247
|
* `conversions` category — catalog.json tools: create_conversion,
|
|
222
|
-
* list_conversions, diagnose_tracking
|
|
248
|
+
* list_conversions, diagnose_tracking, get_pixel_health,
|
|
249
|
+
* list_event_deliveries, get_click_attribution.
|
|
223
250
|
*/
|
|
224
251
|
|
|
225
252
|
interface CreateConversionInput {
|
|
@@ -234,6 +261,21 @@ interface DiagnoseTrackingInput {
|
|
|
234
261
|
/** Website URL to check. */
|
|
235
262
|
url: string;
|
|
236
263
|
}
|
|
264
|
+
interface GetPixelHealthInput {
|
|
265
|
+
site_key?: string;
|
|
266
|
+
}
|
|
267
|
+
interface ListEventDeliveriesInput {
|
|
268
|
+
site_key?: string;
|
|
269
|
+
status?: 'PENDING' | 'SUCCESS' | 'RETRYING' | 'FAILED';
|
|
270
|
+
platform?: string;
|
|
271
|
+
limit?: number;
|
|
272
|
+
}
|
|
273
|
+
interface GetClickAttributionInput {
|
|
274
|
+
site_key?: string;
|
|
275
|
+
user_id?: number;
|
|
276
|
+
email?: string;
|
|
277
|
+
limit?: number;
|
|
278
|
+
}
|
|
237
279
|
declare class ConversionsResource {
|
|
238
280
|
private readonly client;
|
|
239
281
|
constructor(client: Synter);
|
|
@@ -252,6 +294,9 @@ declare class ConversionsResource {
|
|
|
252
294
|
* credentials (SPEC.md's "Platform resolution" rule 3).
|
|
253
295
|
*/
|
|
254
296
|
diagnoseTracking(input: DiagnoseTrackingInput): Promise<Record<string, unknown>>;
|
|
297
|
+
getPixelHealth(input?: GetPixelHealthInput): Promise<Record<string, unknown>>;
|
|
298
|
+
listEventDeliveries(input?: ListEventDeliveriesInput): Promise<Record<string, unknown>>;
|
|
299
|
+
getClickAttribution(input?: GetClickAttributionInput): Promise<Record<string, unknown>>;
|
|
255
300
|
}
|
|
256
301
|
|
|
257
302
|
/**
|
|
@@ -421,7 +466,7 @@ declare class AudiencesResource {
|
|
|
421
466
|
* identifiers inline when over ~500 entries.
|
|
422
467
|
*
|
|
423
468
|
* Bypasses the primary `tools/run` dispatcher: different host
|
|
424
|
-
* (`https://api.
|
|
469
|
+
* (`https://api.synterai.com`) and a different auth header
|
|
425
470
|
* (`X-Synter-Key`, not `Authorization: Bearer`) — see SPEC.md/catalog.json
|
|
426
471
|
* `transport.special`.
|
|
427
472
|
*/
|
|
@@ -444,6 +489,127 @@ declare class AudiencesResource {
|
|
|
444
489
|
manage(input: ManageAudienceInput): Promise<Record<string, unknown>>;
|
|
445
490
|
}
|
|
446
491
|
|
|
492
|
+
/**
|
|
493
|
+
* `shield` category — Agent Shield spend limits, burst thresholds,
|
|
494
|
+
* circuit breakers, and kill-switch inspection.
|
|
495
|
+
*/
|
|
496
|
+
|
|
497
|
+
interface InspectShieldInput {
|
|
498
|
+
platform?: AdPlatform;
|
|
499
|
+
}
|
|
500
|
+
interface AgentShieldPolicy {
|
|
501
|
+
policy_id: string;
|
|
502
|
+
name: string;
|
|
503
|
+
enforced: boolean;
|
|
504
|
+
max_daily_spend_usd: number;
|
|
505
|
+
max_hourly_spend_usd: number;
|
|
506
|
+
burst_threshold_multiplier: number;
|
|
507
|
+
circuit_breaker_active: boolean;
|
|
508
|
+
kill_switch_engaged: boolean;
|
|
509
|
+
}
|
|
510
|
+
declare class ShieldResource {
|
|
511
|
+
private readonly client;
|
|
512
|
+
constructor(client: Synter);
|
|
513
|
+
/**
|
|
514
|
+
* Inspect Agent Shield velocity limits, burst thresholds, circuit breakers,
|
|
515
|
+
* and kill-switch status before executing ad-spend mutations.
|
|
516
|
+
*/
|
|
517
|
+
inspect(input?: InspectShieldInput): Promise<{
|
|
518
|
+
status: 'ACTIVE' | 'TRIPPED' | 'PAUSED';
|
|
519
|
+
policies: AgentShieldPolicy[];
|
|
520
|
+
kill_switch_engaged: boolean;
|
|
521
|
+
notice: string;
|
|
522
|
+
}>;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* `angstrom` category — Synter Ångström attribution claim verification.
|
|
527
|
+
*/
|
|
528
|
+
|
|
529
|
+
interface VerifyAngstromClaimInput {
|
|
530
|
+
platform?: AdPlatform;
|
|
531
|
+
claimed_conversions?: number;
|
|
532
|
+
claimed_revenue_usd?: number;
|
|
533
|
+
touchpoint_ids?: string[];
|
|
534
|
+
}
|
|
535
|
+
interface AngstromVerificationResult {
|
|
536
|
+
confidence_score: number;
|
|
537
|
+
verdict: 'VERIFIED' | 'DISPUTED' | 'UNVERIFIABLE';
|
|
538
|
+
incremental_lift_multiplier: number;
|
|
539
|
+
deterministic_touchpoints_verified: number;
|
|
540
|
+
rubric: {
|
|
541
|
+
single_touch_discount: number;
|
|
542
|
+
cross_network_dedup_factor: number;
|
|
543
|
+
latency_decay_score: number;
|
|
544
|
+
};
|
|
545
|
+
explanation: string;
|
|
546
|
+
}
|
|
547
|
+
declare class AngstromResource {
|
|
548
|
+
private readonly client;
|
|
549
|
+
constructor(client: Synter);
|
|
550
|
+
/**
|
|
551
|
+
* Verify attribution claims against Synter Ångström's deterministic confidence rubric.
|
|
552
|
+
*/
|
|
553
|
+
verify(input?: VerifyAngstromClaimInput): Promise<AngstromVerificationResult>;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* `skills` category — Core autonomous growth playbooks.
|
|
558
|
+
*/
|
|
559
|
+
|
|
560
|
+
type GrowthSkillId = 'pmax-brand-cannibalization' | 'search-hygiene-shield' | 'marginal-cpa-budget-rebalancer' | 'meta-asc-dark-pool-auditor' | 'single-truth-attribution';
|
|
561
|
+
interface GrowthSkillPlaybook {
|
|
562
|
+
skill_id: GrowthSkillId;
|
|
563
|
+
name: string;
|
|
564
|
+
category: string;
|
|
565
|
+
description: string;
|
|
566
|
+
required_tools: string[];
|
|
567
|
+
execution_steps: string[];
|
|
568
|
+
safety_checks: string[];
|
|
569
|
+
expected_outcome: string;
|
|
570
|
+
}
|
|
571
|
+
declare class SkillsResource {
|
|
572
|
+
private readonly client;
|
|
573
|
+
constructor(client: Synter);
|
|
574
|
+
/**
|
|
575
|
+
* Load an autonomous growth runbook by ID.
|
|
576
|
+
*/
|
|
577
|
+
get(skillId: GrowthSkillId): Promise<GrowthSkillPlaybook>;
|
|
578
|
+
/**
|
|
579
|
+
* List available autonomous growth runbook IDs.
|
|
580
|
+
*/
|
|
581
|
+
list(): GrowthSkillId[];
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* `visibility` category — LLM search brand visibility and AEO share of voice.
|
|
586
|
+
*/
|
|
587
|
+
|
|
588
|
+
interface GetVisibilityInput {
|
|
589
|
+
query?: string;
|
|
590
|
+
competitor_domains?: string[];
|
|
591
|
+
}
|
|
592
|
+
interface EngineVisibilityScore {
|
|
593
|
+
engine: 'chatgpt' | 'claude' | 'perplexity' | 'gemini';
|
|
594
|
+
share_of_voice_pct: number;
|
|
595
|
+
mention_count: number;
|
|
596
|
+
ranking_position_avg: number;
|
|
597
|
+
}
|
|
598
|
+
interface VisibilityReportResult {
|
|
599
|
+
brand: string;
|
|
600
|
+
overall_aeo_score: number;
|
|
601
|
+
engines: EngineVisibilityScore[];
|
|
602
|
+
recommendations: string[];
|
|
603
|
+
}
|
|
604
|
+
declare class VisibilityResource {
|
|
605
|
+
private readonly client;
|
|
606
|
+
constructor(client: Synter);
|
|
607
|
+
/**
|
|
608
|
+
* Read AI search brand visibility and AEO share of voice across ChatGPT, Claude, Perplexity, and Gemini.
|
|
609
|
+
*/
|
|
610
|
+
get(input?: GetVisibilityInput): Promise<VisibilityReportResult>;
|
|
611
|
+
}
|
|
612
|
+
|
|
447
613
|
/**
|
|
448
614
|
* Amp Custom Advertising Toolbox
|
|
449
615
|
*
|
|
@@ -963,19 +1129,22 @@ declare class SynterValidationError extends Error {
|
|
|
963
1129
|
* Main Synter SDK client.
|
|
964
1130
|
*
|
|
965
1131
|
* Transport per SPEC.md: nearly every tool dispatches through
|
|
966
|
-
* `POST /api/v1/tools/run` on `https://
|
|
1132
|
+
* `POST /api/v1/tools/run` on `https://synterai.com` with
|
|
967
1133
|
* `{ script_name, args, platform? }`, auth via `Authorization: Bearer <key>`.
|
|
968
1134
|
* Two tools bypass that dispatcher (`list_landing_pages`, `stage_audience_artifact`)
|
|
969
1135
|
* — see `resources/audiences.ts` and `listLandingPages` below.
|
|
970
1136
|
*/
|
|
971
1137
|
|
|
972
1138
|
/** Real, production base URL — see SPEC.md's "Transport" section. */
|
|
973
|
-
declare const DEFAULT_BASE_URL = "https://
|
|
1139
|
+
declare const DEFAULT_BASE_URL = "https://synterai.com";
|
|
1140
|
+
declare const DEFAULT_ARTIFACT_BASE_URL = "https://api.synterai.com";
|
|
974
1141
|
interface SynterConfig {
|
|
975
|
-
/** `syn_` + 32 base64url characters, issued at
|
|
1142
|
+
/** `syn_` + 32 base64url characters, issued at synterai.com/developer. */
|
|
976
1143
|
apiKey: string;
|
|
977
|
-
/**
|
|
1144
|
+
/** Primary API URL. Takes precedence over SYNTER_API_URL in Node.js. */
|
|
978
1145
|
baseUrl?: string;
|
|
1146
|
+
/** Artifact API URL. Takes precedence over SYNTER_ARTIFACT_API_URL in Node.js. */
|
|
1147
|
+
artifactBaseUrl?: string;
|
|
979
1148
|
/** Request timeout in ms. Default 30000 (30s), per SPEC.md. */
|
|
980
1149
|
timeout?: number;
|
|
981
1150
|
/** Max retry attempts for 429s and network/timeout errors. Default 3, per SPEC.md. */
|
|
@@ -1000,6 +1169,7 @@ interface UploadImageInput {
|
|
|
1000
1169
|
declare class Synter {
|
|
1001
1170
|
private readonly apiKey;
|
|
1002
1171
|
private readonly baseUrl;
|
|
1172
|
+
private readonly artifactBaseUrl;
|
|
1003
1173
|
private readonly timeout;
|
|
1004
1174
|
private readonly maxRetries;
|
|
1005
1175
|
private readonly fetchImpl;
|
|
@@ -1012,6 +1182,10 @@ declare class Synter {
|
|
|
1012
1182
|
readonly linkedin: LinkedInResource;
|
|
1013
1183
|
readonly reddit: RedditResource;
|
|
1014
1184
|
readonly audiences: AudiencesResource;
|
|
1185
|
+
readonly shield: ShieldResource;
|
|
1186
|
+
readonly angstrom: AngstromResource;
|
|
1187
|
+
readonly skills: SkillsResource;
|
|
1188
|
+
readonly visibility: VisibilityResource;
|
|
1015
1189
|
/** AI-powered advertising toolbox for Amp integration — unchanged, out of scope for the transport rewrite. */
|
|
1016
1190
|
readonly amp: AmpToolbox;
|
|
1017
1191
|
constructor(config: SynterConfig | string, ampConfig?: AmpToolboxConfig);
|
|
@@ -1045,7 +1219,9 @@ declare class Synter {
|
|
|
1045
1219
|
*/
|
|
1046
1220
|
listLandingPages(): Promise<Record<string, unknown>>;
|
|
1047
1221
|
private authHeaders;
|
|
1048
|
-
/**
|
|
1222
|
+
/** Artifact host used by audience staging. */
|
|
1223
|
+
getArtifactBaseUrl(): string;
|
|
1224
|
+
/** The raw API key, for tools that need a non-Bearer header. */
|
|
1049
1225
|
getApiKey(): string;
|
|
1050
1226
|
/**
|
|
1051
1227
|
* Low-level generic HTTP helper retained for `AmpToolbox` and any other
|
|
@@ -1257,4 +1433,4 @@ declare function normalizeConversionEvent(params: {
|
|
|
1257
1433
|
metadata?: Record<string, any>;
|
|
1258
1434
|
}): AnalyticsEvent;
|
|
1259
1435
|
|
|
1260
|
-
export { type AdPlatform, type AddKeywordsInput, type AddNegativeKeywordsInput, AmpToolbox, type AmpToolboxConfig, type AnalyticsEvent, type AnalyticsIntegration, type AnalyticsIntegrationConfig, AnalyticsIntegrationManager, type AnalyticsPlatform, AnalyticsResource, AudiencesResource, type CampaignBriefInput, CampaignsResource, type ConversionPayload, ConversionsResource, type CreateConversionInput, type CreateDisplayCampaignInput, type CreateLinkedInCampaignInput, type CreateMetaCampaignInput, type CreatePmaxCampaignInput, type CreateRedditCampaignInput, type CreateSearchCampaignInput, CreativeResource, type CreativeVariant, DEFAULT_BASE_URL, type DateRange, type DiagnoseTrackingInput, type GenerateImageInput, type GenerateVideoInput, type GeneratedCampaign, type GetDailySpendInput, type GetPerformanceInput, KeywordsResource, LinkedInResource, type ListCampaignsInput, type ManageAudienceInput, MetaResource, type OptimizationRecommendation, type PauseCampaignInput, type Platform, type PlatformConnection, type PlatformStatus, RedditResource, type StageAudienceArtifactInput, type StageAudienceArtifactResult, type SyncAudienceInput, Synter, type SynterConfig, SynterError, SynterValidationError, type TrackingParams, type UTMParameters, type UTMTemplate, type UpdateCampaignBudgetInput, type UploadImageInput, buildConversionPayload, buildTrackingURL, buildUTMParameters, Synter as default, detectClickId, extractTrackingParams, extractUTMParameters, generateDefaultUTMTemplate, normalizeAdClickEvent, normalizeConversionEvent, normalizeEventName, validateClickId, validateUTMTemplate };
|
|
1436
|
+
export { type AdPlatform, type AddKeywordsInput, type AddNegativeKeywordsInput, type AgentShieldPolicy, AmpToolbox, type AmpToolboxConfig, type AnalyticsEvent, type AnalyticsIntegration, type AnalyticsIntegrationConfig, AnalyticsIntegrationManager, type AnalyticsPlatform, AnalyticsResource, AngstromResource, type AngstromVerificationResult, AudiencesResource, type CampaignBriefInput, CampaignsResource, type ConversionPayload, ConversionsResource, type CreateConversionInput, type CreateDisplayCampaignInput, type CreateLinkedInCampaignInput, type CreateMetaCampaignInput, type CreatePmaxCampaignInput, type CreateRedditCampaignInput, type CreateSearchCampaignInput, CreativeResource, type CreativeVariant, DEFAULT_ARTIFACT_BASE_URL, DEFAULT_BASE_URL, type DateRange, type DiagnoseTrackingInput, type EngineVisibilityScore, type GenerateImageInput, type GenerateVideoInput, type GeneratedCampaign, type GetDailySpendInput, type GetPerformanceInput, type GetVisibilityInput, type GrowthSkillId, type GrowthSkillPlaybook, type InspectShieldInput, KeywordsResource, LinkedInResource, type ListCampaignsInput, type ManageAudienceInput, MetaResource, type OptimizationRecommendation, type PauseCampaignInput, type Platform, type PlatformConnection, type PlatformStatus, RedditResource, ShieldResource, SkillsResource, type StageAudienceArtifactInput, type StageAudienceArtifactResult, type SyncAudienceInput, Synter, type SynterConfig, SynterError, SynterValidationError, type TrackingParams, type UTMParameters, type UTMTemplate, type UpdateCampaignBudgetInput, type UploadImageInput, type VerifyAngstromClaimInput, type VisibilityReportResult, VisibilityResource, buildConversionPayload, buildTrackingURL, buildUTMParameters, Synter as default, detectClickId, extractTrackingParams, extractUTMParameters, generateDefaultUTMTemplate, normalizeAdClickEvent, normalizeConversionEvent, normalizeEventName, validateClickId, validateUTMTemplate };
|