@defoai/ads-client 1.4.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.
Files changed (188) hide show
  1. package/README.md +88 -0
  2. package/dist/generated/apis/AdAssetsApi.d.ts +140 -0
  3. package/dist/generated/apis/AdAssetsApi.js +173 -0
  4. package/dist/generated/apis/AdGroupsApi.d.ts +165 -0
  5. package/dist/generated/apis/AdGroupsApi.js +205 -0
  6. package/dist/generated/apis/AdsApi.d.ts +160 -0
  7. package/dist/generated/apis/AdsApi.js +200 -0
  8. package/dist/generated/apis/AssetsApi.d.ts +162 -0
  9. package/dist/generated/apis/AssetsApi.js +203 -0
  10. package/dist/generated/apis/CampaignAssetsApi.d.ts +136 -0
  11. package/dist/generated/apis/CampaignAssetsApi.js +167 -0
  12. package/dist/generated/apis/CampaignsApi.d.ts +169 -0
  13. package/dist/generated/apis/CampaignsApi.js +206 -0
  14. package/dist/generated/apis/KeywordsApi.d.ts +160 -0
  15. package/dist/generated/apis/KeywordsApi.js +200 -0
  16. package/dist/generated/apis/MediaApi.d.ts +50 -0
  17. package/dist/generated/apis/MediaApi.js +51 -0
  18. package/dist/generated/apis/MetaApi.d.ts +86 -0
  19. package/dist/generated/apis/MetaApi.js +104 -0
  20. package/dist/generated/apis/ReportsApi.d.ts +50 -0
  21. package/dist/generated/apis/ReportsApi.js +51 -0
  22. package/dist/generated/apis/SitesApi.d.ts +163 -0
  23. package/dist/generated/apis/SitesApi.js +202 -0
  24. package/dist/generated/apis/SyncApi.d.ts +199 -0
  25. package/dist/generated/apis/SyncApi.js +241 -0
  26. package/dist/generated/apis/index.d.ts +12 -0
  27. package/dist/generated/apis/index.js +14 -0
  28. package/dist/generated/index.d.ts +3 -0
  29. package/dist/generated/index.js +5 -0
  30. package/dist/generated/models/AdAssetCreate.d.ts +83 -0
  31. package/dist/generated/models/AdAssetCreate.js +76 -0
  32. package/dist/generated/models/AdCreate.d.ts +147 -0
  33. package/dist/generated/models/AdCreate.js +97 -0
  34. package/dist/generated/models/AdGroupAudience.d.ts +44 -0
  35. package/dist/generated/models/AdGroupAudience.js +49 -0
  36. package/dist/generated/models/AdGroupCreate.d.ts +104 -0
  37. package/dist/generated/models/AdGroupCreate.js +74 -0
  38. package/dist/generated/models/AdGroupUpdate.d.ts +104 -0
  39. package/dist/generated/models/AdGroupUpdate.js +70 -0
  40. package/dist/generated/models/AdUpdate.d.ts +147 -0
  41. package/dist/generated/models/AdUpdate.js +85 -0
  42. package/dist/generated/models/AssetCreate.d.ts +117 -0
  43. package/dist/generated/models/AssetCreate.js +80 -0
  44. package/dist/generated/models/AssetUpdate.d.ts +79 -0
  45. package/dist/generated/models/AssetUpdate.js +61 -0
  46. package/dist/generated/models/BiddingStrategy.d.ts +70 -0
  47. package/dist/generated/models/BiddingStrategy.js +62 -0
  48. package/dist/generated/models/CampaignAdScheduleField.d.ts +12 -0
  49. package/dist/generated/models/CampaignAdScheduleField.js +4 -0
  50. package/dist/generated/models/CampaignAssetCreate.d.ts +57 -0
  51. package/dist/generated/models/CampaignAssetCreate.js +63 -0
  52. package/dist/generated/models/CampaignCreate.d.ts +161 -0
  53. package/dist/generated/models/CampaignCreate.js +102 -0
  54. package/dist/generated/models/CampaignTargeting.d.ts +50 -0
  55. package/dist/generated/models/CampaignTargeting.js +47 -0
  56. package/dist/generated/models/CampaignUpdate.d.ts +161 -0
  57. package/dist/generated/models/CampaignUpdate.js +98 -0
  58. package/dist/generated/models/CampaignsListCursorParameter.d.ts +26 -0
  59. package/dist/generated/models/CampaignsListCursorParameter.js +31 -0
  60. package/dist/generated/models/ErrorEnvelope.d.ts +33 -0
  61. package/dist/generated/models/ErrorEnvelope.js +44 -0
  62. package/dist/generated/models/ErrorEnvelopeError.d.ts +44 -0
  63. package/dist/generated/models/ErrorEnvelopeError.js +49 -0
  64. package/dist/generated/models/KeywordCreate.d.ts +86 -0
  65. package/dist/generated/models/KeywordCreate.js +73 -0
  66. package/dist/generated/models/KeywordUpdate.d.ts +86 -0
  67. package/dist/generated/models/KeywordUpdate.js +69 -0
  68. package/dist/generated/models/Location.d.ts +61 -0
  69. package/dist/generated/models/Location.js +61 -0
  70. package/dist/generated/models/NegativeKeywordEntry.d.ts +47 -0
  71. package/dist/generated/models/NegativeKeywordEntry.js +55 -0
  72. package/dist/generated/models/ScheduleWindow.d.ts +95 -0
  73. package/dist/generated/models/ScheduleWindow.js +87 -0
  74. package/dist/generated/models/SiteCreate.d.ts +99 -0
  75. package/dist/generated/models/SiteCreate.js +78 -0
  76. package/dist/generated/models/SiteCreateSeoKeywords.d.ts +11 -0
  77. package/dist/generated/models/SiteCreateSeoKeywords.js +12 -0
  78. package/dist/generated/models/SiteCreateTargetGroups.d.ts +11 -0
  79. package/dist/generated/models/SiteCreateTargetGroups.js +12 -0
  80. package/dist/generated/models/SiteLinkEntry.d.ts +50 -0
  81. package/dist/generated/models/SiteLinkEntry.js +47 -0
  82. package/dist/generated/models/SiteUpdate.d.ts +99 -0
  83. package/dist/generated/models/SiteUpdate.js +74 -0
  84. package/dist/generated/models/Sitelink.d.ts +64 -0
  85. package/dist/generated/models/Sitelink.js +51 -0
  86. package/dist/generated/models/StructuredSchedule.d.ts +39 -0
  87. package/dist/generated/models/StructuredSchedule.js +46 -0
  88. package/dist/generated/models/StructuredSnippet.d.ts +38 -0
  89. package/dist/generated/models/StructuredSnippet.js +47 -0
  90. package/dist/generated/models/SuccessEnvelope.d.ts +39 -0
  91. package/dist/generated/models/SuccessEnvelope.js +46 -0
  92. package/dist/generated/models/SuccessEnvelopeMeta.d.ts +39 -0
  93. package/dist/generated/models/SuccessEnvelopeMeta.js +44 -0
  94. package/dist/generated/models/SuccessEnvelopeMetaNextCursor.d.ts +26 -0
  95. package/dist/generated/models/SuccessEnvelopeMetaNextCursor.js +31 -0
  96. package/dist/generated/models/SyncCampaignDetail.d.ts +88 -0
  97. package/dist/generated/models/SyncCampaignDetail.js +71 -0
  98. package/dist/generated/models/SyncPlan.d.ts +35 -0
  99. package/dist/generated/models/SyncPlan.js +43 -0
  100. package/dist/generated/models/SyncPlanPlatformsValue.d.ts +33 -0
  101. package/dist/generated/models/SyncPlanPlatformsValue.js +42 -0
  102. package/dist/generated/models/SyncPlanPlatformsValueTotals.d.ts +44 -0
  103. package/dist/generated/models/SyncPlanPlatformsValueTotals.js +45 -0
  104. package/dist/generated/models/SyncProgress.d.ts +57 -0
  105. package/dist/generated/models/SyncProgress.js +50 -0
  106. package/dist/generated/models/SyncRecord.d.ts +103 -0
  107. package/dist/generated/models/SyncRecord.js +73 -0
  108. package/dist/generated/models/SyncRecordErrorsInner.d.ts +38 -0
  109. package/dist/generated/models/SyncRecordErrorsInner.js +43 -0
  110. package/dist/generated/models/SyncTotals.d.ts +68 -0
  111. package/dist/generated/models/SyncTotals.js +53 -0
  112. package/dist/generated/models/SyncTriggerRequest.d.ts +39 -0
  113. package/dist/generated/models/SyncTriggerRequest.js +44 -0
  114. package/dist/generated/models/SyncTriggerRequestOptions.d.ts +56 -0
  115. package/dist/generated/models/SyncTriggerRequestOptions.js +49 -0
  116. package/dist/generated/models/SyncTriggerResponse.d.ts +59 -0
  117. package/dist/generated/models/SyncTriggerResponse.js +55 -0
  118. package/dist/generated/models/SyncUnlinkRequest.d.ts +44 -0
  119. package/dist/generated/models/SyncUnlinkRequest.js +47 -0
  120. package/dist/generated/models/index.d.ts +45 -0
  121. package/dist/generated/models/index.js +47 -0
  122. package/dist/generated/runtime.d.ts +182 -0
  123. package/dist/generated/runtime.js +318 -0
  124. package/dist/index.d.ts +177 -0
  125. package/dist/index.js +207 -0
  126. package/package.json +32 -0
  127. package/src/generated/apis/AdAssetsApi.ts +342 -0
  128. package/src/generated/apis/AdGroupsApi.ts +408 -0
  129. package/src/generated/apis/AdsApi.ts +399 -0
  130. package/src/generated/apis/AssetsApi.ts +405 -0
  131. package/src/generated/apis/CampaignAssetsApi.ts +330 -0
  132. package/src/generated/apis/CampaignsApi.ts +408 -0
  133. package/src/generated/apis/KeywordsApi.ts +399 -0
  134. package/src/generated/apis/MediaApi.ts +99 -0
  135. package/src/generated/apis/MetaApi.ts +186 -0
  136. package/src/generated/apis/ReportsApi.ts +99 -0
  137. package/src/generated/apis/SitesApi.ts +402 -0
  138. package/src/generated/apis/SyncApi.ts +468 -0
  139. package/src/generated/apis/index.ts +14 -0
  140. package/src/generated/index.ts +5 -0
  141. package/src/generated/models/AdAssetCreate.ts +133 -0
  142. package/src/generated/models/AdCreate.ts +234 -0
  143. package/src/generated/models/AdGroupAudience.ts +83 -0
  144. package/src/generated/models/AdGroupCreate.ts +167 -0
  145. package/src/generated/models/AdGroupUpdate.ts +165 -0
  146. package/src/generated/models/AdUpdate.ts +228 -0
  147. package/src/generated/models/AssetCreate.ts +175 -0
  148. package/src/generated/models/AssetUpdate.ts +125 -0
  149. package/src/generated/models/BiddingStrategy.ts +114 -0
  150. package/src/generated/models/CampaignAdScheduleField.ts +16 -0
  151. package/src/generated/models/CampaignAssetCreate.ts +100 -0
  152. package/src/generated/models/CampaignCreate.ts +263 -0
  153. package/src/generated/models/CampaignTargeting.ts +89 -0
  154. package/src/generated/models/CampaignUpdate.ts +261 -0
  155. package/src/generated/models/CampaignsListCursorParameter.ts +46 -0
  156. package/src/generated/models/ErrorEnvelope.ts +74 -0
  157. package/src/generated/models/ErrorEnvelopeError.ts +83 -0
  158. package/src/generated/models/KeywordCreate.ts +137 -0
  159. package/src/generated/models/KeywordUpdate.ts +135 -0
  160. package/src/generated/models/Location.ts +105 -0
  161. package/src/generated/models/NegativeKeywordEntry.ts +87 -0
  162. package/src/generated/models/ScheduleWindow.ts +146 -0
  163. package/src/generated/models/SiteCreate.ts +173 -0
  164. package/src/generated/models/SiteCreateSeoKeywords.ts +16 -0
  165. package/src/generated/models/SiteCreateTargetGroups.ts +16 -0
  166. package/src/generated/models/SiteLinkEntry.ts +89 -0
  167. package/src/generated/models/SiteUpdate.ts +171 -0
  168. package/src/generated/models/Sitelink.ts +105 -0
  169. package/src/generated/models/StructuredSchedule.ts +82 -0
  170. package/src/generated/models/StructuredSnippet.ts +75 -0
  171. package/src/generated/models/SuccessEnvelope.ts +82 -0
  172. package/src/generated/models/SuccessEnvelopeMeta.ts +81 -0
  173. package/src/generated/models/SuccessEnvelopeMetaNextCursor.ts +46 -0
  174. package/src/generated/models/SyncCampaignDetail.ts +137 -0
  175. package/src/generated/models/SyncPlan.ts +73 -0
  176. package/src/generated/models/SyncPlanPlatformsValue.ts +73 -0
  177. package/src/generated/models/SyncPlanPlatformsValueTotals.ts +81 -0
  178. package/src/generated/models/SyncProgress.ts +105 -0
  179. package/src/generated/models/SyncRecord.ts +174 -0
  180. package/src/generated/models/SyncRecordErrorsInner.ts +73 -0
  181. package/src/generated/models/SyncTotals.ts +113 -0
  182. package/src/generated/models/SyncTriggerRequest.ts +81 -0
  183. package/src/generated/models/SyncTriggerRequestOptions.ts +97 -0
  184. package/src/generated/models/SyncTriggerResponse.ts +108 -0
  185. package/src/generated/models/SyncUnlinkRequest.ts +82 -0
  186. package/src/generated/models/index.ts +47 -0
  187. package/src/generated/runtime.ts +431 -0
  188. package/src/index.ts +229 -0
package/dist/index.js ADDED
@@ -0,0 +1,207 @@
1
+ // Defo Ads — official TypeScript SDK (US-ADS-267).
2
+ //
3
+ // A thin, hand-written façade over the OpenAPI-generated core (./generated). It
4
+ // gives you the ergonomic surface — `new DefoAds({ token }).campaigns.list()` —
5
+ // with bearer auth, a default Space header, cursor auto-pagination, retry-on-429
6
+ // (honoring Retry-After) and typed errors, while the generated core (regenerated
7
+ // from the spec on every release) does the wire work and stays byte-true to the
8
+ // API contract.
9
+ //
10
+ // Quick start:
11
+ // import { DefoAds } from '@defoai/ads-client';
12
+ // const defo = new DefoAds({ token: process.env.DEFOADS_TOKEN!, space: 'spc_…' });
13
+ // const campaigns = await defo.campaigns.list(); // first page
14
+ // for await (const c of defo.campaigns.listAll()) { … } // every page
15
+ // const created = await defo.campaigns.create({ name: 'Launch', budget: 50 });
16
+ import { Configuration, CampaignsApi, AdGroupsApi, AdsApi, KeywordsApi, SitesApi, AssetsApi, CampaignAssetsApi, AdAssetsApi, MediaApi, ReportsApi, SyncApi, MetaApi, } from './generated';
17
+ /** The production base URL. Override via `baseUrl` (e.g. for staging). */
18
+ export const PRODUCTION_BASE_URL = 'https://api.ads.defoai.com';
19
+ export const STAGING_BASE_URL = 'https://api-ads-staging.defoai.com';
20
+ // ---- Typed errors -------------------------------------------------------------
21
+ /** Base error for any non-2xx response; carries the API's `{ code, message, details }`. */
22
+ export class DefoAdsError extends Error {
23
+ constructor(status, code, message, details) {
24
+ super(message);
25
+ this.name = 'DefoAdsError';
26
+ this.status = status;
27
+ this.code = code;
28
+ this.details = details;
29
+ }
30
+ }
31
+ /** 401 — missing/invalid token. */ export class AuthError extends DefoAdsError {
32
+ constructor() {
33
+ super(...arguments);
34
+ this.name = 'AuthError';
35
+ }
36
+ }
37
+ /** 403 — token lacks the required scope or Space membership. */ export class ForbiddenError extends DefoAdsError {
38
+ constructor() {
39
+ super(...arguments);
40
+ this.name = 'ForbiddenError';
41
+ }
42
+ }
43
+ /** 404 — resource not found (or outside your Space). */ export class NotFoundError extends DefoAdsError {
44
+ constructor() {
45
+ super(...arguments);
46
+ this.name = 'NotFoundError';
47
+ }
48
+ }
49
+ /** 409 — conflict (e.g. delete blocked by dependents, or a sync already running). */ export class ConflictError extends DefoAdsError {
50
+ constructor() {
51
+ super(...arguments);
52
+ this.name = 'ConflictError';
53
+ }
54
+ }
55
+ /** 429 — rate limited. The SDK already retried up to `maxRetries`. */ export class RateLimitError extends DefoAdsError {
56
+ constructor() {
57
+ super(...arguments);
58
+ this.name = 'RateLimitError';
59
+ }
60
+ }
61
+ function toTypedError(status, code, message, details) {
62
+ const msg = message || `HTTP ${status}`;
63
+ switch (status) {
64
+ case 401: return new AuthError(status, code, msg, details);
65
+ case 403: return new ForbiddenError(status, code, msg, details);
66
+ case 404: return new NotFoundError(status, code, msg, details);
67
+ case 409: return new ConflictError(status, code, msg, details);
68
+ case 429: return new RateLimitError(status, code, msg, details);
69
+ default: return new DefoAdsError(status, code, msg, details);
70
+ }
71
+ }
72
+ // ---- fetch with retry/backoff (honors Retry-After) ---------------------------
73
+ function retryingFetch(baseFetch, maxRetries) {
74
+ return async (input, init) => {
75
+ const method = (init?.method || 'GET').toUpperCase();
76
+ const idempotent = method === 'GET' || method === 'PUT' || method === 'DELETE';
77
+ let attempt = 0;
78
+ // eslint-disable-next-line no-constant-condition
79
+ while (true) {
80
+ const res = await baseFetch(input, init);
81
+ const retryable = res.status === 429 || (res.status >= 500 && idempotent);
82
+ if (!retryable || attempt >= maxRetries)
83
+ return res;
84
+ const retryAfter = res.headers.get('retry-after');
85
+ const waitMs = retryAfter
86
+ ? Number(retryAfter) * 1000
87
+ : Math.min(2 ** attempt * 500, 8000);
88
+ await new Promise((r) => setTimeout(r, Number.isFinite(waitMs) ? waitMs : 1000));
89
+ attempt += 1;
90
+ }
91
+ };
92
+ }
93
+ // Throw a typed error on any 4xx/5xx, parsing the `ErrorEnvelope`, BEFORE the
94
+ // generated core raises its generic ResponseError.
95
+ const errorMiddleware = {
96
+ post: async ({ response }) => {
97
+ if (response.status >= 400) {
98
+ let code;
99
+ let message = response.statusText;
100
+ let details;
101
+ try {
102
+ const body = await response.clone().json();
103
+ code = body?.error?.code;
104
+ message = body?.error?.message ?? message;
105
+ details = body?.error?.details;
106
+ }
107
+ catch { /* non-JSON error body */ }
108
+ throw toTypedError(response.status, code, message, details);
109
+ }
110
+ return response;
111
+ },
112
+ };
113
+ // ---- generic resource factory ------------------------------------------------
114
+ // Every generated method takes a single request-params object and returns a
115
+ // SuccessEnvelope `{ data, meta }`; the façade unwraps `.data` and threads the
116
+ // default Space + cursor pagination. Input bodies stay fully typed (C/U); list
117
+ // responses are arrays (the envelope's `data` is contract-untyped today).
118
+ const data = (env) => env?.data;
119
+ function crudResource(api, prefix, createKey, updateKey) {
120
+ return {
121
+ /** List one page (default 50, max 200). */
122
+ list: (params = {}) => api[`${prefix}List`]({ ...params }).then(data),
123
+ /** Async-iterate EVERY item across all pages (follows `meta.nextCursor`). */
124
+ async *listAll(params = {}) {
125
+ let cursor = params.cursor;
126
+ do {
127
+ const env = await api[`${prefix}List`]({ ...params, cursor });
128
+ for (const item of env.data ?? [])
129
+ yield item;
130
+ cursor = env.meta?.nextCursor ?? undefined;
131
+ } while (cursor);
132
+ },
133
+ /** Fetch one by id. */
134
+ get: (id) => api[`${prefix}Get`]({ id }).then(data),
135
+ /** Create. */
136
+ create: (body) => api[`${prefix}Create`]({ [createKey]: body }).then(data),
137
+ /** Partial update by id. */
138
+ update: (id, body) => api[`${prefix}Update`]({ id, [updateKey]: body }).then(data),
139
+ /** Delete by id. */
140
+ delete: (id) => api[`${prefix}Delete`]({ id }).then(data),
141
+ };
142
+ }
143
+ /** The Defo Ads client. Construct once, reuse everywhere. */
144
+ export class DefoAds {
145
+ constructor(options) {
146
+ if (!options?.token)
147
+ throw new Error('DefoAds: `token` is required (a dads_… personal access token).');
148
+ const baseFetch = options.fetch ?? globalThis.fetch;
149
+ if (!baseFetch)
150
+ throw new Error('DefoAds: no global fetch — pass `fetch` in options (Node < 18).');
151
+ const config = new Configuration({
152
+ basePath: options.baseUrl ?? PRODUCTION_BASE_URL,
153
+ accessToken: options.token, // → Authorization: Bearer <token>
154
+ headers: options.space ? { 'X-Space-Id': options.space } : {},
155
+ fetchApi: retryingFetch(baseFetch, options.maxRetries ?? 3),
156
+ middleware: [errorMiddleware],
157
+ });
158
+ this.campaigns = crudResource(new CampaignsApi(config), 'campaigns', 'campaignCreate', 'campaignUpdate');
159
+ this.adGroups = crudResource(new AdGroupsApi(config), 'adGroups', 'adGroupCreate', 'adGroupUpdate');
160
+ this.ads = crudResource(new AdsApi(config), 'ads', 'adCreate', 'adUpdate');
161
+ this.keywords = crudResource(new KeywordsApi(config), 'keywords', 'keywordCreate', 'keywordUpdate');
162
+ this.sites = crudResource(new SitesApi(config), 'sites', 'siteCreate', 'siteUpdate');
163
+ this.assets = crudResource(new AssetsApi(config), 'assets', 'assetCreate', 'assetUpdate');
164
+ // Binding-only resources (no full CRUD).
165
+ const campaignAssetsApi = new CampaignAssetsApi(config);
166
+ this.campaignAssets = {
167
+ list: (p = {}) => campaignAssetsApi.campaignAssetsList(p).then(data),
168
+ get: (id) => campaignAssetsApi.campaignAssetsGet({ id }).then(data),
169
+ create: (body) => campaignAssetsApi.campaignAssetsCreate({ campaignAssetCreate: body }).then(data),
170
+ delete: (id) => campaignAssetsApi.campaignAssetsDelete({ id }).then(data),
171
+ };
172
+ const adAssetsApi = new AdAssetsApi(config);
173
+ this.adAssets = {
174
+ list: (p = {}) => adAssetsApi.adAssetsList(p).then(data),
175
+ get: (id) => adAssetsApi.adAssetsGet({ id }).then(data),
176
+ create: (body) => adAssetsApi.adAssetsCreate({ adAssetCreate: body }).then(data),
177
+ delete: (id) => adAssetsApi.adAssetsDelete({ id }).then(data),
178
+ };
179
+ const mediaApi = new MediaApi(config);
180
+ this.media = { matrix: () => mediaApi.mediaMatrix().then(data) };
181
+ const reportsApi = new ReportsApi(config);
182
+ this.reports = {
183
+ /** Performance stats; see the reference for `date_range`, `group_by`, `metrics`, etc. */
184
+ stats: (params = {}) => reportsApi.reportsStats(params).then(data),
185
+ };
186
+ const syncApi = new SyncApi(config);
187
+ this.sync = {
188
+ /** Trigger a sync for the active Space (async — poll `get(syncId)`). */
189
+ trigger: (body = {}) => syncApi.syncTrigger({ syncTriggerRequest: body }).then(data),
190
+ list: (p = {}) => syncApi.syncList(p).then(data),
191
+ /** Dry-run plan (import/export/remove) without executing. */
192
+ plan: (p = {}) => syncApi.syncPlan(p).then(data),
193
+ get: (id) => syncApi.syncGet({ id }).then(data),
194
+ cancel: (id) => syncApi.syncCancel({ id }).then(data),
195
+ /** Unlink campaigns from a platform (keeps the local campaign). */
196
+ unlink: (body) => syncApi.syncUnlink({ syncUnlinkRequest: body }).then(data),
197
+ };
198
+ const metaApi = new MetaApi(config);
199
+ this.meta = {
200
+ /** Introspect the authenticated token. */
201
+ me: () => metaApi.meGet().then(data),
202
+ /** List Spaces the token can access. */
203
+ spaces: () => metaApi.spacesList().then(data),
204
+ };
205
+ }
206
+ }
207
+ export default DefoAds;
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@defoai/ads-client",
3
+ "version": "1.4.0",
4
+ "description": "Official TypeScript SDK for the Defo Ads public API (/api/v1).",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist",
12
+ "src"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ }
19
+ },
20
+ "engines": {
21
+ "node": ">=18"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.json",
25
+ "typecheck": "tsc -p tsconfig.json --noEmit",
26
+ "test": "node --test --import tsx test/*.test.ts"
27
+ },
28
+ "devDependencies": {
29
+ "tsx": "^4.22.4",
30
+ "typescript": "^5.9.3"
31
+ }
32
+ }
@@ -0,0 +1,342 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ * Defo Ads Public API
5
+ * Stable public API for managing campaigns, ads, keywords, and sites.
6
+ *
7
+ * The version of the OpenAPI document: 1.4.0
8
+ *
9
+ *
10
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11
+ * https://openapi-generator.tech
12
+ * Do not edit the class manually.
13
+ */
14
+
15
+
16
+ import * as runtime from '../runtime';
17
+ import type {
18
+ AdAssetCreate,
19
+ CampaignsListCursorParameter,
20
+ ErrorEnvelope,
21
+ SuccessEnvelope,
22
+ } from '../models/index';
23
+ import {
24
+ AdAssetCreateFromJSON,
25
+ AdAssetCreateToJSON,
26
+ CampaignsListCursorParameterFromJSON,
27
+ CampaignsListCursorParameterToJSON,
28
+ ErrorEnvelopeFromJSON,
29
+ ErrorEnvelopeToJSON,
30
+ SuccessEnvelopeFromJSON,
31
+ SuccessEnvelopeToJSON,
32
+ } from '../models/index';
33
+
34
+ export interface AdAssetsCreateRequest {
35
+ adAssetCreate: AdAssetCreate;
36
+ xSpaceId?: string;
37
+ }
38
+
39
+ export interface AdAssetsDeleteRequest {
40
+ id: string;
41
+ xSpaceId?: string;
42
+ }
43
+
44
+ export interface AdAssetsGetRequest {
45
+ id: string;
46
+ xSpaceId?: string;
47
+ }
48
+
49
+ export interface AdAssetsListRequest {
50
+ limit?: number;
51
+ cursor?: CampaignsListCursorParameter;
52
+ adId?: string;
53
+ adGroupId?: string;
54
+ campaignId?: string;
55
+ role?: string;
56
+ xSpaceId?: string;
57
+ }
58
+
59
+ /**
60
+ * AdAssetsApi - interface
61
+ *
62
+ * @export
63
+ * @interface AdAssetsApiInterface
64
+ */
65
+ export interface AdAssetsApiInterface {
66
+ /**
67
+ *
68
+ * @summary Bind an asset to an ad or ad group with a role
69
+ * @param {AdAssetCreate} adAssetCreate
70
+ * @param {string} [xSpaceId] Target Space ID (e.g. &#x60;spc_…&#x60;). Omit to use the caller\&#39;s Personal Space. Invalid Space → 404 SPACE_NOT_FOUND; non-member → 403 NOT_A_MEMBER.
71
+ * @param {*} [options] Override http request option.
72
+ * @throws {RequiredError}
73
+ * @memberof AdAssetsApiInterface
74
+ */
75
+ adAssetsCreateRaw(requestParameters: AdAssetsCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>>;
76
+
77
+ /**
78
+ * Bind an asset to an ad or ad group with a role
79
+ */
80
+ adAssetsCreate(requestParameters: AdAssetsCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope>;
81
+
82
+ /**
83
+ *
84
+ * @summary Remove an ad-asset binding
85
+ * @param {string} id
86
+ * @param {string} [xSpaceId] Target Space ID (e.g. &#x60;spc_…&#x60;). Omit to use the caller\&#39;s Personal Space. Invalid Space → 404 SPACE_NOT_FOUND; non-member → 403 NOT_A_MEMBER.
87
+ * @param {*} [options] Override http request option.
88
+ * @throws {RequiredError}
89
+ * @memberof AdAssetsApiInterface
90
+ */
91
+ adAssetsDeleteRaw(requestParameters: AdAssetsDeleteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>>;
92
+
93
+ /**
94
+ * Remove an ad-asset binding
95
+ */
96
+ adAssetsDelete(requestParameters: AdAssetsDeleteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope>;
97
+
98
+ /**
99
+ *
100
+ * @summary Get ad-asset binding
101
+ * @param {string} id
102
+ * @param {string} [xSpaceId] Target Space ID (e.g. &#x60;spc_…&#x60;). Omit to use the caller\&#39;s Personal Space. Invalid Space → 404 SPACE_NOT_FOUND; non-member → 403 NOT_A_MEMBER.
103
+ * @param {*} [options] Override http request option.
104
+ * @throws {RequiredError}
105
+ * @memberof AdAssetsApiInterface
106
+ */
107
+ adAssetsGetRaw(requestParameters: AdAssetsGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>>;
108
+
109
+ /**
110
+ * Get ad-asset binding
111
+ */
112
+ adAssetsGet(requestParameters: AdAssetsGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope>;
113
+
114
+ /**
115
+ *
116
+ * @summary List ad / ad-group asset bindings (filter by adId/adGroupId/campaignId)
117
+ * @param {number} [limit] Maximum items to return. Default 50, max 200.
118
+ * @param {CampaignsListCursorParameter} [cursor] Opaque pagination cursor returned by the previous page in &#x60;meta.nextCursor&#x60;.
119
+ * @param {string} [adId] Restrict to bindings for a specific ad.
120
+ * @param {string} [adGroupId] Restrict to bindings for a specific ad group.
121
+ * @param {string} [campaignId] All ad/ad-group bindings across a campaign.
122
+ * @param {string} [role] Filter by asset role.
123
+ * @param {string} [xSpaceId] Target Space ID (e.g. &#x60;spc_…&#x60;). Omit to use the caller\&#39;s Personal Space. Invalid Space → 404 SPACE_NOT_FOUND; non-member → 403 NOT_A_MEMBER.
124
+ * @param {*} [options] Override http request option.
125
+ * @throws {RequiredError}
126
+ * @memberof AdAssetsApiInterface
127
+ */
128
+ adAssetsListRaw(requestParameters: AdAssetsListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>>;
129
+
130
+ /**
131
+ * List ad / ad-group asset bindings (filter by adId/adGroupId/campaignId)
132
+ */
133
+ adAssetsList(requestParameters: AdAssetsListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope>;
134
+
135
+ }
136
+
137
+ /**
138
+ *
139
+ */
140
+ export class AdAssetsApi extends runtime.BaseAPI implements AdAssetsApiInterface {
141
+
142
+ /**
143
+ * Bind an asset to an ad or ad group with a role
144
+ */
145
+ async adAssetsCreateRaw(requestParameters: AdAssetsCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>> {
146
+ if (requestParameters['adAssetCreate'] == null) {
147
+ throw new runtime.RequiredError(
148
+ 'adAssetCreate',
149
+ 'Required parameter "adAssetCreate" was null or undefined when calling adAssetsCreate().'
150
+ );
151
+ }
152
+
153
+ const queryParameters: any = {};
154
+
155
+ const headerParameters: runtime.HTTPHeaders = {};
156
+
157
+ headerParameters['Content-Type'] = 'application/json';
158
+
159
+ if (requestParameters['xSpaceId'] != null) {
160
+ headerParameters['X-Space-Id'] = String(requestParameters['xSpaceId']);
161
+ }
162
+
163
+ if (this.configuration && this.configuration.accessToken) {
164
+ const token = this.configuration.accessToken;
165
+ const tokenString = await token("ApiToken", ["ads:write"]);
166
+
167
+ if (tokenString) {
168
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
169
+ }
170
+ }
171
+ const response = await this.request({
172
+ path: `/api/v1/ad-assets`,
173
+ method: 'POST',
174
+ headers: headerParameters,
175
+ query: queryParameters,
176
+ body: AdAssetCreateToJSON(requestParameters['adAssetCreate']),
177
+ }, initOverrides);
178
+
179
+ return new runtime.JSONApiResponse(response, (jsonValue) => SuccessEnvelopeFromJSON(jsonValue));
180
+ }
181
+
182
+ /**
183
+ * Bind an asset to an ad or ad group with a role
184
+ */
185
+ async adAssetsCreate(requestParameters: AdAssetsCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope> {
186
+ const response = await this.adAssetsCreateRaw(requestParameters, initOverrides);
187
+ return await response.value();
188
+ }
189
+
190
+ /**
191
+ * Remove an ad-asset binding
192
+ */
193
+ async adAssetsDeleteRaw(requestParameters: AdAssetsDeleteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>> {
194
+ if (requestParameters['id'] == null) {
195
+ throw new runtime.RequiredError(
196
+ 'id',
197
+ 'Required parameter "id" was null or undefined when calling adAssetsDelete().'
198
+ );
199
+ }
200
+
201
+ const queryParameters: any = {};
202
+
203
+ const headerParameters: runtime.HTTPHeaders = {};
204
+
205
+ if (requestParameters['xSpaceId'] != null) {
206
+ headerParameters['X-Space-Id'] = String(requestParameters['xSpaceId']);
207
+ }
208
+
209
+ if (this.configuration && this.configuration.accessToken) {
210
+ const token = this.configuration.accessToken;
211
+ const tokenString = await token("ApiToken", ["ads:write"]);
212
+
213
+ if (tokenString) {
214
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
215
+ }
216
+ }
217
+ const response = await this.request({
218
+ path: `/api/v1/ad-assets/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
219
+ method: 'DELETE',
220
+ headers: headerParameters,
221
+ query: queryParameters,
222
+ }, initOverrides);
223
+
224
+ return new runtime.JSONApiResponse(response, (jsonValue) => SuccessEnvelopeFromJSON(jsonValue));
225
+ }
226
+
227
+ /**
228
+ * Remove an ad-asset binding
229
+ */
230
+ async adAssetsDelete(requestParameters: AdAssetsDeleteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope> {
231
+ const response = await this.adAssetsDeleteRaw(requestParameters, initOverrides);
232
+ return await response.value();
233
+ }
234
+
235
+ /**
236
+ * Get ad-asset binding
237
+ */
238
+ async adAssetsGetRaw(requestParameters: AdAssetsGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>> {
239
+ if (requestParameters['id'] == null) {
240
+ throw new runtime.RequiredError(
241
+ 'id',
242
+ 'Required parameter "id" was null or undefined when calling adAssetsGet().'
243
+ );
244
+ }
245
+
246
+ const queryParameters: any = {};
247
+
248
+ const headerParameters: runtime.HTTPHeaders = {};
249
+
250
+ if (requestParameters['xSpaceId'] != null) {
251
+ headerParameters['X-Space-Id'] = String(requestParameters['xSpaceId']);
252
+ }
253
+
254
+ if (this.configuration && this.configuration.accessToken) {
255
+ const token = this.configuration.accessToken;
256
+ const tokenString = await token("ApiToken", ["ads:read"]);
257
+
258
+ if (tokenString) {
259
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
260
+ }
261
+ }
262
+ const response = await this.request({
263
+ path: `/api/v1/ad-assets/{id}`.replace(`{${"id"}}`, encodeURIComponent(String(requestParameters['id']))),
264
+ method: 'GET',
265
+ headers: headerParameters,
266
+ query: queryParameters,
267
+ }, initOverrides);
268
+
269
+ return new runtime.JSONApiResponse(response, (jsonValue) => SuccessEnvelopeFromJSON(jsonValue));
270
+ }
271
+
272
+ /**
273
+ * Get ad-asset binding
274
+ */
275
+ async adAssetsGet(requestParameters: AdAssetsGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope> {
276
+ const response = await this.adAssetsGetRaw(requestParameters, initOverrides);
277
+ return await response.value();
278
+ }
279
+
280
+ /**
281
+ * List ad / ad-group asset bindings (filter by adId/adGroupId/campaignId)
282
+ */
283
+ async adAssetsListRaw(requestParameters: AdAssetsListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SuccessEnvelope>> {
284
+ const queryParameters: any = {};
285
+
286
+ if (requestParameters['limit'] != null) {
287
+ queryParameters['limit'] = requestParameters['limit'];
288
+ }
289
+
290
+ if (requestParameters['cursor'] != null) {
291
+ queryParameters['cursor'] = requestParameters['cursor'];
292
+ }
293
+
294
+ if (requestParameters['adId'] != null) {
295
+ queryParameters['adId'] = requestParameters['adId'];
296
+ }
297
+
298
+ if (requestParameters['adGroupId'] != null) {
299
+ queryParameters['adGroupId'] = requestParameters['adGroupId'];
300
+ }
301
+
302
+ if (requestParameters['campaignId'] != null) {
303
+ queryParameters['campaignId'] = requestParameters['campaignId'];
304
+ }
305
+
306
+ if (requestParameters['role'] != null) {
307
+ queryParameters['role'] = requestParameters['role'];
308
+ }
309
+
310
+ const headerParameters: runtime.HTTPHeaders = {};
311
+
312
+ if (requestParameters['xSpaceId'] != null) {
313
+ headerParameters['X-Space-Id'] = String(requestParameters['xSpaceId']);
314
+ }
315
+
316
+ if (this.configuration && this.configuration.accessToken) {
317
+ const token = this.configuration.accessToken;
318
+ const tokenString = await token("ApiToken", ["ads:read"]);
319
+
320
+ if (tokenString) {
321
+ headerParameters["Authorization"] = `Bearer ${tokenString}`;
322
+ }
323
+ }
324
+ const response = await this.request({
325
+ path: `/api/v1/ad-assets`,
326
+ method: 'GET',
327
+ headers: headerParameters,
328
+ query: queryParameters,
329
+ }, initOverrides);
330
+
331
+ return new runtime.JSONApiResponse(response, (jsonValue) => SuccessEnvelopeFromJSON(jsonValue));
332
+ }
333
+
334
+ /**
335
+ * List ad / ad-group asset bindings (filter by adId/adGroupId/campaignId)
336
+ */
337
+ async adAssetsList(requestParameters: AdAssetsListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SuccessEnvelope> {
338
+ const response = await this.adAssetsListRaw(requestParameters, initOverrides);
339
+ return await response.value();
340
+ }
341
+
342
+ }