adside 0.1.0 → 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/dist/public.mjs +3 -3
- package/package.json +1 -1
package/dist/public.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as e}from"commander";import{createHash as t,randomBytes as n,randomUUID as r}from"node:crypto";import{chmod as i,mkdir as a,open as o,readFile as s,rename as c,rm as l,stat as u,utimes as d,writeFile as f}from"node:fs/promises";import{createWriteStream as p,openAsBlob as m}from"node:fs";import h from"node:path";import{pipeline as g}from"node:stream/promises";import{spawn as _}from"node:child_process";import{createInterface as v}from"node:readline/promises";import y from"node:os";import{createServer as b}from"node:http";async function x(e,t,n){let r=e.commands.find(e=>e.id===t);if(!r||r.transport.type!==`rest`)throw Error(`Missing REST contract: ${t}`);let i=await e.callRest(r.transport.method,r.transport.path,n,{auth:r.transport.auth,parameters:r.options,contentType:r.transport.requestContentType});if(i.kind!==`json`)throw Error(`Expected JSON from ${t}`);return S(i.data)}function S(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Invalid API response`);return e}function C(e){if(typeof e!=`string`||!e)throw Error(`Invalid API response`);return e}const ee={".csv":`text/csv`,".xlsx":`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".webp":`image/webp`,".gif":`image/gif`,".mp4":`video/mp4`,".mov":`video/quicktime`,".webm":`video/webm`,".zip":`application/zip`};async function w(e,t,n,r,i=`library`){let a=r??ee[h.extname(n).toLowerCase()];if(!a)throw Error(`Cannot infer the media type; supply --content-type`);let o=await m(n,{type:a}),s=await x(e,`assets.uploads.create`,{workspaceId:t,filename:h.basename(n),contentType:a,sizeBytes:o.size,purpose:i}),c=C(s.assetId),l=new URL(C(s.uploadUrl));if(l.protocol!==`https:`||l.username||l.password)throw Error(`Upload ticket must use HTTPS`);let u=Object.fromEntries(Object.entries(S(s.headers)).map(([e,t])=>[e,C(t)])),d=await fetch(l,{method:`PUT`,headers:u,body:o,redirect:`error`});if(!d.ok)throw Error(`Asset ${c}: upload failed (HTTP ${d.status})`);await d.body?.cancel();try{return await x(e,`assets.uploads.complete`,{workspaceId:t,assetId:c})}catch(e){throw Error(`Upload stored; retry adside assets uploads complete --workspace-id ${t} --asset-id ${c}: ${e instanceof Error?e.message:`finalization failed`}`)}}async function te(e,t,n,r){return await T(C(S((await x(e,`assets.get`,{workspaceId:t,assetId:n})).asset).url),r),{assetId:n,saved_to:r}}async function T(e,t){let n=new URL(e);if(n.protocol!==`https:`||n.username||n.password)throw Error(`Asset download URL must use HTTPS`);let r=await fetch(n,{redirect:`error`});if(!r.ok||!r.body)throw Error(`Download failed (HTTP ${r.status})`);await g(ne(r.body),p(t,{flags:`wx`}))}async function*ne(e){let t=e.getReader();try{for(;;){let{value:e,done:n}=await t.read();if(n)return;yield e}}finally{await t.cancel(),t.releaseLock()}}const re={".pdf":`application/pdf`,".docx":`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,".pptx":`application/vnd.openxmlformats-officedocument.presentationml.presentation`,".md":`text/markdown`,".txt":`text/plain`,".eml":`message/rfc822`,".zip":`application/zip`};async function ie(e,t,n,r={}){let i=r.contentType??re[h.extname(n).toLowerCase()];if(!i)throw Error(`Cannot infer the document type; supply --content-type`);let a=await m(n,{type:i}),o=`organizationId`in t,s=await x(e,o?`brain.orgUpload`:`brain.upload`,{...t,filename:h.basename(n),contentType:i,sizeBytes:a.size}),c=new URL(C(s.uploadUrl));if(c.protocol!==`https:`||c.username||c.password)throw Error(`Upload ticket must use HTTPS`);let l=Object.fromEntries(Object.entries(S(s.headers)).map(([e,t])=>[e,C(t)])),u=await fetch(c,{method:`PUT`,headers:l,body:a,redirect:`error`});if(!u.ok)throw Error(`Document upload failed (HTTP ${u.status})`);let d=S(await u.json());return x(e,o?`brain.orgIngest`:`brain.ingest`,{...t,tier:o?`org`:`workspace`,instructions:r.instructions,registration:{kind:`blob`,blobUrl:C(d.url),blobPathname:C(s.pathname),filename:h.basename(n),mimeType:i,sizeBytes:a.size}})}const ae=`0.1.0`;async function oe(e,t){if(process.env.ADSIDE_AUTH===`proxy`)return{fromLogin:!1};if(process.env.ADSIDE_CREDENTIAL_FILE){let e=JSON.parse(await s(process.env.ADSIDE_CREDENTIAL_FILE,`utf8`));if(typeof e.token!=`string`||!e.token)throw Error(`Invalid Adside execution credential file`);return{token:e.token,fromLogin:!1}}if(e.apiKey)return{token:e.apiKey,fromLogin:!1};if(e.login)return{token:await e.login.accessToken(),fromLogin:!0};throw Error(e.missingCredentialMessage??`ADSIDE_API_KEY is required for this command (${t})`)}function E(e,t){return{commands:t,async callRest(t,n,r={},i={}){let{token:a,fromLogin:o}=await oe(e,i.auth??`user`),s=new URLSearchParams,c={},l={Accept:`application/json`,"User-Agent":`adside-cli/${ae}`};for(let[e,a]of Object.entries(r)){if(a===void 0)continue;let r=i.parameters?.find(t=>t.name===e)?.location??(t===`GET`?`query`:`body`);if(r===`path`){if(typeof a!=`string`&&typeof a!=`number`||[`.`,`..`].includes(String(a)))throw Error(`Invalid path parameter ${e}`);n=n.replaceAll(`{${e}}`,encodeURIComponent(String(a)))}else if(r===`query`)for(let t of Array.isArray(a)?a:[a])s.append(e,typeof t==`object`?JSON.stringify(t):String(t));else if(r===`header`){if([`authorization`,`host`,`cookie`,`content-length`,`x-adside-user-id`,`x-adside-organization-id`,`x-adside-workspace-id`,`x-adside-execution-id`,`x-adside-tool-policy`,`x-adside-routine-task-id`,`x-adside-bulk-upload-job-id`,`x-adside-approved-operation`].includes(e.toLowerCase()))throw Error(`Reserved header ${e}`);l[e]=String(a)}else c[e]=a}if(/\{[^}]+\}/.test(n))throw Error(`Missing path parameter in ${n}`);let u=new URL(n,e.apiGatewayUrl);if(u.origin!==new URL(e.apiGatewayUrl).origin)throw Error(`REST endpoint must use the configured API origin`);for(let[e,t]of s)u.searchParams.append(e,t);let d;if(t!==`GET`&&Object.keys(c).length)if(i.contentType===`multipart/form-data`){let e=new FormData;for(let[t,n]of Object.entries(c))if(i.fileFields?.includes(t)){let r=String(n);e.append(t,await m(r,{type:typeof c.mime_type==`string`?c.mime_type:`application/octet-stream`}),h.basename(r))}else e.append(t,typeof n==`object`?JSON.stringify(n):String(n));d=e}else l[`Content-Type`]=`application/json`,d=JSON.stringify(c);let f=e=>fetch(u,{method:t,headers:e?{...l,Authorization:`Bearer ${e}`}:l,body:d,redirect:`error`}),p=await f(a);if(p.status===401&&o&&a&&e.login&&(await p.body?.cancel(),p=await f(await e.login.refreshAfterRejection(a))),!p.ok)throw await ce(p);let g=p.headers.get(`content-type`);return p.status===204?{kind:`json`,data:null,contentType:g,status:p.status}:g?.includes(`json`)?{kind:`json`,data:await p.json(),contentType:g,status:p.status}:g?.startsWith(`text/`)?{kind:`text`,data:await p.text(),contentType:g,status:p.status}:{kind:`binary`,data:new Uint8Array(await p.arrayBuffer()),contentType:g,status:p.status}}}}var se=class extends Error{constructor(e,t){super(e),this.status=t,this.name=`ApiHttpError`}};async function ce(e){let t=await e.text(),n=t,r;try{let e=JSON.parse(t);r=typeof e.confirmationToken==`string`?e.confirmationToken:void 0,n=[e.code,e.error??e.message??e.summary,e.details&&JSON.stringify(e.details)].filter(Boolean).join(`: `)}catch{}return new se(`HTTP ${e.status}: ${n.slice(0,2e3)||e.statusText}`+(r?`\nconfirmationToken=${r}`:``),e.status)}function le(e){return{apiKey:process.env.ADSIDE_API_KEY,workspaceId:process.env.ADSIDE_WORKSPACE_ID||void 0,apiGatewayUrl:ue(process.env.API_GATEWAY_URL||`https://api.adside.ai`),output:de(e)}}function ue(e){return e.replace(/\/+$/,``)}function de(e){if(!e||e===`json`)return`json`;if(e===`text`)return`text`;throw Error(`Invalid output format "${e}". Use "json" or "text".`)}const D={name:`referenceFile`,flag:`--reference-file`,value:`<file>`,repeatable:!0,description:`Upload a local image, video or .zip as a creative reference (repeatable)`},O={name:`wait`,flag:`--wait`,description:`Wait for the job to finish, 30 s per request, up to --wait-timeout`},k={name:`waitTimeout`,flag:`--wait-timeout`,value:`<duration>`,description:`How long --wait may take: 90s, 14m or seconds (default 15m)`},A={name:`out`,flag:`--out`,value:`<file>`,description:`Download the finished output to a new file (never overwrites one)`},fe={name:`inputReference`,flag:`--input-reference`,value:`<ref>`,repeatable:!0,description:`A reference image: a local file (uploaded), an https URL or an asset ID (repeatable)`},pe={name:`firstFrame`,flag:`--first-frame`,value:`<ref>`,description:`The clip's first frame: a local file (uploaded), an https URL or an asset ID`},me={name:`lastFrame`,flag:`--last-frame`,value:`<ref>`,description:`The clip's last frame, with --first-frame, for a model that takes one: a local file (uploaded), an https URL or an asset ID`},he={"creatives.create":[D],"creatives.edit":[D],"creatives.add":[D],"creatives.messages.create":[D],"media.images.generate":[fe,O,k,A],"media.images.get":[O,k,A],"media.videos.generate":[pe,me,O,k,A],"media.videos.get":[O,k,A]};function ge(e){return he[e]??[]}const j={completed:0,error:1,ended:2,stillRunning:3},M=new Set([`completed`,`failed`,`cancelled`,`expired`]);function _e(e){let t=/^(\d+(?:\.\d+)?)(s|m|h)?$/.exec(e.trim());if(!t)throw Error(`Invalid --wait-timeout "${e}": use 90s, 14m or a number of seconds`);let n={s:1e3,m:6e4,h:36e5}[t[2]??`s`]??1e3;return Math.round(Number(t[1])*n)}async function N(e,t){if(await t.isFile(e)){let n=await t.upload(e);return t.stderr(`inputAssetId=${n}`),{type:`asset`,assetId:n}}return/^https:\/\//i.test(e)?{type:`image_url`,imageUrl:{url:e}}:{type:`asset`,assetId:e}}async function ve(e,t,n){let r=t.inputReference??[];if(r.length){if(e.inputReferences!==void 0)throw Error(`Use --input-reference or --input-references, not both`);let t=[];for(let e of r)t.push(await N(e,n));e.inputReferences=t}if(t.firstFrame!==void 0||t.lastFrame!==void 0){if(e.frameImages!==void 0)throw Error(`Use --first-frame and --last-frame or --frame-images, not both`);let r=[];t.firstFrame!==void 0&&r.push({...await N(t.firstFrame,n),frameType:`first_frame`}),t.lastFrame!==void 0&&r.push({...await N(t.lastFrame,n),frameType:`last_frame`}),e.frameImages=r}}function ye(e){return e instanceof se&&e.status>=500||e instanceof TypeError}async function P(e,t){for(let n=0;;n++)try{return await t()}catch(t){if(n>=3||!ye(t))throw t;e.stderr(`retrying (${n+1}/3): ${t instanceof Error?t.message:String(t)}`),await e.sleep(1e3*2**n)}}function be(e){if(e&&typeof e==`object`&&`id`in e&&typeof e.id==`string`&&`status`in e&&typeof e.status==`string`){let t=`outputs`in e&&Array.isArray(e.outputs)?e.outputs:[];return{id:e.id,status:e.status,outputs:t}}throw Error(`The API answered without a media job`)}function xe(e,t){return e===`completed`?j.completed:M.has(e)?j.ended:t?j.stillRunning:j.completed}function Se(e){return/^media\.(images|videos)\.(generate|get)$/.test(e)}function F(e){return/^[\w@%+=:,./-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function Ce(e,t,n,r){let[,i]=e.split(`.`);return[`adside media ${i} get`,...typeof t==`string`?[`--workspace-id ${F(t)}`]:[],`--job-id ${F(n)} --wait`,...r===void 0?[]:[`--out ${F(r)}`]].join(` `)}async function we(e,t,n,r){let i=e.endsWith(`.generate`),a=e.replace(/\.generate$/,`.get`);if(n.waitTimeout!==void 0&&!n.wait)throw Error(`--wait-timeout needs --wait`);if(n.out!==void 0&&i&&!n.wait)throw Error(`--out needs --wait on generate, or use get`);if(!i&&(n.inputReference?.length||n.firstFrame!==void 0))throw Error(`Input flags go with generate`);if(n.out!==void 0&&await r.isFile(n.out))throw Error(`${n.out} already exists; choose a new file for --out`);i&&await ve(t,n,r);let o=r.now()+(n.waitTimeout?_e(n.waitTimeout):9e5),s=()=>Math.max(0,Math.min(30,Math.floor((o-r.now())/1e3))),c={...t,...n.wait?{waitSeconds:s()}:{}},l=await P(r,()=>r.call(e,c)),u=be(l);for(;n.wait&&!M.has(u.status)&&r.now()<o;){let e=s();if(e<1)break;l=await P(r,()=>r.call(a,{workspaceId:t.workspaceId,jobId:u.id,waitSeconds:e})),u=be(l)}let d=xe(u.status,!!n.wait);if(n.out!==void 0){let e=u.outputs?.[0]?.url;if(u.status!==`completed`)r.stderr(`job ${u.id} is ${u.status}; nothing saved to ${n.out}`);else if(typeof e!=`string`)r.stderr(`job ${u.id} completed without an output to download`),d=j.error;else try{await r.download(e,n.out),r.stderr(`saved_to=${n.out}`)}catch(e){r.stderr(`download failed: ${e instanceof Error?e.message:String(e)}`),d=j.error}}return n.wait&&!M.has(u.status)&&r.stderr(`job ${u.id} is still ${u.status}; to keep waiting without paying again, run: ${Ce(e,t.workspaceId,u.id,n.out)}`),{job:l,exitCode:d}}const Te=new Set([`credits.ledger`]);function Ee(t,n){let r=new e;r.name(`adside`).description(`Adside product and advertising-platform commands`).version(`${ae} (contracts ${t.contractHash.slice(0,12)})`).option(`--output <format>`,`Output format: json or text`,`json`),ke(r,t.commands,n),De(r,t.commands,n),n?.register(r,t.commands),r.parseAsync(process.argv).catch(We)}function I(e,t){let n=le(e);return t?t.configure(n):Promise.resolve(n)}async function L(e){return process.env.ADSIDE_WORKSPACE_ID||(await e?.defaults())?.workspaceId}function De(e,t,n){let r=e.commands.find(e=>e.name()===`assets`);for(let e of[`upload`,`download`]){let i=r.command(e).description(e===`upload`?`Upload a local media file and publish it in the asset library`:`Download an asset to a new local file`).option(`--workspace-id <id>`,`Workspace (defaults to ADSIDE_WORKSPACE_ID)`);e===`upload`?i.requiredOption(`--file <file>`,`Local media or tabular file`).option(`--purpose <purpose>`,`library or attachment (CSV/XLSX audience input)`,`library`).option(`--content-type <type>`,`Media MIME type (inferred from extension by default)`):i.requiredOption(`--asset-id <id>`,`Asset to download`).requiredOption(`--out <file>`,`Destination file (must not exist)`),i.action(async()=>{let r=i.optsWithGlobals(),a=R(r.output),o=E(await I(a,n),t),s=z(r.workspaceId??await L(n),`--workspace-id`);V(e===`upload`?await w(o,s,z(r.file,`--file`),B(r.contentType),Oe(r.purpose)):await te(o,s,z(r.assetId,`--asset-id`),z(r.out,`--out`)),a)})}let i=e.commands.find(e=>e.name()===`brain`).command(`upload`).description(`Upload a local document and start Brain ingestion`).requiredOption(`--file <file>`,`PDF, DOCX, PPTX, Markdown, text, email or ZIP`).option(`--workspace-id <id>`,`Workspace (defaults to ADSIDE_WORKSPACE_ID)`).option(`--organization-id <id>`,`Write to the organization Brain instead (admin required)`).option(`--content-type <type>`,`Document MIME type`).option(`--instructions <text>`,`Filing instructions`);i.action(async()=>{let e=i.optsWithGlobals(),r=R(e.output),a=e.organizationId?{organizationId:z(e.organizationId,`--organization-id`)}:{workspaceId:z(e.workspaceId??await L(n),`--workspace-id`)};V(await ie(E(await I(r,n),t),a,z(e.file,`--file`),{contentType:B(e.contentType),instructions:B(e.instructions)}),r)})}function Oe(e){if(e===`library`||e===`attachment`)return e;throw Error(`--purpose must be library or attachment`)}function ke(e,t,n){let i=new Map;for(let a of t)for(let o of[a.path,...a.aliases??[]]){let c={...a,path:o},l=Ae(e,i,c);l.description(c.summary),c.description&&l.addHelpText(`after`,`\n${c.description}\n`),l.option(`--input-file <file>`,`Read a JSON object of parameters from a file`),l.option(`--json <json>`,`Provide parameters as a JSON object`);let u=ge(c.id);for(let e of u)je(l,e);let d=u.some(e=>e.name===`referenceFile`);for(let e of c.options)Ne(l,e);if(c.output.kind!==`json`&&l.option(`--out <file>`,`Write the response body to a file`),c.examples.length>0){let e=c.examples.map(e=>` ${e.description}\n ${e.command}`).join(`
|
|
2
|
+
import{Command as e}from"commander";import{createHash as t,randomBytes as n,randomUUID as r}from"node:crypto";import{chmod as i,mkdir as a,open as o,readFile as s,rename as c,rm as l,stat as u,utimes as d,writeFile as f}from"node:fs/promises";import{createWriteStream as p,openAsBlob as m}from"node:fs";import h from"node:path";import{pipeline as g}from"node:stream/promises";import{spawn as _}from"node:child_process";import{createInterface as v}from"node:readline/promises";import y from"node:os";import{createServer as b}from"node:http";async function x(e,t,n){let r=e.commands.find(e=>e.id===t);if(!r||r.transport.type!==`rest`)throw Error(`Missing REST contract: ${t}`);let i=await e.callRest(r.transport.method,r.transport.path,n,{auth:r.transport.auth,parameters:r.options,contentType:r.transport.requestContentType});if(i.kind!==`json`)throw Error(`Expected JSON from ${t}`);return S(i.data)}function S(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Invalid API response`);return e}function C(e){if(typeof e!=`string`||!e)throw Error(`Invalid API response`);return e}const ee={".csv":`text/csv`,".xlsx":`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".webp":`image/webp`,".gif":`image/gif`,".mp4":`video/mp4`,".mov":`video/quicktime`,".webm":`video/webm`,".zip":`application/zip`};async function w(e,t,n,r,i=`library`){let a=r??ee[h.extname(n).toLowerCase()];if(!a)throw Error(`Cannot infer the media type; supply --content-type`);let o=await m(n,{type:a}),s=await x(e,`assets.uploads.create`,{workspaceId:t,filename:h.basename(n),contentType:a,sizeBytes:o.size,purpose:i}),c=C(s.assetId),l=new URL(C(s.uploadUrl));if(l.protocol!==`https:`||l.username||l.password)throw Error(`Upload ticket must use HTTPS`);let u=Object.fromEntries(Object.entries(S(s.headers)).map(([e,t])=>[e,C(t)])),d=await fetch(l,{method:`PUT`,headers:u,body:o,redirect:`error`});if(!d.ok)throw Error(`Asset ${c}: upload failed (HTTP ${d.status})`);await d.body?.cancel();try{return await x(e,`assets.uploads.complete`,{workspaceId:t,assetId:c})}catch(e){throw Error(`Upload stored; retry adside assets uploads complete --workspace-id ${t} --asset-id ${c}: ${e instanceof Error?e.message:`finalization failed`}`)}}async function te(e,t,n,r){return await T(C(S((await x(e,`assets.get`,{workspaceId:t,assetId:n})).asset).url),r),{assetId:n,saved_to:r}}async function T(e,t){let n=new URL(e);if(n.protocol!==`https:`||n.username||n.password)throw Error(`Asset download URL must use HTTPS`);let r=await fetch(n,{redirect:`error`});if(!r.ok||!r.body)throw Error(`Download failed (HTTP ${r.status})`);await g(ne(r.body),p(t,{flags:`wx`}))}async function*ne(e){let t=e.getReader();try{for(;;){let{value:e,done:n}=await t.read();if(n)return;yield e}}finally{await t.cancel(),t.releaseLock()}}const re={".pdf":`application/pdf`,".docx":`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,".pptx":`application/vnd.openxmlformats-officedocument.presentationml.presentation`,".md":`text/markdown`,".txt":`text/plain`,".eml":`message/rfc822`,".zip":`application/zip`};async function ie(e,t,n,r={}){let i=r.contentType??re[h.extname(n).toLowerCase()];if(!i)throw Error(`Cannot infer the document type; supply --content-type`);let a=await m(n,{type:i}),o=`organizationId`in t,s=await x(e,o?`brain.orgUpload`:`brain.upload`,{...t,filename:h.basename(n),contentType:i,sizeBytes:a.size}),c=new URL(C(s.uploadUrl));if(c.protocol!==`https:`||c.username||c.password)throw Error(`Upload ticket must use HTTPS`);let l=Object.fromEntries(Object.entries(S(s.headers)).map(([e,t])=>[e,C(t)])),u=await fetch(c,{method:`PUT`,headers:l,body:a,redirect:`error`});if(!u.ok)throw Error(`Document upload failed (HTTP ${u.status})`);let d=S(await u.json());return x(e,o?`brain.orgIngest`:`brain.ingest`,{...t,tier:o?`org`:`workspace`,instructions:r.instructions,registration:{kind:`blob`,blobUrl:C(d.url),blobPathname:C(s.pathname),filename:h.basename(n),mimeType:i,sizeBytes:a.size}})}const ae=`0.2.0`;async function oe(e,t){if(process.env.ADSIDE_AUTH===`proxy`)return{fromLogin:!1};if(process.env.ADSIDE_CREDENTIAL_FILE){let e=JSON.parse(await s(process.env.ADSIDE_CREDENTIAL_FILE,`utf8`));if(typeof e.token!=`string`||!e.token)throw Error(`Invalid Adside execution credential file`);return{token:e.token,fromLogin:!1}}if(e.apiKey)return{token:e.apiKey,fromLogin:!1};if(e.login)return{token:await e.login.accessToken(),fromLogin:!0};throw Error(e.missingCredentialMessage??`ADSIDE_API_KEY is required for this command (${t})`)}function E(e,t){return{commands:t,async callRest(t,n,r={},i={}){let{token:a,fromLogin:o}=await oe(e,i.auth??`user`),s=new URLSearchParams,c={},l={Accept:`application/json`,"User-Agent":`adside-cli/${ae}`};for(let[e,a]of Object.entries(r)){if(a===void 0)continue;let r=i.parameters?.find(t=>t.name===e)?.location??(t===`GET`?`query`:`body`);if(r===`path`){if(typeof a!=`string`&&typeof a!=`number`||[`.`,`..`].includes(String(a)))throw Error(`Invalid path parameter ${e}`);n=n.replaceAll(`{${e}}`,encodeURIComponent(String(a)))}else if(r===`query`)for(let t of Array.isArray(a)?a:[a])s.append(e,typeof t==`object`?JSON.stringify(t):String(t));else if(r===`header`){if([`authorization`,`host`,`cookie`,`content-length`,`x-adside-user-id`,`x-adside-organization-id`,`x-adside-workspace-id`,`x-adside-execution-id`,`x-adside-tool-policy`,`x-adside-routine-task-id`,`x-adside-bulk-upload-job-id`,`x-adside-approved-operation`].includes(e.toLowerCase()))throw Error(`Reserved header ${e}`);l[e]=String(a)}else c[e]=a}if(/\{[^}]+\}/.test(n))throw Error(`Missing path parameter in ${n}`);let u=new URL(n,e.apiGatewayUrl);if(u.origin!==new URL(e.apiGatewayUrl).origin)throw Error(`REST endpoint must use the configured API origin`);for(let[e,t]of s)u.searchParams.append(e,t);let d;if(t!==`GET`&&Object.keys(c).length)if(i.contentType===`multipart/form-data`){let e=new FormData;for(let[t,n]of Object.entries(c))if(i.fileFields?.includes(t)){let r=String(n);e.append(t,await m(r,{type:typeof c.mime_type==`string`?c.mime_type:`application/octet-stream`}),h.basename(r))}else e.append(t,typeof n==`object`?JSON.stringify(n):String(n));d=e}else l[`Content-Type`]=`application/json`,d=JSON.stringify(c);let f=e=>fetch(u,{method:t,headers:e?{...l,Authorization:`Bearer ${e}`}:l,body:d,redirect:`error`}),p=await f(a);if(p.status===401&&o&&a&&e.login&&(await p.body?.cancel(),p=await f(await e.login.refreshAfterRejection(a))),!p.ok)throw await ce(p);let g=p.headers.get(`content-type`);return p.status===204?{kind:`json`,data:null,contentType:g,status:p.status}:g?.includes(`json`)?{kind:`json`,data:await p.json(),contentType:g,status:p.status}:g?.startsWith(`text/`)?{kind:`text`,data:await p.text(),contentType:g,status:p.status}:{kind:`binary`,data:new Uint8Array(await p.arrayBuffer()),contentType:g,status:p.status}}}}var se=class extends Error{constructor(e,t){super(e),this.status=t,this.name=`ApiHttpError`}};async function ce(e){let t=await e.text(),n=t,r;try{let e=JSON.parse(t);r=typeof e.confirmationToken==`string`?e.confirmationToken:void 0,n=[e.code,e.error??e.message??e.summary,e.details&&JSON.stringify(e.details)].filter(Boolean).join(`: `)}catch{}return new se(`HTTP ${e.status}: ${n.slice(0,2e3)||e.statusText}`+(r?`\nconfirmationToken=${r}`:``),e.status)}function le(e){return{apiKey:process.env.ADSIDE_API_KEY,workspaceId:process.env.ADSIDE_WORKSPACE_ID||void 0,apiGatewayUrl:ue(process.env.API_GATEWAY_URL||`https://api.adside.ai`),output:de(e)}}function ue(e){return e.replace(/\/+$/,``)}function de(e){if(!e||e===`json`)return`json`;if(e===`text`)return`text`;throw Error(`Invalid output format "${e}". Use "json" or "text".`)}const D={name:`referenceFile`,flag:`--reference-file`,value:`<file>`,repeatable:!0,description:`Upload a local image, video or .zip as a creative reference (repeatable)`},O={name:`wait`,flag:`--wait`,description:`Wait for the job to finish, 30 s per request, up to --wait-timeout`},k={name:`waitTimeout`,flag:`--wait-timeout`,value:`<duration>`,description:`How long --wait may take: 90s, 14m or seconds (default 15m)`},A={name:`out`,flag:`--out`,value:`<file>`,description:`Download the finished output to a new file (never overwrites one)`},fe={name:`inputReference`,flag:`--input-reference`,value:`<ref>`,repeatable:!0,description:`A reference image: a local file (uploaded), an https URL or an asset ID (repeatable)`},pe={name:`firstFrame`,flag:`--first-frame`,value:`<ref>`,description:`The clip's first frame: a local file (uploaded), an https URL or an asset ID`},me={name:`lastFrame`,flag:`--last-frame`,value:`<ref>`,description:`The clip's last frame, with --first-frame, for a model that takes one: a local file (uploaded), an https URL or an asset ID`},he={"creatives.create":[D],"creatives.edit":[D],"creatives.add":[D],"creatives.messages.create":[D],"media.images.generate":[fe,O,k,A],"media.images.get":[O,k,A],"media.videos.generate":[pe,me,O,k,A],"media.videos.get":[O,k,A],"media.speech.generate":[O,k,A],"media.speech.get":[O,k,A],"media.sounds.generate":[O,k,A],"media.sounds.get":[O,k,A],"media.music.generate":[O,k,A],"media.music.get":[O,k,A]};function ge(e){return he[e]??[]}const j={completed:0,error:1,ended:2,stillRunning:3},M=new Set([`completed`,`failed`,`cancelled`,`expired`]);function _e(e){let t=/^(\d+(?:\.\d+)?)(s|m|h)?$/.exec(e.trim());if(!t)throw Error(`Invalid --wait-timeout "${e}": use 90s, 14m or a number of seconds`);let n={s:1e3,m:6e4,h:36e5}[t[2]??`s`]??1e3;return Math.round(Number(t[1])*n)}async function N(e,t){if(await t.isFile(e)){let n=await t.upload(e);return t.stderr(`inputAssetId=${n}`),{type:`asset`,assetId:n}}return/^https:\/\//i.test(e)?{type:`image_url`,imageUrl:{url:e}}:{type:`asset`,assetId:e}}async function ve(e,t,n){let r=t.inputReference??[];if(r.length){if(e.inputReferences!==void 0)throw Error(`Use --input-reference or --input-references, not both`);let t=[];for(let e of r)t.push(await N(e,n));e.inputReferences=t}if(t.firstFrame!==void 0||t.lastFrame!==void 0){if(e.frameImages!==void 0)throw Error(`Use --first-frame and --last-frame or --frame-images, not both`);let r=[];t.firstFrame!==void 0&&r.push({...await N(t.firstFrame,n),frameType:`first_frame`}),t.lastFrame!==void 0&&r.push({...await N(t.lastFrame,n),frameType:`last_frame`}),e.frameImages=r}}function ye(e){return e instanceof se&&e.status>=500||e instanceof TypeError}async function P(e,t){for(let n=0;;n++)try{return await t()}catch(t){if(n>=3||!ye(t))throw t;e.stderr(`retrying (${n+1}/3): ${t instanceof Error?t.message:String(t)}`),await e.sleep(1e3*2**n)}}function be(e){if(e&&typeof e==`object`&&`id`in e&&typeof e.id==`string`&&`status`in e&&typeof e.status==`string`){let t=`outputs`in e&&Array.isArray(e.outputs)?e.outputs:[];return{id:e.id,status:e.status,outputs:t}}throw Error(`The API answered without a media job`)}function xe(e,t){return e===`completed`?j.completed:M.has(e)?j.ended:t?j.stillRunning:j.completed}function Se(e){return/^media\.(images|videos|speech|sounds|music)\.(generate|get)$/.test(e)}function F(e){return/^[\w@%+=:,./-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function Ce(e,t,n,r){let[,i]=e.split(`.`);return[`adside media ${i} get`,...typeof t==`string`?[`--workspace-id ${F(t)}`]:[],`--job-id ${F(n)} --wait`,...r===void 0?[]:[`--out ${F(r)}`]].join(` `)}async function we(e,t,n,r){let i=e.endsWith(`.generate`),a=e.replace(/\.generate$/,`.get`);if(n.waitTimeout!==void 0&&!n.wait)throw Error(`--wait-timeout needs --wait`);if(n.out!==void 0&&i&&!n.wait)throw Error(`--out needs --wait on generate, or use get`);if(!i&&(n.inputReference?.length||n.firstFrame!==void 0))throw Error(`Input flags go with generate`);if(n.out!==void 0&&await r.isFile(n.out))throw Error(`${n.out} already exists; choose a new file for --out`);i&&await ve(t,n,r);let o=r.now()+(n.waitTimeout?_e(n.waitTimeout):9e5),s=()=>Math.max(0,Math.min(30,Math.floor((o-r.now())/1e3))),c={...t,...n.wait?{waitSeconds:s()}:{}},l=await P(r,()=>r.call(e,c)),u=be(l);for(;n.wait&&!M.has(u.status)&&r.now()<o;){let e=s();if(e<1)break;l=await P(r,()=>r.call(a,{workspaceId:t.workspaceId,jobId:u.id,waitSeconds:e})),u=be(l)}let d=xe(u.status,!!n.wait);if(n.out!==void 0){let e=u.outputs?.[0]?.url;if(u.status!==`completed`)r.stderr(`job ${u.id} is ${u.status}; nothing saved to ${n.out}`);else if(typeof e!=`string`)r.stderr(`job ${u.id} completed without an output to download`),d=j.error;else try{await r.download(e,n.out),r.stderr(`saved_to=${n.out}`)}catch(e){r.stderr(`download failed: ${e instanceof Error?e.message:String(e)}`),d=j.error}}return n.wait&&!M.has(u.status)&&r.stderr(`job ${u.id} is still ${u.status}; to keep waiting without paying again, run: ${Ce(e,t.workspaceId,u.id,n.out)}`),{job:l,exitCode:d}}const Te=new Set([`credits.ledger`]);function Ee(t,n){let r=new e;r.name(`adside`).description(`Adside product and advertising-platform commands`).version(`${ae} (contracts ${t.contractHash.slice(0,12)})`).option(`--output <format>`,`Output format: json or text`,`json`),ke(r,t.commands,n),De(r,t.commands,n),n?.register(r,t.commands),r.parseAsync(process.argv).catch(We)}function I(e,t){let n=le(e);return t?t.configure(n):Promise.resolve(n)}async function L(e){return process.env.ADSIDE_WORKSPACE_ID||(await e?.defaults())?.workspaceId}function De(e,t,n){let r=e.commands.find(e=>e.name()===`assets`);for(let e of[`upload`,`download`]){let i=r.command(e).description(e===`upload`?`Upload a local media file and publish it in the asset library`:`Download an asset to a new local file`).option(`--workspace-id <id>`,`Workspace (defaults to ADSIDE_WORKSPACE_ID)`);e===`upload`?i.requiredOption(`--file <file>`,`Local media or tabular file`).option(`--purpose <purpose>`,`library or attachment (CSV/XLSX audience input)`,`library`).option(`--content-type <type>`,`Media MIME type (inferred from extension by default)`):i.requiredOption(`--asset-id <id>`,`Asset to download`).requiredOption(`--out <file>`,`Destination file (must not exist)`),i.action(async()=>{let r=i.optsWithGlobals(),a=R(r.output),o=E(await I(a,n),t),s=z(r.workspaceId??await L(n),`--workspace-id`);V(e===`upload`?await w(o,s,z(r.file,`--file`),B(r.contentType),Oe(r.purpose)):await te(o,s,z(r.assetId,`--asset-id`),z(r.out,`--out`)),a)})}let i=e.commands.find(e=>e.name()===`brain`).command(`upload`).description(`Upload a local document and start Brain ingestion`).requiredOption(`--file <file>`,`PDF, DOCX, PPTX, Markdown, text, email or ZIP`).option(`--workspace-id <id>`,`Workspace (defaults to ADSIDE_WORKSPACE_ID)`).option(`--organization-id <id>`,`Write to the organization Brain instead (admin required)`).option(`--content-type <type>`,`Document MIME type`).option(`--instructions <text>`,`Filing instructions`);i.action(async()=>{let e=i.optsWithGlobals(),r=R(e.output),a=e.organizationId?{organizationId:z(e.organizationId,`--organization-id`)}:{workspaceId:z(e.workspaceId??await L(n),`--workspace-id`)};V(await ie(E(await I(r,n),t),a,z(e.file,`--file`),{contentType:B(e.contentType),instructions:B(e.instructions)}),r)})}function Oe(e){if(e===`library`||e===`attachment`)return e;throw Error(`--purpose must be library or attachment`)}function ke(e,t,n){let i=new Map;for(let a of t)for(let o of[a.path,...a.aliases??[]]){let c={...a,path:o},l=Ae(e,i,c);l.description(c.summary),c.description&&l.addHelpText(`after`,`\n${c.description}\n`),l.option(`--input-file <file>`,`Read a JSON object of parameters from a file`),l.option(`--json <json>`,`Provide parameters as a JSON object`);let u=ge(c.id);for(let e of u)je(l,e);let d=u.some(e=>e.name===`referenceFile`);for(let e of c.options)Ne(l,e);if(c.output.kind!==`json`&&l.option(`--out <file>`,`Write the response body to a file`),c.examples.length>0){let e=c.examples.map(e=>` ${e.description}\n ${e.command}`).join(`
|
|
3
3
|
`);l.addHelpText(`after`,`Examples:\n${e}\n`)}l.action(async(e,i)=>{let a=i.optsWithGlobals(),o=R(a.output),l=B(a.out),u=await I(o,n),f=E(u,t),p=B(a.inputFile),m=B(a.json);if(p&&m)throw Error(`Use --json or --input-file, not both`);let h=p?JSON.parse(await s(p,`utf8`)):m?JSON.parse(m):{};if(!h||typeof h!=`object`||Array.isArray(h))throw Error(`Input must be a JSON object`);let g={...h,...Fe(c,a)},_=e=>c.options.some(t=>t.name===e);_(`workspaceId`)&&!Te.has(c.id)&&g.workspaceId===void 0&&(g.workspaceId=await L(n)),_(`organizationId`)&&g.organizationId===void 0&&(g.organizationId=(await n?.defaults())?.organizationId),c.generateRequestId&&g.requestId===void 0&&(g.requestId=r());for(let e of c.options)if(e.required&&g[e.name]===void 0)throw Error(`Missing required parameter: ${e.flag}`);let v=c.options.filter(e=>e.valueType===`file`).map(e=>e.name);if(c.generateRequestId&&process.stderr.write(`requestId=${String(g.requestId)}\n`),Se(c.id)){let{job:e,exitCode:t}=await we(c.id,g,{wait:a.wait===!0,waitTimeout:B(a.waitTimeout),out:l,inputReference:Array.isArray(a.inputReference)?a.inputReference.map(String):void 0,firstFrame:B(a.firstFrame),lastFrame:B(a.lastFrame)},Me(f,g));V(e,u.output),process.exitCode=t;return}if(d&&Array.isArray(a.referenceFile)&&a.referenceFile.length){let e=g.references??[];if(!Array.isArray(e)||e.length+a.referenceFile.length>20)throw Error(`A creative request supports at most 20 references`);g.references=[...e];for(let e of a.referenceFile){let t=C(S((await w(f,z(g.workspaceId,`--workspace-id`),z(e,`--reference-file`),void 0,`attachment`)).asset).id);g.references.push({type:`asset`,assetId:t}),process.stderr.write(`referenceAssetId=${t}\n`)}}await Ue(await f.callRest(c.transport.method,c.transport.path,g,{contentType:c.transport.requestContentType,fileFields:v,parameters:c.options,auth:c.transport.auth}),u.output,l)})}}function Ae(e,t,n){let r=e,i=``;for(let e of n.path){i=i?`${i} ${e}`:e;let n=t.get(i);if(n){r=n;continue}let a=r.command(e);t.set(i,a),r=a}return r}function je(e,t){let n=t.value?`${t.flag} ${t.value}`:t.flag;t.repeatable?e.option(n,t.description,(e,t)=>[...t,e],[]):e.option(n,t.description)}function Me(e,t){return{call:(t,n)=>x(e,t,n),upload:async n=>C(S((await w(e,z(t.workspaceId,`--workspace-id`),n,void 0,`attachment`)).asset).id),download:T,isFile:e=>u(e).then(e=>e.isFile(),()=>!1),sleep:e=>new Promise(t=>setTimeout(t,e)),now:()=>Date.now(),stderr:e=>process.stderr.write(`${e}\n`)}}function Ne(e,t){let n=t.valueType===`boolean`?`<boolean>`:t.valueType===`file`?`<file>`:`<value>`,r=`${t.flag} ${n}`,i=Pe(t);e.option(r,i)}function Pe(e){let t=[e.description||Be(e.name)];return e.enum&&e.enum.length>0&&t.push(`Allowed: ${e.enum.join(`, `)}`),e.defaultValue!==void 0&&t.push(`Default: ${String(e.defaultValue)}`),e.required&&t.push(`Required`),t.join(` `)}function Fe(e,t){let n={};for(let r of e.options){let e=t[Ve(r.flag)];e!==void 0&&(n[r.name]=Ie(r,e))}return n}function Ie(e,t){let n=z(t,e.flag);switch(e.valueType){case`boolean`:return Le(n,e.flag);case`number`:return Re(n,e.flag);case`json`:return ze(n,e.flag);default:return n}}function Le(e,t){if(e===`true`)return!0;if(e===`false`)return!1;throw Error(`Invalid boolean for ${t}: "${e}". Use true or false.`)}function Re(e,t){let n=Number(e);if(!Number.isFinite(n))throw Error(`Invalid number for ${t}: "${e}".`);return n}function ze(e,t){try{return JSON.parse(e)}catch(e){let n=e instanceof Error?e.message:`Unknown JSON parse error`;throw Error(`Invalid JSON for ${t}: ${n}`)}}function R(e){if(e!==`json`&&e!==`text`)throw Error(`--output must be json or text`);return e}function z(e,t){if(typeof e!=`string`||e.length===0)throw Error(`Missing required value for ${t}.`);return e}function B(e){return typeof e==`string`&&e.length>0?e:void 0}function Be(e){return e.replace(/_/g,` `)}function Ve(e){return e.replace(/^--/,``).replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function V(e,t){let n=H(e);if(t===`text`&&typeof e==`string`){process.stdout.write(`${n}\n`);return}process.stdout.write(`${JSON.stringify(n,null,2)}\n`)}function H(e){return Array.isArray(e)?e.map(e=>H(e)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,He(e)?`[REDACTED]`:H(t)]))}function He(e){let t=e.replace(/[^a-zA-Z0-9]/g,``).toLowerCase();return new Set([`accesstoken`,`refreshtoken`,`idtoken`,`apikey`,`authorization`,`password`,`secret`,`clientsecret`,`appsecret`,`developertoken`]).has(t)||t.endsWith(`accesstoken`)||t.endsWith(`refreshtoken`)||t.endsWith(`idtoken`)||t.endsWith(`apikey`)||t.endsWith(`secret`)}async function Ue(e,t,n){if(e.kind===`json`){V(e.data,t);return}if(e.kind===`text`){if(n){await f(n,e.data,`utf8`),V({saved_to:n,content_type:e.contentType,bytes:Buffer.byteLength(e.data)},t);return}if(t===`text`){process.stdout.write(e.data),e.data.endsWith(`
|
|
4
4
|
`)||process.stdout.write(`
|
|
5
|
-
`);return}V({text:e.data},t);return}if(n){await f(n,e.data),V({saved_to:n,content_type:e.contentType,bytes:e.data.byteLength},t);return}if(process.stdout.isTTY)throw Error(`Binary response detected. Use --out <file> or redirect stdout.`);process.stdout.write(Buffer.from(e.data))}function We(e){let t=e instanceof Error?e.message:`Unknown CLI execution error`;process.stderr.write(`${t}\n`),process.exitCode=1}const Ge={version:`2`,contractHash:`85fb7dd4ce85d82709dc74c9a565a758aad3ad312d89db041867d88a0a9d7f98`,commands:[{id:`ad-comments.capabilities`,path:[`ad-comments`,`capabilities`],summary:`Read moderation capabilities of connected Meta accounts`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside ad-comments capabilities --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read moderation capabilities of connected Meta accounts`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/ad-comments/capabilities`,auth:`user`}},{id:`ad-comments.hide`,path:[`ad-comments`,`hide`],summary:`Hide an ad comment on Meta`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`surface`,flag:`--surface`,description:``,required:!0,valueType:`string`,enum:[`facebook`,`instagram`],location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside ad-comments hide --workspace-id <workspaceId> --surface facebook --comment-id <commentId>`}],output:{kind:`json`,description:`Hide an ad comment on Meta`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/ad-comments/{surface}/{commentId}/hide`,auth:`user`,requestContentType:`application/json`}},{id:`ad-comments.list`,path:[`ad-comments`,`list`],summary:`Read workspace ad comments grouped by post`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside ad-comments list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read workspace ad comments grouped by post`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/ad-comments`,auth:`user`}},{id:`ad-comments.reply`,path:[`ad-comments`,`reply`],summary:`Post a reply as the owning Page or Instagram account`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`surface`,flag:`--surface`,description:``,required:!0,valueType:`string`,enum:[`facebook`,`instagram`],location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`message`,flag:`--message`,description:``,required:!0,valueType:`string`,location:`body`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside ad-comments reply --workspace-id <workspaceId> --surface facebook --comment-id <commentId> --message <message>`}],output:{kind:`json`,description:`Post a reply as the owning Page or Instagram account`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/ad-comments/{surface}/{commentId}/replies`,auth:`user`,requestContentType:`application/json`}},{id:`ad-comments.unhide`,path:[`ad-comments`,`unhide`],summary:`Restore a hidden ad comment on Meta`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`surface`,flag:`--surface`,description:``,required:!0,valueType:`string`,enum:[`facebook`,`instagram`],location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside ad-comments unhide --workspace-id <workspaceId> --surface facebook --comment-id <commentId>`}],output:{kind:`json`,description:`Restore a hidden ad comment on Meta`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/ad-comments/{surface}/{commentId}/unhide`,auth:`user`,requestContentType:`application/json`}},{id:`assets.archive`,path:[`assets`,`archive`],summary:`Archive an asset`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets archive --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Archive an asset`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}/archive`,auth:`user`}},{id:`assets.batch`,path:[`assets`,`batch`],summary:`Look up assets in this workspace by ID`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`ids`,flag:`--ids`,description:``,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets batch --workspace-id <workspaceId> --ids '{}'`}],output:{kind:`json`,description:`Look up assets in this workspace by ID`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/batch`,auth:`user`,requestContentType:`application/json`}},{id:`assets.delete`,path:[`assets`,`delete`],summary:`Remove an asset and queue storage cleanup`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside assets delete --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Remove an asset and queue storage cleanup`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}`,auth:`user`,requestContentType:`application/json`}},{id:`assets.get`,path:[`assets`,`get`],summary:`Get an asset and its download URL`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets get --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Get an asset and its download URL`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}`,auth:`user`}},{id:`assets.import-url`,path:[`assets`,`import-url`],summary:`Import a public image or video URL into the asset library`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`url`,flag:`--url`,description:``,required:!0,valueType:`url`,location:`body`},{name:`name`,flag:`--name`,description:``,required:!1,valueType:`string`,location:`body`},{name:`tags`,flag:`--tags`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets import-url --workspace-id <workspaceId> --url https://example.com`}],output:{kind:`json`,description:`Import a public image or video URL into the asset library`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/imports/url`,auth:`user`,requestContentType:`application/json`}},{id:`assets.list`,path:[`assets`,`list`],summary:`List the workspace's assets, with filters and cursor pagination`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`query`},{name:`sourceType`,flag:`--source-type`,description:``,required:!1,valueType:`json`,location:`query`},{name:`category`,flag:`--category`,description:``,required:!1,valueType:`json`,location:`query`},{name:`tags`,flag:`--tags`,description:``,required:!1,valueType:`json`,location:`query`},{name:`mediaType`,flag:`--media-type`,description:``,required:!1,valueType:`json`,location:`query`},{name:`dateAddedFrom`,flag:`--date-added-from`,description:``,required:!1,valueType:`string`,location:`query`},{name:`dateAddedTo`,flag:`--date-added-to`,description:``,required:!1,valueType:`string`,location:`query`},{name:`minSizeBytes`,flag:`--min-size-bytes`,description:``,required:!1,valueType:`number`,location:`query`},{name:`maxSizeBytes`,flag:`--max-size-bytes`,description:``,required:!1,valueType:`number`,location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`PENDING`,`PROCESSING`,`READY`,`FAILED`,`ARCHIVED`,`PENDING_DELETION`],location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`sortBy`,flag:`--sort-by`,description:``,required:!1,valueType:`string`,defaultValue:`createdAt`,enum:[`createdAt`,`name`,`fileSize`],location:`query`},{name:`sortOrder`,flag:`--sort-order`,description:``,required:!1,valueType:`string`,defaultValue:`desc`,enum:[`asc`,`desc`],location:`query`}],examples:[{description:`Example`,command:`adside assets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the workspace's assets, with filters and cursor pagination`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/assets`,auth:`user`}},{id:`assets.readiness`,path:[`assets`,`status`],summary:`Check asset processing and upload readiness`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`ids`,flag:`--ids`,description:``,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets status --workspace-id <workspaceId> --ids '{}'`}],output:{kind:`json`,description:`Check asset processing and upload readiness`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/status`,auth:`user`,requestContentType:`application/json`}},{id:`assets.tags.list`,path:[`assets`,`tags`,`list`],summary:`List the workspace's most-used asset tags`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets tags list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the workspace's most-used asset tags`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/assets/tags`,auth:`user`}},{id:`assets.tags.update`,path:[`assets`,`tags`,`update`],summary:`Add or remove asset tags`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`add`,flag:`--add`,description:``,required:!1,valueType:`json`,location:`body`},{name:`remove`,flag:`--remove`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets tags update --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Add or remove asset tags`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}/tags`,auth:`user`,requestContentType:`application/json`}},{id:`assets.transcription`,path:[`assets`,`transcription`],summary:`Request or read a video transcription`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets transcription --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Request or read a video transcription`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}/transcription`,auth:`user`}},{id:`assets.update`,path:[`assets`,`update`],summary:`Update asset metadata`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`name`,flag:`--name`,description:``,required:!1,valueType:`string`,location:`body`},{name:`description`,flag:`--description`,description:``,required:!1,valueType:`string`,location:`body`},{name:`category`,flag:`--category`,description:``,required:!1,valueType:`string`,enum:[`UNKNOWN`,`LOGO`,`PRODUCT`,`LIFESTYLE`,`BANNER`,`ICON`,`BACKGROUND`,`SCREENSHOT`,`AD_CREATIVE`,`OTHER`],location:`body`},{name:`tags`,flag:`--tags`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets update --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Update asset metadata`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}`,auth:`user`,requestContentType:`application/json`}},{id:`assets.uploads.complete`,path:[`assets`,`uploads`,`complete`],summary:`Publish an uploaded asset (safe to repeat)`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets uploads complete --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Publish an uploaded asset (safe to repeat)`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/uploads/{assetId}/complete`,auth:`user`}},{id:`assets.uploads.create`,path:[`assets`,`uploads`,`create`],summary:`Reserve a media upload and return a single-file upload ticket`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`filename`,flag:`--filename`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentType`,flag:`--content-type`,description:``,required:!0,valueType:`string`,location:`body`},{name:`sizeBytes`,flag:`--size-bytes`,description:``,required:!0,valueType:`number`,location:`body`},{name:`purpose`,flag:`--purpose`,description:``,required:!1,valueType:`string`,defaultValue:`library`,enum:[`library`,`attachment`],location:`body`}],examples:[{description:`Example`,command:`adside assets uploads create --workspace-id <workspaceId> --filename <filename> --content-type <contentType> --size-bytes 1`}],output:{kind:`json`,description:`Reserve a media upload and return a single-file upload ticket`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/uploads`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.confirm`,path:[`audiences`,`imports`,`confirm`],summary:`Approve the exact mapping and send the customer list to the channel`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`selection`,flag:`--selection`,description:`Column selection. Omit for a prepared CSV to approve its stored identity mapping.`,required:!1,valueType:`json`,location:`body`},{name:`fullNameOrder`,flag:`--full-name-order`,description:``,required:!1,valueType:`string`,defaultValue:`given-first`,enum:[`given-first`,`family-first`],location:`body`},{name:`audienceName`,flag:`--audience-name`,description:``,required:!1,valueType:`string`,location:`body`},{name:`defaultCountryCallingCode`,flag:`--default-country-calling-code`,description:``,required:!1,valueType:`string`,location:`body`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports confirm --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Approve the exact mapping and send the customer list to the channel`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports/{jobId}/confirm`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.create`,path:[`audiences`,`imports`,`create`],summary:`Prepare an audience import for explicit confirmation`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`filePath`,flag:`--file-path`,description:``,required:!1,valueType:`string`,location:`body`},{name:`channel`,flag:`--channel`,description:``,required:!0,valueType:`string`,enum:[`META`,`LINKEDIN`],location:`body`},{name:`audienceName`,flag:`--audience-name`,description:``,required:!0,valueType:`string`,location:`body`},{name:`audienceDescription`,flag:`--audience-description`,description:``,required:!1,valueType:`string`,location:`body`},{name:`columnMapping`,flag:`--column-mapping`,description:``,required:!1,valueType:`json`,location:`body`},{name:`fullNameOrder`,flag:`--full-name-order`,description:``,required:!1,valueType:`string`,enum:[`given-first`,`family-first`],location:`body`},{name:`preparedCsv`,flag:`--prepared-csv`,description:`Validate a sandbox-prepared UTF-8 CSV with exact channel identifier headers, split names and international phones. Infer the mapping from those headers.`,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports create --workspace-id <workspaceId> --channel META --audience-name <audienceName>`}],output:{kind:`json`,description:`Prepare an audience import for explicit confirmation`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.get`,path:[`audiences`,`imports`,`get`],summary:`Read audience mapping and import progress`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside audiences imports get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read audience mapping and import progress`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audience-imports/{jobId}`,auth:`user`}},{id:`audiences.imports.list`,path:[`audiences`,`imports`,`list`],summary:`List audience import outcomes`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`take`,flag:`--take`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`query`}],examples:[{description:`Example`,command:`adside audiences imports list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List audience import outcomes`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audience-imports`,auth:`user`}},{id:`audiences.imports.preview`,path:[`audiences`,`imports`,`preview`],summary:`Inspect a CSV or spreadsheet before mapping audience identifiers`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`filePath`,flag:`--file-path`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports preview --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Inspect a CSV or spreadsheet before mapping audience identifiers`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports/preview`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.retry`,path:[`audiences`,`imports`,`retry`],summary:`Resume a failed import with its immutable approved mapping`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports retry --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Resume a failed import with its immutable approved mapping`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports/{jobId}/retry`,auth:`user`,requestContentType:`application/json`}},{id:`audit.get`,path:[`audit`,`get`],summary:`Read a campaign change or explicitly uncertain platform activity`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`eventId`,flag:`--event-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside audit get --workspace-id <workspaceId> --event-id <eventId>`}],output:{kind:`json`,description:`Read a campaign change or explicitly uncertain platform activity`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audit-events/{eventId}`,auth:`user`}},{id:`audit.list`,path:[`audit`,`list`],summary:`Read campaign audit history with current access to explanations and sources`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`scope`,flag:`--scope`,description:``,required:!1,valueType:`string`,defaultValue:`workspace`,enum:[`workspace`,`organization`],location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`eventType`,flag:`--event-type`,description:``,required:!1,valueType:`string`,location:`query`},{name:`resourceType`,flag:`--resource-type`,description:``,required:!1,valueType:`string`,location:`query`},{name:`provider`,flag:`--provider`,description:``,required:!1,valueType:`string`,location:`query`},{name:`resourceId`,flag:`--resource-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`actorUserId`,flag:`--actor-user-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`from`,flag:`--from`,description:``,required:!1,valueType:`string`,location:`query`},{name:`to`,flag:`--to`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside audit list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read campaign audit history with current access to explanations and sources`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audit-events`,auth:`user`}},{id:`bookmarks.add-to-board`,path:[`boards`,`bookmarks`,`add-to-board`],summary:`Add a saved item to another board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`bookmarkId`,flag:`--bookmark-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards bookmarks add-to-board --workspace-id <workspaceId> --bookmark-id <bookmarkId> --board-id <boardId>`}],output:{kind:`json`,description:`Add a saved item to another board`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/bookmarks/{bookmarkId}/boards`,auth:`user`,requestContentType:`application/json`}},{id:`bookmarks.list`,path:[`boards`,`bookmarks`,`list`],summary:`List saved ads and inspiration`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`kind`,flag:`--kind`,description:``,required:!1,valueType:`string`,enum:[`AD`,`INSPIRATION_ITEM`],location:`query`},{name:`trackedCompanyId`,flag:`--tracked-company-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`boardId`,flag:`--board-id`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside boards bookmarks list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List saved ads and inspiration`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/bookmarks`,auth:`user`}},{id:`bookmarks.move`,path:[`boards`,`bookmarks`,`move`],summary:`Move a saved item between boards`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`bookmarkId`,flag:`--bookmark-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`fromBoardId`,flag:`--from-board-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`toBoardId`,flag:`--to-board-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards bookmarks move --workspace-id <workspaceId> --bookmark-id <bookmarkId> --from-board-id <fromBoardId> --to-board-id <toBoardId>`}],output:{kind:`json`,description:`Move a saved item between boards`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/bookmarks/{bookmarkId}`,auth:`user`,requestContentType:`application/json`}},{id:`bookmarks.remove`,path:[`boards`,`bookmarks`,`remove`],summary:`Remove a saved item or board membership`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`bookmarkId`,flag:`--bookmark-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside boards bookmarks remove --workspace-id <workspaceId> --bookmark-id <bookmarkId>`}],output:{kind:`json`,description:`Remove a saved item or board membership`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/bookmarks/{bookmarkId}`,auth:`user`}},{id:`bookmarks.save`,path:[`boards`,`bookmarks`,`save`],summary:`Save an ad or inspiration item to a board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`kind`,flag:`--kind`,description:``,required:!0,valueType:`string`,enum:[`AD`,`INSPIRATION_ITEM`],location:`body`},{name:`adArchiveId`,flag:`--ad-archive-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`channel`,flag:`--channel`,description:``,required:!1,valueType:`string`,enum:[`META`,`GOOGLE`,`LINKEDIN`],location:`body`},{name:`trackedCompanyId`,flag:`--tracked-company-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`boardId`,flag:`--board-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`comment`,flag:`--comment`,description:``,required:!1,valueType:`string`,location:`body`},{name:`itemId`,flag:`--item-id`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards bookmarks save --workspace-id <workspaceId> --kind AD`}],output:{kind:`json`,description:`Save an ad or inspiration item to a board`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/bookmarks`,auth:`user`,requestContentType:`application/json`}},{id:`boards.create`,path:[`boards`,`create`],summary:`Create a board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`name`,flag:`--name`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards create --workspace-id <workspaceId> --name <name>`}],output:{kind:`json`,description:`Create a board`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/boards`,auth:`user`,requestContentType:`application/json`}},{id:`boards.delete`,path:[`boards`,`delete`],summary:`Delete a non-default board and its exclusive saved ads`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards delete --workspace-id <workspaceId> --board-id <boardId>`}],output:{kind:`json`,description:`Delete a non-default board and its exclusive saved ads`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/boards/{boardId}`,auth:`user`,requestContentType:`application/json`}},{id:`boards.list`,path:[`boards`,`list`],summary:`List boards and saved-ad counts`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside boards list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List boards and saved-ad counts`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/boards`,auth:`user`}},{id:`boards.update`,path:[`boards`,`update`],summary:`Rename a board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`name`,flag:`--name`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards update --workspace-id <workspaceId> --board-id <boardId>`}],output:{kind:`json`,description:`Rename a board`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/boards/{boardId}`,auth:`user`,requestContentType:`application/json`}},{id:`brain.ingest`,path:[`brain`,`ingest`,`create`],summary:`ingest Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`org`,`workspace`],location:`body`},{name:`registration`,flag:`--registration`,description:``,required:!0,valueType:`json`,location:`body`},{name:`instructions`,flag:`--instructions`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain ingest create --workspace-id <workspaceId> --tier org --registration '{}'`}],output:{kind:`json`,description:`ingest Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/ingest`,auth:`user`,requestContentType:`application/json`}},{id:`brain.job`,path:[`brain`,`ingest`,`get`],summary:`job Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brain ingest get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`job Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/ingest/jobs/{jobId}`,auth:`user`}},{id:`brain.jobs`,path:[`brain`,`ingest`,`list`],summary:`jobs Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!1,valueType:`string`,enum:[`org`,`workspace`],location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`PENDING`,`EXTRACTING`,`INGESTING`,`COMPLETED`,`FAILED`],location:`query`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside brain ingest list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`jobs Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/ingest/jobs`,auth:`user`}},{id:`brain.tree`,path:[`brain`,`list`],summary:`tree Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`workspace`,`org`],location:`query`},{name:`path`,flag:`--path`,description:``,required:!1,valueType:`string`,defaultValue:``,location:`query`}],examples:[{description:`Example`,command:`adside brain list --workspace-id <workspaceId> --tier workspace`}],output:{kind:`json`,description:`tree Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/tree`,auth:`user`}},{id:`brain.orgIngest`,path:[`brain`,`organization`,`ingest`,`create`],summary:`ingest Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`org`],location:`body`},{name:`registration`,flag:`--registration`,description:``,required:!0,valueType:`json`,location:`body`},{name:`instructions`,flag:`--instructions`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain organization ingest create --organization-id <organizationId> --tier org --registration '{}'`}],output:{kind:`json`,description:`ingest Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/organizations/{organizationId}/brain/ingest`,auth:`user`,requestContentType:`application/json`}},{id:`brain.orgJob`,path:[`brain`,`organization`,`ingest`,`get`],summary:`job Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brain organization ingest get --organization-id <organizationId> --job-id <jobId>`}],output:{kind:`json`,description:`job Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/brain/ingest/jobs/{jobId}`,auth:`user`}},{id:`brain.orgJobs`,path:[`brain`,`organization`,`ingest`,`list`],summary:`jobs Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!1,valueType:`string`,enum:[`org`,`workspace`],location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`PENDING`,`EXTRACTING`,`INGESTING`,`COMPLETED`,`FAILED`],location:`query`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside brain organization ingest list --organization-id <organizationId>`}],output:{kind:`json`,description:`jobs Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/brain/ingest/jobs`,auth:`user`}},{id:`brain.orgUpload`,path:[`brain`,`organization`,`uploads`,`create`],summary:`upload Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`filename`,flag:`--filename`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentType`,flag:`--content-type`,description:``,required:!0,valueType:`string`,enum:[`application/pdf`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`text/plain`,`text/markdown`,`message/rfc822`,`application/zip`,`application/x-zip-compressed`],location:`body`},{name:`sizeBytes`,flag:`--size-bytes`,description:``,required:!0,valueType:`number`,location:`body`}],examples:[{description:`Example`,command:`adside brain organization uploads create --organization-id <organizationId> --filename <filename> --content-type application/pdf --size-bytes 1`}],output:{kind:`json`,description:`upload Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/organizations/{organizationId}/brain/uploads`,auth:`user`,requestContentType:`application/json`}},{id:`brain.page`,path:[`brain`,`read`],summary:`page Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`workspace`,`org`],location:`query`},{name:`path`,flag:`--path`,description:``,required:!0,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside brain read --workspace-id <workspaceId> --tier workspace --path <path>`}],output:{kind:`json`,description:`page Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/page`,auth:`user`}},{id:`brain.remember`,path:[`brain`,`remember`],summary:`Remember durable workspace facts in memory.md; applied in the background`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`facts`,flag:`--facts`,description:`This turn's durable facts and corrections, in plain sentences`,required:!0,valueType:`string`,location:`body`},{name:`topic`,flag:`--topic`,description:`Keep the detail in memory/<topic>.md, e.g. decisions or goals-and-targets`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain remember --workspace-id <workspaceId> --facts <facts>`}],output:{kind:`json`,description:`Remember durable workspace facts in memory.md; applied in the background`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/memory`,auth:`user`,requestContentType:`application/json`}},{id:`brain.search`,path:[`brain`,`search`],summary:`Search Brain pages with bounded keyword scanning`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`query`,flag:`--query`,description:``,required:!0,valueType:`string`,location:`body`},{name:`tiers`,flag:`--tiers`,description:``,required:!1,valueType:`json`,location:`body`},{name:`directory`,flag:`--directory`,description:``,required:!1,valueType:`string`,location:`body`},{name:`maxResults`,flag:`--max-results`,description:``,required:!1,valueType:`number`,defaultValue:10,location:`body`}],examples:[{description:`Example`,command:`adside brain search --workspace-id <workspaceId> --query <query>`}],output:{kind:`json`,description:`Search Brain pages with bounded keyword scanning`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/search`,auth:`user`,requestContentType:`application/json`}},{id:`brain.upload`,path:[`brain`,`uploads`,`create`],summary:`upload Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`filename`,flag:`--filename`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentType`,flag:`--content-type`,description:``,required:!0,valueType:`string`,enum:[`application/pdf`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`text/plain`,`text/markdown`,`message/rfc822`,`application/zip`,`application/x-zip-compressed`],location:`body`},{name:`sizeBytes`,flag:`--size-bytes`,description:``,required:!0,valueType:`number`,location:`body`}],examples:[{description:`Example`,command:`adside brain uploads create --workspace-id <workspaceId> --filename <filename> --content-type application/pdf --size-bytes 1`}],output:{kind:`json`,description:`upload Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/uploads`,auth:`user`,requestContentType:`application/json`}},{id:`brain.write`,path:[`brain`,`write`],summary:`write Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`org`,`workspace`],location:`body`},{name:`path`,flag:`--path`,description:``,required:!0,valueType:`string`,location:`body`},{name:`content`,flag:`--content`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentFormat`,flag:`--content-format`,description:``,required:!1,valueType:`string`,defaultValue:`body`,enum:[`body`,`document`],location:`body`},{name:`commitMessage`,flag:`--commit-message`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain write --workspace-id <workspaceId> --tier org --path <path> --content <content>`}],output:{kind:`json`,description:`write Brain content and document ingestion`},transport:{type:`rest`,method:`PUT`,path:`/v1/workspaces/{workspaceId}/brain/page`,auth:`user`,requestContentType:`application/json`}},{id:`brands.details`,path:[`brands`,`details`],summary:`Read the default brand identity, products and capped website evidence`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brands details --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read the default brand identity, products and capped website evidence`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brand-details`,auth:`user`}},{id:`brands.get`,path:[`brands`,`get`],summary:`Get a brand kit`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`brandKitId`,flag:`--brand-kit-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brands get --workspace-id <workspaceId> --brand-kit-id <brandKitId>`}],output:{kind:`json`,description:`Get a brand kit`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brand-kits/{brandKitId}`,auth:`user`}},{id:`brands.list`,path:[`brands`,`list`],summary:`List brand kits`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brands list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List brand kits`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brand-kits`,auth:`user`}},{id:`creatives.by-request-id`,path:[`creatives`,`by-request-id`],summary:`Recover the exact receipt of a create request without resubmitting`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:``,required:!0,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside creatives by-request-id --workspace-id <workspaceId> --request-id <requestId>`}],output:{kind:`json`,description:`Recover the exact receipt of a create request without resubmitting`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/by-request-id`,auth:`user`}},{id:`creatives.cancel`,path:[`creatives`,`cancel`],summary:`Request cancellation of an exact run, retaining published work`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`runId`,flag:`--run-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives cancel --workspace-id <workspaceId> --drop-id <dropId> --run-id <runId>`}],output:{kind:`json`,description:`Request cancellation of an exact run, retaining published work`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/runs/{runId}/cancel`,auth:`user`}},{id:`creatives.comments.create`,path:[`creatives`,`comments`,`create`],summary:`Pin feedback to a creative revision`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeRevisionId`,flag:`--creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`target`,flag:`--target`,description:``,required:!0,valueType:`json`,location:`body`},{name:`body`,flag:`--body`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside creatives comments create --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --creative-revision-id <creativeRevisionId> --target '{}' --body <body>`}],output:{kind:`json`,description:`Pin feedback to a creative revision`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/comments`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.comments.delete`,path:[`creatives`,`comments`,`delete`],summary:`Remove your unsubmitted creative feedback`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives comments delete --workspace-id <workspaceId> --drop-id <dropId> --comment-id <commentId>`}],output:{kind:`json`,description:`Remove your unsubmitted creative feedback`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/comments/{commentId}`,auth:`user`}},{id:`creatives.comments.update`,path:[`creatives`,`comments`,`update`],summary:`Update your unsubmitted creative feedback`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`body`,flag:`--body`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside creatives comments update --workspace-id <workspaceId> --drop-id <dropId> --comment-id <commentId> --body <body>`}],output:{kind:`json`,description:`Update your unsubmitted creative feedback`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/comments/{commentId}`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.copy`,path:[`creatives`,`copy`],summary:`Save export copy against an exact creative revision`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`baseCreativeRevisionId`,flag:`--base-creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`copy`,flag:`--copy`,description:``,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside creatives copy --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --base-creative-revision-id <baseCreativeRevisionId> --copy '{}'`}],output:{kind:`json`,description:`Save export copy against an exact creative revision`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/copy`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.create`,path:[`creatives`,`create`],summary:`Start a creative drop; the sandbox reserves and generates its first batch. Omit creative count for Auto (brief quantity, otherwise 5).`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`creativeCount`,flag:`--creative-count`,description:`Exact quantity, overriding the prompt. Omit for Auto: infer from the prompt, or use 5 when unspecified.`,required:!1,valueType:`number`,location:`body`},{name:`references`,flag:`--references`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside creatives create --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Start a creative drop; the sandbox reserves and generates its first batch. Omit creative count for Auto (brief quantity, otherwise 5).`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.get`,path:[`creatives`,`get`],summary:`Read stable creative IDs, numbers and current render revisions`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives get --workspace-id <workspaceId> --drop-id <dropId>`}],output:{kind:`json`,description:`Read stable creative IDs, numbers and current render revisions`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}`,auth:`user`}},{id:`creatives.list`,path:[`creatives`,`list`],summary:`List creative drops and their current rendered previews`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`offset`,flag:`--offset`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`query`,flag:`--query`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside creatives list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List creative drops and their current rendered previews`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives`,auth:`user`}},{id:`creatives.messages.create`,path:[`creatives`,`messages`,`create`],summary:`Send a live drop conversation input`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`instruction`,flag:`--instruction`,description:``,required:!0,valueType:`string`,location:`body`},{name:`references`,flag:`--references`,description:``,required:!1,valueType:`json`,location:`body`},{name:`expectedCreativeRevisionIds`,flag:`--expected-creative-revision-ids`,description:``,required:!1,valueType:`json`,location:`body`},{name:`targets`,flag:`--targets`,description:``,required:!1,valueType:`json`,location:`body`},{name:`commentIds`,flag:`--comment-ids`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside creatives messages create --workspace-id <workspaceId> --drop-id <dropId> --instruction <instruction>`}],output:{kind:`json`,description:`Send a live drop conversation input`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.messages.list`,path:[`creatives`,`messages`,`list`],summary:`Read the shared drop conversation`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives messages list --workspace-id <workspaceId> --drop-id <dropId>`}],output:{kind:`json`,description:`Read the shared drop conversation`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages`,auth:`user`}},{id:`creatives.messages.resume`,path:[`creatives`,`messages`,`resume`],summary:`Explicitly resume a held conversation input`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`messageId`,flag:`--message-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives messages resume --workspace-id <workspaceId> --drop-id <dropId> --message-id <messageId>`}],output:{kind:`json`,description:`Explicitly resume a held conversation input`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages/{messageId}/resume`,auth:`user`}},{id:`creatives.messages.stop`,path:[`creatives`,`messages`,`stop`],summary:`Stop an exact conversation input`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`messageId`,flag:`--message-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives messages stop --workspace-id <workspaceId> --drop-id <dropId> --message-id <messageId>`}],output:{kind:`json`,description:`Stop an exact conversation input`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages/{messageId}/stop`,auth:`user`}},{id:`creatives.revert`,path:[`creatives`,`revert`],summary:`Restore a creative revision without changing other creatives`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeRevisionId`,flag:`--creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`expectedCreativeRevisionId`,flag:`--expected-creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside creatives revert --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --creative-revision-id <creativeRevisionId> --expected-creative-revision-id <expectedCreativeRevisionId>`}],output:{kind:`json`,description:`Restore a creative revision without changing other creatives`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/revert`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.review`,path:[`creatives`,`review`],summary:`Select or discard a creative for campaigns`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`reviewStatus`,flag:`--review-status`,description:``,required:!0,valueType:`string`,enum:[`unreviewed`,`kept`,`discarded`],location:`body`}],examples:[{description:`Example`,command:`adside creatives review --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --review-status unreviewed`}],output:{kind:`json`,description:`Select or discard a creative for campaigns`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/review`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.revisions.get`,path:[`creatives`,`revisions`,`get`],summary:`Read a historical creative revision and its published media and copy`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeRevisionId`,flag:`--creative-revision-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives revisions get --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --creative-revision-id <creativeRevisionId>`}],output:{kind:`json`,description:`Read a historical creative revision and its published media and copy`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/revisions/{creativeRevisionId}`,auth:`user`}},{id:`creatives.runs.by-request-id`,path:[`creatives`,`runs`,`by-request-id`],summary:`Recover the exact receipt of an edit request without resubmitting`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:``,required:!0,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside creatives runs by-request-id --workspace-id <workspaceId> --drop-id <dropId> --request-id <requestId>`}],output:{kind:`json`,description:`Recover the exact receipt of an edit request without resubmitting`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/runs/by-request-id`,auth:`user`}},{id:`creatives.status`,path:[`creatives`,`status`],aliases:[[`creatives`,`result`]],summary:`Read an exact run's progress, terminal result and cleanup state`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`runId`,flag:`--run-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives status --workspace-id <workspaceId> --drop-id <dropId> --run-id <runId>`}],output:{kind:`json`,description:`Read an exact run's progress, terminal result and cleanup state`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/runs/{runId}`,auth:`user`}},{id:`credits.balance`,path:[`credits`,`balance`],summary:`Read the organization's media generation credit balance`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside credits balance --organization-id <organizationId>`}],output:{kind:`json`,description:`Read the organization's media generation credit balance`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/credits`,auth:`user`}},{id:`credits.ledger`,path:[`credits`,`ledger`],summary:`List where the organization's media generation credit went, newest first`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`runId`,flag:`--run-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`jobId`,flag:`--job-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`starting_credit`,`top_up`,`charge`,`reversal`,`adjustment`],location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`}],examples:[{description:`Example`,command:`adside credits ledger --organization-id <organizationId>`}],output:{kind:`json`,description:`List where the organization's media generation credit went, newest first`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/credits/ledger`,auth:`user`}},{id:`google-ads.list_accessible_customers`,path:[`google-ads`,`accessible-customers`,`list`],summary:`List the Google Ads customer account this client is connected to. Always returns that one account — other accounts the credentials can reach belong to other clients and are not available here.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside google-ads accessible-customers list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the Google Ads customer account this client is connected to. Always returns that one account — other accounts the credentials can reach belong to other clients and are not available here.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/accessible-customers/list`,auth:`user`}},{id:`google-ads.list_ad_groups`,path:[`google-ads`,`ad-groups`,`list`],summary:`List ad groups for a campaign with bids, status, and rotation settings.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads ad-groups list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List ad groups for a campaign with bids, status, and rotation settings.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/ad-groups/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_google_ads`,path:[`google-ads`,`ads`,`list`],summary:`List ads in an ad group with responsive search/display ad details including headlines, descriptions, and ad strength.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads ads list --workspace-id <workspaceId> --ad-group-id <ad_group_id>`}],output:{kind:`json`,description:`List ads in an ad group with responsive search/display ad details including headlines, descriptions, and ad strength.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/ads/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_asset_group_assets`,path:[`google-ads`,`asset-group-assets`,`list`],summary:`List the assets linked to one Performance Max asset group, including each exact AssetGroupAsset resource name, field type, status, asset ID and image dimensions. Defaults to non-removed links. Use before adding or unlinking assets, and again to verify the result.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`asset_group_id`,flag:`--asset-group-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`field_type`,flag:`--field-type`,description:``,required:!1,valueType:`string`,enum:[`HEADLINE`,`LONG_HEADLINE`,`DESCRIPTION`,`BUSINESS_NAME`,`MARKETING_IMAGE`,`SQUARE_MARKETING_IMAGE`,`PORTRAIT_MARKETING_IMAGE`,`TALL_PORTRAIT_MARKETING_IMAGE`,`LOGO`,`LANDSCAPE_LOGO`,`YOUTUBE_VIDEO`,`CALL_TO_ACTION_SELECTION`],location:`body`},{name:`status`,flag:`--status`,description:`Defaults to all non-removed links`,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`}],examples:[{description:`Example`,command:`adside google-ads asset-group-assets list --workspace-id <workspaceId> --asset-group-id <asset_group_id>`}],output:{kind:`json`,description:`List the assets linked to one Performance Max asset group, including each exact AssetGroupAsset resource name, field type, status, asset ID and image dimensions. Defaults to non-removed links. Use before adding or unlinking assets, and again to verify the result.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/asset-group-assets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_asset_group_product_filters`,path:[`google-ads`,`asset-group-product-filters`,`get`],summary:`Read and normalize Merchant Center product filters attached to one Performance Max asset group or every asset group in a campaign.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`asset_group_id`,flag:`--asset-group-id`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads asset-group-product-filters get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read and normalize Merchant Center product filters attached to one Performance Max asset group or every asset group in a campaign.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/asset-group-product-filters/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_asset_groups`,path:[`google-ads`,`asset-groups`,`list`],summary:`List asset groups for a Performance Max campaign with status and final URLs.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads asset-groups list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List asset groups for a Performance Max campaign with status and final URLs.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/asset-groups/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_assets`,path:[`google-ads`,`assets`,`list`],summary:`List assets (text, image, video, callout, promotion) for a Google Ads account. Filter by type. Search for an identical CALLOUT or PROMOTION before creating one so reusable account assets are not duplicated.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`TEXT`,`IMAGE`,`YOUTUBE_VIDEO`,`CALLOUT`,`PROMOTION`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads assets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List assets (text, image, video, callout, promotion) for a Google Ads account. Filter by type. Search for an identical CALLOUT or PROMOTION before creating one so reusable account assets are not duplicated.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/assets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_audience_segments`,path:[`google-ads`,`audience-segments`,`list`],summary:"List Google's ready-made audience segments (in-market, affinity, custom). These attach with `audience_id`, and only Performance Max, Demand Gen and App ad groups accept them. For retargeting the client's own site visitors — the usual Display and Search remarketing case — use list_user_lists instead; it is a different resource with a different id.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads audience-segments list --workspace-id <workspaceId>`}],output:{kind:`json`,description:"List Google's ready-made audience segments (in-market, affinity, custom). These attach with `audience_id`, and only Performance Max, Demand Gen and App ad groups accept them. For retargeting the client's own site visitors — the usual Display and Search remarketing case — use list_user_lists instead; it is a different resource with a different id."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/audience-segments/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_campaign_ad_schedules`,path:[`google-ads`,`campaign-ad-schedules`,`get`],summary:`Read the complete recurring weekly ad schedule for a Google Ads campaign. Schedules use the account time zone; an empty result means there is no schedule restriction and the campaign is eligible 24/7.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-ad-schedules get --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`Read the complete recurring weekly ad schedule for a Google Ads campaign. Schedules use the account time zone; an empty result means there is no schedule restriction and the campaign is eligible 24/7.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-ad-schedules/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_assets`,path:[`google-ads`,`campaign-assets`,`list`],summary:`List callout and promotion assets linked at campaign level. Use this before add_assets_to_campaign to avoid duplicate links, and use it for Performance Max offers that cannot be linked to an asset group.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`field_type`,flag:`--field-type`,description:``,required:!1,valueType:`string`,enum:[`CALLOUT`,`PROMOTION`],location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-assets list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List callout and promotion assets linked at campaign level. Use this before add_assets_to_campaign to avoid duplicate links, and use it for Performance Max offers that cannot be linked to an asset group.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-assets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_budgets`,path:[`google-ads`,`campaign-budgets`,`list`],summary:`List campaign budgets for a Google Ads account with usage information.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-budgets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List campaign budgets for a Google Ads account with usage information.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-budgets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_negative_keyword_lists`,path:[`google-ads`,`campaign-negative-keyword-lists`,`list`],summary:`List the negative keyword lists attached to a campaign, with exact link resource names. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-negative-keyword-lists list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List the negative keyword lists attached to a campaign, with exact link resource names. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-negative-keyword-lists/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_negative_keywords`,path:[`google-ads`,`campaign-negative-keywords`,`list`],summary:`List direct negative keyword criteria for one campaign. Shared list members are separate: use list_campaign_negative_keyword_lists. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-negative-keywords list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List direct negative keyword criteria for one campaign. Shared list members are separate: use list_campaign_negative_keyword_lists. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-negative-keywords/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_campaign_performance`,path:[`google-ads`,`campaign-performance`,`get`],summary:`Get campaign performance metrics (impressions, clicks, cost, conversions, CTR, CPC). Supports date ranges and segmentation.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`date_range`,flag:`--date-range`,description:``,required:!1,valueType:`string`,defaultValue:`LAST_30_DAYS`,enum:[`LAST_7_DAYS`,`LAST_14_DAYS`,`LAST_30_DAYS`,`LAST_90_DAYS`,`THIS_MONTH`,`LAST_MONTH`,`CUSTOM`],location:`body`},{name:`start_date`,flag:`--start-date`,description:`YYYY-MM-DD, required when date_range is CUSTOM`,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:`YYYY-MM-DD, required when date_range is CUSTOM`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:``,required:!1,valueType:`json`,location:`body`},{name:`metrics`,flag:`--metrics`,description:`Metrics to retrieve, e.g. metrics.impressions, metrics.clicks, metrics.cost_micros`,required:!1,valueType:`json`,location:`body`},{name:`segments`,flag:`--segments`,description:`Segment fields, e.g. segments.date, segments.device`,required:!1,valueType:`json`,location:`body`},{name:`order_by`,flag:`--order-by`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-performance get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get campaign performance metrics (impressions, clicks, cost, conversions, CTR, CPC). Supports date ranges and segmentation.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-performance/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_google_campaigns`,path:[`google-ads`,`campaigns`,`list`],summary:`List campaigns with optional filters for status and type. Includes budget and bidding information.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`advertising_channel_type`,flag:`--advertising-channel-type`,description:``,required:!1,valueType:`string`,enum:[`SEARCH`,`PERFORMANCE_MAX`,`DISPLAY`,`VIDEO`,`SHOPPING`,`DEMAND_GEN`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaigns list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List campaigns with optional filters for status and type. Includes budget and bidding information.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaigns/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_conversion_actions`,path:[`google-ads`,`conversion-actions`,`list`],summary:`List conversion actions, including primary_for_goal, ownership, and value settings. include_in_conversions_metric is deprecated; use primary_for_goal. Custom goals can still bid on secondary actions. Filter status=REMOVED to inspect removed actions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`REMOVED`,`HIDDEN`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads conversion-actions list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List conversion actions, including primary_for_goal, ownership, and value settings. include_in_conversions_metric is deprecated; use primary_for_goal. Custom goals can still bid on secondary actions. Filter status=REMOVED to inspect removed actions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/conversion-actions/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_customer_conversion_goals`,path:[`google-ads`,`customer-conversion-goals`,`list`],summary:`List existing account-default conversion goals, their exact resource names, and biddability. Customer goals affect all primary actions with matching category and origin in campaigns using account defaults. Campaign overrides and custom goals are independent; custom goals can bid on secondary actions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads customer-conversion-goals list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List existing account-default conversion goals, their exact resource names, and biddability. Customer goals affect all primary actions with matching category and origin in campaigns using account defaults. Campaign overrides and custom goals are independent; custom goals can bid on secondary actions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/customer-conversion-goals/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_customer`,path:[`google-ads`,`customers`,`get`],summary:`Get Google Ads account details including name, currency, timezone, and status.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads customers get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get Google Ads account details including name, currency, timezone, and status.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/customers/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_geo_targets`,path:[`google-ads`,`geo-targets`,`get`],summary:`Search geographic targets by name (countries, regions, cities). Returns geo target constant IDs for campaign targeting.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`query`,flag:`--query`,description:`Location name to search, e.g. 'New York' or 'France'`,required:!0,valueType:`string`,location:`body`},{name:`country_code`,flag:`--country-code`,description:`ISO country code to filter results, e.g. 'US'`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`body`}],examples:[{description:`Example`,command:`adside google-ads geo-targets get --workspace-id <workspaceId> --query <query>`}],output:{kind:`json`,description:`Search geographic targets by name (countries, regions, cities). Returns geo target constant IDs for campaign targeting.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/geo-targets/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.suggest_keyword_ad_groups`,path:[`google-ads`,`keyword-ad-groups`,`suggest`],summary:`Ask Google to assign proposed keywords to the most relevant existing ad groups. Pass real IDs returned by list_ad_groups. Returns normalized keyword and match-type suggestions without adding or changing anything.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`keywords`,flag:`--keywords`,description:``,required:!0,valueType:`json`,location:`body`},{name:`ad_group_ids`,flag:`--ad-group-ids`,description:`Existing ad group IDs from list_ad_groups. Google only suggests among these groups.`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-ad-groups suggest --workspace-id <workspaceId> --keywords '{}' --ad-group-ids '{}'`}],output:{kind:`json`,description:`Ask Google to assign proposed keywords to the most relevant existing ad groups. Pass real IDs returned by list_ad_groups. Returns normalized keyword and match-type suggestions without adding or changing anything.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-ad-groups/suggest`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.generate_keyword_ideas`,path:[`google-ads`,`keyword-ideas`,`generate`],summary:`Generate new Google Search keyword ideas from up to 20 seed terms, a public page, both, or a whole site. Returns historical volume, competition and bid estimates without changing the account. Resolve geo and language IDs first; paginate explicitly with next_page_token.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`seed`,flag:`--seed`,description:`Exactly one seed mode: keywords, one page, both, or a whole site.`,required:!0,valueType:`json`,location:`body`},{name:`geo_target_ids`,flag:`--geo-target-ids`,description:`Geo target IDs from get_geo_targets. Strongly recommended; omitting them requests worldwide ideas.`,required:!1,valueType:`json`,location:`body`},{name:`language_id`,flag:`--language-id`,description:`Language ID from get_languages. Defaults to English (1000).`,required:!1,valueType:`string`,defaultValue:`1000`,location:`body`},{name:`network`,flag:`--network`,description:``,required:!1,valueType:`string`,defaultValue:`GOOGLE_SEARCH`,enum:[`GOOGLE_SEARCH`,`GOOGLE_SEARCH_AND_PARTNERS`],location:`body`},{name:`include_adult_keywords`,flag:`--include-adult-keywords`,description:``,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`include_average_cpc`,flag:`--include-average-cpc`,description:``,required:!1,valueType:`boolean`,defaultValue:!0,location:`body`},{name:`include_monthly_volumes`,flag:`--include-monthly-volumes`,description:`Show the monthly volume series returned for every idea.`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`page_size`,flag:`--page-size`,description:`Ideas to return in this call. Deliberately capped below Google's 10,000-result limit to protect agent context.`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Exact next-page token from a previous call. All other request fields must remain identical.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-ideas generate --workspace-id <workspaceId> --seed '{}'`}],output:{kind:`json`,description:`Generate new Google Search keyword ideas from up to 20 seed terms, a public page, both, or a whole site. Returns historical volume, competition and bid estimates without changing the account. Resolve geo and language IDs first; paginate explicitly with next_page_token.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-ideas/generate`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_keyword_performance`,path:[`google-ads`,`keyword-performance`,`get`],summary:`Get keyword-level performance metrics with quality score breakdown (expected CTR, ad relevance, landing page experience).`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`date_range`,flag:`--date-range`,description:``,required:!1,valueType:`string`,defaultValue:`LAST_30_DAYS`,enum:[`LAST_7_DAYS`,`LAST_14_DAYS`,`LAST_30_DAYS`,`LAST_90_DAYS`,`THIS_MONTH`,`LAST_MONTH`,`CUSTOM`],location:`body`},{name:`start_date`,flag:`--start-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-performance get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get keyword-level performance metrics with quality score breakdown (expected CTR, ad relevance, landing page experience).`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-performance/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.forecast_keyword_plan`,path:[`google-ads`,`keyword-plan`,`forecast`],summary:`Forecast cost plus clicks or conversions for a hypothetical Search keyword plan. Supports Manual CPC, Maximize Clicks and Maximize Conversions. This is a read-only estimate and creates no campaigns, ad groups or keywords.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_groups`,flag:`--ad-groups`,description:`The hypothetical ad-group structure. This does not create anything in Google Ads.`,required:!0,valueType:`json`,location:`body`},{name:`geo_target_ids`,flag:`--geo-target-ids`,description:`Geo target IDs from get_geo_targets.`,required:!1,valueType:`json`,location:`body`},{name:`language_ids`,flag:`--language-ids`,description:``,required:!1,valueType:`json`,location:`body`},{name:`bidding_strategy`,flag:`--bidding-strategy`,description:``,required:!0,valueType:`json`,location:`body`},{name:`currency_code`,flag:`--currency-code`,description:`Omit to use the connected account's currency.`,required:!1,valueType:`string`,location:`body`},{name:`start_date`,flag:`--start-date`,description:`Forecast start in the account time zone. Must be in the future.`,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:`Forecast end in the account time zone, no more than one year ahead.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-plan forecast --workspace-id <workspaceId> --ad-groups '{}' --bidding-strategy '{}'`}],output:{kind:`json`,description:`Forecast cost plus clicks or conversions for a hypothetical Search keyword plan. Supports Manual CPC, Maximize Clicks and Maximize Conversions. This is a read-only estimate and creates no campaigns, ad groups or keywords.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-plan/forecast`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_keyword_plan_metrics`,path:[`google-ads`,`keyword-plan-metrics`,`get`],summary:`Google Keyword Planner data for keywords that are NOT yet in the account: average monthly searches, top-of-page bid range, competition and average CPC, for pre-launch keyword research. Use this to size conquesting or non-brand terms before committing budget. For keywords already running in the account, use get_keyword_performance instead.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`keywords`,flag:`--keywords`,description:`The exact terms to measure. Send them all in one call — Google allows only 1 request/second per account, so splitting is slower, not safer.`,required:!0,valueType:`json`,location:`body`},{name:`geo_target_ids`,flag:`--geo-target-ids`,description:`Geo target constant IDs (from get_geo_targets), e.g. '21137' for California. STRONGLY recommended: omitting this returns worldwide volumes, which can be an order of magnitude higher and is almost never what was asked.`,required:!1,valueType:`json`,location:`body`},{name:`language_id`,flag:`--language-id`,description:`Language constant ID (from get_languages). Defaults to '1000' (English).`,required:!1,valueType:`string`,location:`body`},{name:`network`,flag:`--network`,description:`GOOGLE_SEARCH matches what Keyword Planner shows by default.`,required:!1,valueType:`string`,defaultValue:`GOOGLE_SEARCH`,enum:[`GOOGLE_SEARCH`,`GOOGLE_SEARCH_AND_PARTNERS`],location:`body`},{name:`include_average_cpc`,flag:`--include-average-cpc`,description:`Include the historical average CPC alongside the bid range.`,required:!1,valueType:`boolean`,defaultValue:!0,location:`body`},{name:`include_monthly_volumes`,flag:`--include-monthly-volumes`,description:`Include the 12-month volume series per keyword. Off by default: it multiplies the response size by ~12 and is only useful for seasonality.`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-plan-metrics get --workspace-id <workspaceId> --keywords '{}'`}],output:{kind:`json`,description:`Google Keyword Planner data for keywords that are NOT yet in the account: average monthly searches, top-of-page bid range, competition and average CPC, for pre-launch keyword research. Use this to size conquesting or non-brand terms before committing budget. For keywords already running in the account, use get_keyword_performance instead.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-plan-metrics/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_keywords`,path:[`google-ads`,`keywords`,`list`],summary:`List keywords for an ad group with match type, quality score, and performance data.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keywords list --workspace-id <workspaceId> --ad-group-id <ad_group_id>`}],output:{kind:`json`,description:`List keywords for an ad group with match type, quality score, and performance data.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keywords/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_languages`,path:[`google-ads`,`languages`,`get`],summary:`Search Google Ads language constants by name or ISO code. Returns the language IDs used for language targeting and for keyword planning.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`query`,flag:`--query`,description:`Filter by language name or ISO code, e.g. 'Spanish' or 'es'.`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:200,location:`body`}],examples:[{description:`Example`,command:`adside google-ads languages get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Search Google Ads language constants by name or ISO code. Returns the language IDs used for language targeting and for keyword planning.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/languages/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_negative_keyword_lists`,path:[`google-ads`,`negative-keyword-lists`,`list`],summary:`List active reusable campaign negative keyword lists with member and campaign counts. Does not include account-level or brand lists.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads negative-keyword-lists list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List active reusable campaign negative keyword lists with member and campaign counts. Does not include account-level or brand lists.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/negative-keyword-lists/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_product_filter_values`,path:[`google-ads`,`product-filter-values`,`list`],summary:`List values currently present in a Performance Max campaign's Merchant Center inventory for a supported product filter attribute. Use this before setting filters.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`attribute`,flag:`--attribute`,description:``,required:!0,valueType:`string`,enum:[`product_type_l1`,`product_type_l2`,`product_type_l3`,`product_type_l4`,`product_type_l5`,`brand`,`custom_label_0`,`custom_label_1`,`custom_label_2`,`custom_label_3`,`custom_label_4`],location:`body`},{name:`statuses`,flag:`--statuses`,description:``,required:!1,valueType:`json`,location:`body`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads product-filter-values list --workspace-id <workspaceId> --campaign-id <campaign_id> --attribute product_type_l1`}],output:{kind:`json`,description:`List values currently present in a Performance Max campaign's Merchant Center inventory for a supported product filter attribute. Use this before setting filters.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/product-filter-values/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_search_terms_report`,path:[`google-ads`,`search-terms-report`,`get`],summary:`Get actual search queries that triggered your ads (vs keywords you're targeting). Essential for negative keyword discovery.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`date_range`,flag:`--date-range`,description:``,required:!1,valueType:`string`,defaultValue:`LAST_30_DAYS`,enum:[`LAST_7_DAYS`,`LAST_14_DAYS`,`LAST_30_DAYS`,`LAST_90_DAYS`,`THIS_MONTH`,`LAST_MONTH`,`CUSTOM`],location:`body`},{name:`start_date`,flag:`--start-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads search-terms-report get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get actual search queries that triggered your ads (vs keywords you're targeting). Essential for negative keyword discovery.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/search-terms-report/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_shared_negative_keywords`,path:[`google-ads`,`shared-negative-keywords`,`list`],summary:`List all keyword members of one active shared negative keyword list, including exact resource names for removal.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`shared_set_id`,flag:`--shared-set-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads shared-negative-keywords list --workspace-id <workspaceId> --shared-set-id <shared_set_id>`}],output:{kind:`json`,description:`List all keyword members of one active shared negative keyword list, including exact resource names for removal.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/shared-negative-keywords/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_user_lists`,path:[`google-ads`,`user-lists`,`list`],summary:`List the account's remarketing lists — the people who visited the client's own site, as opposed to the ready-made segments Google publishes (those are list_audience_segments). This is what Display and Search retargeting target. Use it to find the id to pass to add_audience_to_campaign as user_list_id, and to check whether a list has enough members: Google will not serve to a list under roughly 100 people.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads user-lists list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the account's remarketing lists — the people who visited the client's own site, as opposed to the ready-made segments Google publishes (those are list_audience_segments). This is what Display and Search retargeting target. Use it to find the id to pass to add_audience_to_campaign as user_list_id, and to check whether a list has enough members: Google will not serve to a list under roughly 100 people.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/user-lists/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-tag-manager.get_container_config`,path:[`google-tag-manager`,`container-config`,`get`],summary:"Read the tags, triggers and variables of a GTM container, from the published version (`live`) or from a draft workspace.\n\n`live` is what visitors actually execute. A container whose draft holds a perfect setup but was never published tracks nothing, so answer every 'is tracking working' question from `live`.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`container_path`,flag:`--container-path`,description:'The container\'s `path`, as returned by list_gtm_containers — e.g. "accounts/6000123/containers/12345678". Not the GTM-XXXXXX public id.',required:!0,valueType:`string`,location:`body`},{name:`source`,flag:`--source`,description:"`live` reads the published version — what visitors actually execute today, and the only thing that reflects reality. `draft` reads a workspace's unpublished changes. Audit questions are always about `live`; `draft` is for checking work that has not been published yet.",required:!1,valueType:`string`,defaultValue:`live`,enum:[`live`,`draft`],location:`body`},{name:`workspace_path`,flag:`--workspace-path`,description:"Only with source=draft. The workspace `path` to read. Defaults to the container's Default Workspace when omitted.",required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-tag-manager container-config get --workspace-id <workspaceId> --container-path <container_path>`}],output:{kind:`json`,description:"Read the tags, triggers and variables of a GTM container, from the published version (`live`) or from a draft workspace.\n\n`live` is what visitors actually execute. A container whose draft holds a perfect setup but was never published tracks nothing, so answer every 'is tracking working' question from `live`."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-tag-manager/container-config/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-tag-manager.list_gtm_containers`,path:[`google-tag-manager`,`containers`,`list`],summary:`List this client's Google Tag Manager containers. This is the entry point — no other GTM tool can run without a container path from here.
|
|
5
|
+
`);return}V({text:e.data},t);return}if(n){await f(n,e.data),V({saved_to:n,content_type:e.contentType,bytes:e.data.byteLength},t);return}if(process.stdout.isTTY)throw Error(`Binary response detected. Use --out <file> or redirect stdout.`);process.stdout.write(Buffer.from(e.data))}function We(e){let t=e instanceof Error?e.message:`Unknown CLI execution error`;process.stderr.write(`${t}\n`),process.exitCode=1}const Ge={version:`2`,contractHash:`8ccedd4eaab1024dc703225578270f293849ed1d232fdcb1f30ed9c292c873a1`,commands:[{id:`ad-comments.capabilities`,path:[`ad-comments`,`capabilities`],summary:`Read moderation capabilities of connected Meta accounts`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside ad-comments capabilities --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read moderation capabilities of connected Meta accounts`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/ad-comments/capabilities`,auth:`user`}},{id:`ad-comments.hide`,path:[`ad-comments`,`hide`],summary:`Hide an ad comment on Meta`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`surface`,flag:`--surface`,description:``,required:!0,valueType:`string`,enum:[`facebook`,`instagram`],location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside ad-comments hide --workspace-id <workspaceId> --surface facebook --comment-id <commentId>`}],output:{kind:`json`,description:`Hide an ad comment on Meta`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/ad-comments/{surface}/{commentId}/hide`,auth:`user`,requestContentType:`application/json`}},{id:`ad-comments.list`,path:[`ad-comments`,`list`],summary:`Read workspace ad comments grouped by post`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside ad-comments list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read workspace ad comments grouped by post`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/ad-comments`,auth:`user`}},{id:`ad-comments.reply`,path:[`ad-comments`,`reply`],summary:`Post a reply as the owning Page or Instagram account`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`surface`,flag:`--surface`,description:``,required:!0,valueType:`string`,enum:[`facebook`,`instagram`],location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`message`,flag:`--message`,description:``,required:!0,valueType:`string`,location:`body`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside ad-comments reply --workspace-id <workspaceId> --surface facebook --comment-id <commentId> --message <message>`}],output:{kind:`json`,description:`Post a reply as the owning Page or Instagram account`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/ad-comments/{surface}/{commentId}/replies`,auth:`user`,requestContentType:`application/json`}},{id:`ad-comments.unhide`,path:[`ad-comments`,`unhide`],summary:`Restore a hidden ad comment on Meta`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`surface`,flag:`--surface`,description:``,required:!0,valueType:`string`,enum:[`facebook`,`instagram`],location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside ad-comments unhide --workspace-id <workspaceId> --surface facebook --comment-id <commentId>`}],output:{kind:`json`,description:`Restore a hidden ad comment on Meta`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/ad-comments/{surface}/{commentId}/unhide`,auth:`user`,requestContentType:`application/json`}},{id:`assets.archive`,path:[`assets`,`archive`],summary:`Archive an asset`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets archive --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Archive an asset`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}/archive`,auth:`user`}},{id:`assets.batch`,path:[`assets`,`batch`],summary:`Look up assets in this workspace by ID`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`ids`,flag:`--ids`,description:``,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets batch --workspace-id <workspaceId> --ids '{}'`}],output:{kind:`json`,description:`Look up assets in this workspace by ID`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/batch`,auth:`user`,requestContentType:`application/json`}},{id:`assets.delete`,path:[`assets`,`delete`],summary:`Remove an asset and queue storage cleanup`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside assets delete --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Remove an asset and queue storage cleanup`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}`,auth:`user`,requestContentType:`application/json`}},{id:`assets.get`,path:[`assets`,`get`],summary:`Get an asset and its download URL`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets get --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Get an asset and its download URL`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}`,auth:`user`}},{id:`assets.import-url`,path:[`assets`,`import-url`],summary:`Import a public image or video URL into the asset library`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`url`,flag:`--url`,description:``,required:!0,valueType:`url`,location:`body`},{name:`name`,flag:`--name`,description:``,required:!1,valueType:`string`,location:`body`},{name:`tags`,flag:`--tags`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets import-url --workspace-id <workspaceId> --url https://example.com`}],output:{kind:`json`,description:`Import a public image or video URL into the asset library`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/imports/url`,auth:`user`,requestContentType:`application/json`}},{id:`assets.list`,path:[`assets`,`list`],summary:`List the workspace's assets, with filters and cursor pagination`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`query`},{name:`sourceType`,flag:`--source-type`,description:``,required:!1,valueType:`json`,location:`query`},{name:`category`,flag:`--category`,description:``,required:!1,valueType:`json`,location:`query`},{name:`tags`,flag:`--tags`,description:``,required:!1,valueType:`json`,location:`query`},{name:`mediaType`,flag:`--media-type`,description:``,required:!1,valueType:`json`,location:`query`},{name:`dateAddedFrom`,flag:`--date-added-from`,description:``,required:!1,valueType:`string`,location:`query`},{name:`dateAddedTo`,flag:`--date-added-to`,description:``,required:!1,valueType:`string`,location:`query`},{name:`minSizeBytes`,flag:`--min-size-bytes`,description:``,required:!1,valueType:`number`,location:`query`},{name:`maxSizeBytes`,flag:`--max-size-bytes`,description:``,required:!1,valueType:`number`,location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`PENDING`,`PROCESSING`,`READY`,`FAILED`,`ARCHIVED`,`PENDING_DELETION`],location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`sortBy`,flag:`--sort-by`,description:``,required:!1,valueType:`string`,defaultValue:`createdAt`,enum:[`createdAt`,`name`,`fileSize`],location:`query`},{name:`sortOrder`,flag:`--sort-order`,description:``,required:!1,valueType:`string`,defaultValue:`desc`,enum:[`asc`,`desc`],location:`query`}],examples:[{description:`Example`,command:`adside assets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the workspace's assets, with filters and cursor pagination`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/assets`,auth:`user`}},{id:`assets.readiness`,path:[`assets`,`status`],summary:`Check asset processing and upload readiness`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`ids`,flag:`--ids`,description:``,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets status --workspace-id <workspaceId> --ids '{}'`}],output:{kind:`json`,description:`Check asset processing and upload readiness`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/status`,auth:`user`,requestContentType:`application/json`}},{id:`assets.tags.list`,path:[`assets`,`tags`,`list`],summary:`List the workspace's most-used asset tags`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets tags list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the workspace's most-used asset tags`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/assets/tags`,auth:`user`}},{id:`assets.tags.update`,path:[`assets`,`tags`,`update`],summary:`Add or remove asset tags`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`add`,flag:`--add`,description:``,required:!1,valueType:`json`,location:`body`},{name:`remove`,flag:`--remove`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets tags update --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Add or remove asset tags`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}/tags`,auth:`user`,requestContentType:`application/json`}},{id:`assets.transcription`,path:[`assets`,`transcription`],summary:`Request or read a video transcription`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets transcription --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Request or read a video transcription`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}/transcription`,auth:`user`}},{id:`assets.update`,path:[`assets`,`update`],summary:`Update asset metadata`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`name`,flag:`--name`,description:``,required:!1,valueType:`string`,location:`body`},{name:`description`,flag:`--description`,description:``,required:!1,valueType:`string`,location:`body`},{name:`category`,flag:`--category`,description:``,required:!1,valueType:`string`,enum:[`UNKNOWN`,`LOGO`,`PRODUCT`,`LIFESTYLE`,`BANNER`,`ICON`,`BACKGROUND`,`SCREENSHOT`,`AD_CREATIVE`,`OTHER`],location:`body`},{name:`tags`,flag:`--tags`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside assets update --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Update asset metadata`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/assets/{assetId}`,auth:`user`,requestContentType:`application/json`}},{id:`assets.uploads.complete`,path:[`assets`,`uploads`,`complete`],summary:`Publish an uploaded asset (safe to repeat)`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside assets uploads complete --workspace-id <workspaceId> --asset-id <assetId>`}],output:{kind:`json`,description:`Publish an uploaded asset (safe to repeat)`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/uploads/{assetId}/complete`,auth:`user`}},{id:`assets.uploads.create`,path:[`assets`,`uploads`,`create`],summary:`Reserve a media upload and return a single-file upload ticket`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`filename`,flag:`--filename`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentType`,flag:`--content-type`,description:``,required:!0,valueType:`string`,location:`body`},{name:`sizeBytes`,flag:`--size-bytes`,description:``,required:!0,valueType:`number`,location:`body`},{name:`purpose`,flag:`--purpose`,description:``,required:!1,valueType:`string`,defaultValue:`library`,enum:[`library`,`attachment`],location:`body`}],examples:[{description:`Example`,command:`adside assets uploads create --workspace-id <workspaceId> --filename <filename> --content-type <contentType> --size-bytes 1`}],output:{kind:`json`,description:`Reserve a media upload and return a single-file upload ticket`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/assets/uploads`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.confirm`,path:[`audiences`,`imports`,`confirm`],summary:`Approve the exact mapping and send the customer list to the channel`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`selection`,flag:`--selection`,description:`Column selection. Omit for a prepared CSV to approve its stored identity mapping.`,required:!1,valueType:`json`,location:`body`},{name:`fullNameOrder`,flag:`--full-name-order`,description:``,required:!1,valueType:`string`,defaultValue:`given-first`,enum:[`given-first`,`family-first`],location:`body`},{name:`audienceName`,flag:`--audience-name`,description:``,required:!1,valueType:`string`,location:`body`},{name:`defaultCountryCallingCode`,flag:`--default-country-calling-code`,description:``,required:!1,valueType:`string`,location:`body`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports confirm --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Approve the exact mapping and send the customer list to the channel`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports/{jobId}/confirm`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.create`,path:[`audiences`,`imports`,`create`],summary:`Prepare an audience import for explicit confirmation`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`filePath`,flag:`--file-path`,description:``,required:!1,valueType:`string`,location:`body`},{name:`channel`,flag:`--channel`,description:``,required:!0,valueType:`string`,enum:[`META`,`LINKEDIN`],location:`body`},{name:`audienceName`,flag:`--audience-name`,description:``,required:!0,valueType:`string`,location:`body`},{name:`audienceDescription`,flag:`--audience-description`,description:``,required:!1,valueType:`string`,location:`body`},{name:`columnMapping`,flag:`--column-mapping`,description:``,required:!1,valueType:`json`,location:`body`},{name:`fullNameOrder`,flag:`--full-name-order`,description:``,required:!1,valueType:`string`,enum:[`given-first`,`family-first`],location:`body`},{name:`preparedCsv`,flag:`--prepared-csv`,description:`Validate a sandbox-prepared UTF-8 CSV with exact channel identifier headers, split names and international phones. Infer the mapping from those headers.`,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports create --workspace-id <workspaceId> --channel META --audience-name <audienceName>`}],output:{kind:`json`,description:`Prepare an audience import for explicit confirmation`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.get`,path:[`audiences`,`imports`,`get`],summary:`Read audience mapping and import progress`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside audiences imports get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read audience mapping and import progress`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audience-imports/{jobId}`,auth:`user`}},{id:`audiences.imports.list`,path:[`audiences`,`imports`,`list`],summary:`List audience import outcomes`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`take`,flag:`--take`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`query`}],examples:[{description:`Example`,command:`adside audiences imports list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List audience import outcomes`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audience-imports`,auth:`user`}},{id:`audiences.imports.preview`,path:[`audiences`,`imports`,`preview`],summary:`Inspect a CSV or spreadsheet before mapping audience identifiers`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`assetId`,flag:`--asset-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`filePath`,flag:`--file-path`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports preview --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Inspect a CSV or spreadsheet before mapping audience identifiers`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports/preview`,auth:`user`,requestContentType:`application/json`}},{id:`audiences.imports.retry`,path:[`audiences`,`imports`,`retry`],summary:`Resume a failed import with its immutable approved mapping`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside audiences imports retry --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Resume a failed import with its immutable approved mapping`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/audience-imports/{jobId}/retry`,auth:`user`,requestContentType:`application/json`}},{id:`audit.get`,path:[`audit`,`get`],summary:`Read a campaign change or explicitly uncertain platform activity`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`eventId`,flag:`--event-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside audit get --workspace-id <workspaceId> --event-id <eventId>`}],output:{kind:`json`,description:`Read a campaign change or explicitly uncertain platform activity`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audit-events/{eventId}`,auth:`user`}},{id:`audit.list`,path:[`audit`,`list`],summary:`Read campaign audit history with current access to explanations and sources`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`scope`,flag:`--scope`,description:``,required:!1,valueType:`string`,defaultValue:`workspace`,enum:[`workspace`,`organization`],location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`eventType`,flag:`--event-type`,description:``,required:!1,valueType:`string`,location:`query`},{name:`resourceType`,flag:`--resource-type`,description:``,required:!1,valueType:`string`,location:`query`},{name:`provider`,flag:`--provider`,description:``,required:!1,valueType:`string`,location:`query`},{name:`resourceId`,flag:`--resource-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`actorUserId`,flag:`--actor-user-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`from`,flag:`--from`,description:``,required:!1,valueType:`string`,location:`query`},{name:`to`,flag:`--to`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside audit list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read campaign audit history with current access to explanations and sources`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/audit-events`,auth:`user`}},{id:`bookmarks.add-to-board`,path:[`boards`,`bookmarks`,`add-to-board`],summary:`Add a saved item to another board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`bookmarkId`,flag:`--bookmark-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards bookmarks add-to-board --workspace-id <workspaceId> --bookmark-id <bookmarkId> --board-id <boardId>`}],output:{kind:`json`,description:`Add a saved item to another board`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/bookmarks/{bookmarkId}/boards`,auth:`user`,requestContentType:`application/json`}},{id:`bookmarks.list`,path:[`boards`,`bookmarks`,`list`],summary:`List saved ads and inspiration`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`kind`,flag:`--kind`,description:``,required:!1,valueType:`string`,enum:[`AD`,`INSPIRATION_ITEM`],location:`query`},{name:`trackedCompanyId`,flag:`--tracked-company-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`boardId`,flag:`--board-id`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside boards bookmarks list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List saved ads and inspiration`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/bookmarks`,auth:`user`}},{id:`bookmarks.move`,path:[`boards`,`bookmarks`,`move`],summary:`Move a saved item between boards`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`bookmarkId`,flag:`--bookmark-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`fromBoardId`,flag:`--from-board-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`toBoardId`,flag:`--to-board-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards bookmarks move --workspace-id <workspaceId> --bookmark-id <bookmarkId> --from-board-id <fromBoardId> --to-board-id <toBoardId>`}],output:{kind:`json`,description:`Move a saved item between boards`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/bookmarks/{bookmarkId}`,auth:`user`,requestContentType:`application/json`}},{id:`bookmarks.remove`,path:[`boards`,`bookmarks`,`remove`],summary:`Remove a saved item or board membership`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`bookmarkId`,flag:`--bookmark-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside boards bookmarks remove --workspace-id <workspaceId> --bookmark-id <bookmarkId>`}],output:{kind:`json`,description:`Remove a saved item or board membership`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/bookmarks/{bookmarkId}`,auth:`user`}},{id:`bookmarks.save`,path:[`boards`,`bookmarks`,`save`],summary:`Save an ad or inspiration item to a board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`kind`,flag:`--kind`,description:``,required:!0,valueType:`string`,enum:[`AD`,`INSPIRATION_ITEM`],location:`body`},{name:`adArchiveId`,flag:`--ad-archive-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`channel`,flag:`--channel`,description:``,required:!1,valueType:`string`,enum:[`META`,`GOOGLE`,`LINKEDIN`],location:`body`},{name:`trackedCompanyId`,flag:`--tracked-company-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`boardId`,flag:`--board-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`comment`,flag:`--comment`,description:``,required:!1,valueType:`string`,location:`body`},{name:`itemId`,flag:`--item-id`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards bookmarks save --workspace-id <workspaceId> --kind AD`}],output:{kind:`json`,description:`Save an ad or inspiration item to a board`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/bookmarks`,auth:`user`,requestContentType:`application/json`}},{id:`boards.create`,path:[`boards`,`create`],summary:`Create a board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`name`,flag:`--name`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards create --workspace-id <workspaceId> --name <name>`}],output:{kind:`json`,description:`Create a board`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/boards`,auth:`user`,requestContentType:`application/json`}},{id:`boards.delete`,path:[`boards`,`delete`],summary:`Delete a non-default board and its exclusive saved ads`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`confirmationToken`,flag:`--confirmation-token`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards delete --workspace-id <workspaceId> --board-id <boardId>`}],output:{kind:`json`,description:`Delete a non-default board and its exclusive saved ads`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/boards/{boardId}`,auth:`user`,requestContentType:`application/json`}},{id:`boards.list`,path:[`boards`,`list`],summary:`List boards and saved-ad counts`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside boards list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List boards and saved-ad counts`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/boards`,auth:`user`}},{id:`boards.update`,path:[`boards`,`update`],summary:`Rename a board`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`boardId`,flag:`--board-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`name`,flag:`--name`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside boards update --workspace-id <workspaceId> --board-id <boardId>`}],output:{kind:`json`,description:`Rename a board`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/boards/{boardId}`,auth:`user`,requestContentType:`application/json`}},{id:`brain.ingest`,path:[`brain`,`ingest`,`create`],summary:`ingest Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`org`,`workspace`],location:`body`},{name:`registration`,flag:`--registration`,description:``,required:!0,valueType:`json`,location:`body`},{name:`instructions`,flag:`--instructions`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain ingest create --workspace-id <workspaceId> --tier org --registration '{}'`}],output:{kind:`json`,description:`ingest Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/ingest`,auth:`user`,requestContentType:`application/json`}},{id:`brain.job`,path:[`brain`,`ingest`,`get`],summary:`job Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brain ingest get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`job Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/ingest/jobs/{jobId}`,auth:`user`}},{id:`brain.jobs`,path:[`brain`,`ingest`,`list`],summary:`jobs Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!1,valueType:`string`,enum:[`org`,`workspace`],location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`PENDING`,`EXTRACTING`,`INGESTING`,`COMPLETED`,`FAILED`],location:`query`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside brain ingest list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`jobs Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/ingest/jobs`,auth:`user`}},{id:`brain.tree`,path:[`brain`,`list`],summary:`tree Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`workspace`,`org`],location:`query`},{name:`path`,flag:`--path`,description:``,required:!1,valueType:`string`,defaultValue:``,location:`query`}],examples:[{description:`Example`,command:`adside brain list --workspace-id <workspaceId> --tier workspace`}],output:{kind:`json`,description:`tree Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/tree`,auth:`user`}},{id:`brain.orgIngest`,path:[`brain`,`organization`,`ingest`,`create`],summary:`ingest Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`org`],location:`body`},{name:`registration`,flag:`--registration`,description:``,required:!0,valueType:`json`,location:`body`},{name:`instructions`,flag:`--instructions`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain organization ingest create --organization-id <organizationId> --tier org --registration '{}'`}],output:{kind:`json`,description:`ingest Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/organizations/{organizationId}/brain/ingest`,auth:`user`,requestContentType:`application/json`}},{id:`brain.orgJob`,path:[`brain`,`organization`,`ingest`,`get`],summary:`job Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brain organization ingest get --organization-id <organizationId> --job-id <jobId>`}],output:{kind:`json`,description:`job Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/brain/ingest/jobs/{jobId}`,auth:`user`}},{id:`brain.orgJobs`,path:[`brain`,`organization`,`ingest`,`list`],summary:`jobs Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!1,valueType:`string`,enum:[`org`,`workspace`],location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`PENDING`,`EXTRACTING`,`INGESTING`,`COMPLETED`,`FAILED`],location:`query`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside brain organization ingest list --organization-id <organizationId>`}],output:{kind:`json`,description:`jobs Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/brain/ingest/jobs`,auth:`user`}},{id:`brain.orgUpload`,path:[`brain`,`organization`,`uploads`,`create`],summary:`upload Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`filename`,flag:`--filename`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentType`,flag:`--content-type`,description:``,required:!0,valueType:`string`,enum:[`application/pdf`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`text/plain`,`text/markdown`,`message/rfc822`,`application/zip`,`application/x-zip-compressed`],location:`body`},{name:`sizeBytes`,flag:`--size-bytes`,description:``,required:!0,valueType:`number`,location:`body`}],examples:[{description:`Example`,command:`adside brain organization uploads create --organization-id <organizationId> --filename <filename> --content-type application/pdf --size-bytes 1`}],output:{kind:`json`,description:`upload Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/organizations/{organizationId}/brain/uploads`,auth:`user`,requestContentType:`application/json`}},{id:`brain.page`,path:[`brain`,`read`],summary:`page Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`workspace`,`org`],location:`query`},{name:`path`,flag:`--path`,description:``,required:!0,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside brain read --workspace-id <workspaceId> --tier workspace --path <path>`}],output:{kind:`json`,description:`page Brain content and document ingestion`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brain/page`,auth:`user`}},{id:`brain.remember`,path:[`brain`,`remember`],summary:`Remember durable workspace facts in memory.md; applied in the background`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`facts`,flag:`--facts`,description:`This turn's durable facts and corrections, in plain sentences`,required:!0,valueType:`string`,location:`body`},{name:`topic`,flag:`--topic`,description:`Keep the detail in memory/<topic>.md, e.g. decisions or goals-and-targets`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain remember --workspace-id <workspaceId> --facts <facts>`}],output:{kind:`json`,description:`Remember durable workspace facts in memory.md; applied in the background`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/memory`,auth:`user`,requestContentType:`application/json`}},{id:`brain.search`,path:[`brain`,`search`],summary:`Search Brain pages with bounded keyword scanning`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`query`,flag:`--query`,description:``,required:!0,valueType:`string`,location:`body`},{name:`tiers`,flag:`--tiers`,description:``,required:!1,valueType:`json`,location:`body`},{name:`directory`,flag:`--directory`,description:``,required:!1,valueType:`string`,location:`body`},{name:`maxResults`,flag:`--max-results`,description:``,required:!1,valueType:`number`,defaultValue:10,location:`body`}],examples:[{description:`Example`,command:`adside brain search --workspace-id <workspaceId> --query <query>`}],output:{kind:`json`,description:`Search Brain pages with bounded keyword scanning`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/search`,auth:`user`,requestContentType:`application/json`}},{id:`brain.upload`,path:[`brain`,`uploads`,`create`],summary:`upload Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`filename`,flag:`--filename`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentType`,flag:`--content-type`,description:``,required:!0,valueType:`string`,enum:[`application/pdf`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`text/plain`,`text/markdown`,`message/rfc822`,`application/zip`,`application/x-zip-compressed`],location:`body`},{name:`sizeBytes`,flag:`--size-bytes`,description:``,required:!0,valueType:`number`,location:`body`}],examples:[{description:`Example`,command:`adside brain uploads create --workspace-id <workspaceId> --filename <filename> --content-type application/pdf --size-bytes 1`}],output:{kind:`json`,description:`upload Brain content and document ingestion`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/brain/uploads`,auth:`user`,requestContentType:`application/json`}},{id:`brain.write`,path:[`brain`,`write`],summary:`write Brain content and document ingestion`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`tier`,flag:`--tier`,description:``,required:!0,valueType:`string`,enum:[`org`,`workspace`],location:`body`},{name:`path`,flag:`--path`,description:``,required:!0,valueType:`string`,location:`body`},{name:`content`,flag:`--content`,description:``,required:!0,valueType:`string`,location:`body`},{name:`contentFormat`,flag:`--content-format`,description:``,required:!1,valueType:`string`,defaultValue:`body`,enum:[`body`,`document`],location:`body`},{name:`commitMessage`,flag:`--commit-message`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside brain write --workspace-id <workspaceId> --tier org --path <path> --content <content>`}],output:{kind:`json`,description:`write Brain content and document ingestion`},transport:{type:`rest`,method:`PUT`,path:`/v1/workspaces/{workspaceId}/brain/page`,auth:`user`,requestContentType:`application/json`}},{id:`brands.details`,path:[`brands`,`details`],summary:`Read the default brand identity, products and capped website evidence`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brands details --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read the default brand identity, products and capped website evidence`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brand-details`,auth:`user`}},{id:`brands.get`,path:[`brands`,`get`],summary:`Get a brand kit`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`brandKitId`,flag:`--brand-kit-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brands get --workspace-id <workspaceId> --brand-kit-id <brandKitId>`}],output:{kind:`json`,description:`Get a brand kit`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brand-kits/{brandKitId}`,auth:`user`}},{id:`brands.list`,path:[`brands`,`list`],summary:`List brand kits`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside brands list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List brand kits`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/brand-kits`,auth:`user`}},{id:`creatives.by-request-id`,path:[`creatives`,`by-request-id`],summary:`Recover the exact receipt of a create request without resubmitting`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:``,required:!0,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside creatives by-request-id --workspace-id <workspaceId> --request-id <requestId>`}],output:{kind:`json`,description:`Recover the exact receipt of a create request without resubmitting`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/by-request-id`,auth:`user`}},{id:`creatives.cancel`,path:[`creatives`,`cancel`],summary:`Request cancellation of an exact run, retaining published work`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`runId`,flag:`--run-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives cancel --workspace-id <workspaceId> --drop-id <dropId> --run-id <runId>`}],output:{kind:`json`,description:`Request cancellation of an exact run, retaining published work`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/runs/{runId}/cancel`,auth:`user`}},{id:`creatives.comments.create`,path:[`creatives`,`comments`,`create`],summary:`Pin feedback to a creative revision`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeRevisionId`,flag:`--creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`target`,flag:`--target`,description:``,required:!0,valueType:`json`,location:`body`},{name:`body`,flag:`--body`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside creatives comments create --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --creative-revision-id <creativeRevisionId> --target '{}' --body <body>`}],output:{kind:`json`,description:`Pin feedback to a creative revision`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/comments`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.comments.delete`,path:[`creatives`,`comments`,`delete`],summary:`Remove your unsubmitted creative feedback`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives comments delete --workspace-id <workspaceId> --drop-id <dropId> --comment-id <commentId>`}],output:{kind:`json`,description:`Remove your unsubmitted creative feedback`},transport:{type:`rest`,method:`DELETE`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/comments/{commentId}`,auth:`user`}},{id:`creatives.comments.update`,path:[`creatives`,`comments`,`update`],summary:`Update your unsubmitted creative feedback`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`commentId`,flag:`--comment-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`body`,flag:`--body`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside creatives comments update --workspace-id <workspaceId> --drop-id <dropId> --comment-id <commentId> --body <body>`}],output:{kind:`json`,description:`Update your unsubmitted creative feedback`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/comments/{commentId}`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.copy`,path:[`creatives`,`copy`],summary:`Save export copy against an exact creative revision`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`baseCreativeRevisionId`,flag:`--base-creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`copy`,flag:`--copy`,description:``,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside creatives copy --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --base-creative-revision-id <baseCreativeRevisionId> --copy '{}'`}],output:{kind:`json`,description:`Save export copy against an exact creative revision`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/copy`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.create`,path:[`creatives`,`create`],summary:`Start a creative drop; the sandbox reserves and generates its first batch. Omit creative count for Auto (brief quantity, otherwise 5).`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`creativeCount`,flag:`--creative-count`,description:`Exact quantity, overriding the prompt. Omit for Auto: infer from the prompt, or use 5 when unspecified.`,required:!1,valueType:`number`,location:`body`},{name:`references`,flag:`--references`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside creatives create --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Start a creative drop; the sandbox reserves and generates its first batch. Omit creative count for Auto (brief quantity, otherwise 5).`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.get`,path:[`creatives`,`get`],summary:`Read stable creative IDs, numbers and current render revisions`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives get --workspace-id <workspaceId> --drop-id <dropId>`}],output:{kind:`json`,description:`Read stable creative IDs, numbers and current render revisions`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}`,auth:`user`}},{id:`creatives.list`,path:[`creatives`,`list`],summary:`List creative drops and their current rendered previews`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`offset`,flag:`--offset`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`query`,flag:`--query`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside creatives list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List creative drops and their current rendered previews`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives`,auth:`user`}},{id:`creatives.messages.create`,path:[`creatives`,`messages`,`create`],summary:`Send a live drop conversation input`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`instruction`,flag:`--instruction`,description:``,required:!0,valueType:`string`,location:`body`},{name:`references`,flag:`--references`,description:``,required:!1,valueType:`json`,location:`body`},{name:`expectedCreativeRevisionIds`,flag:`--expected-creative-revision-ids`,description:``,required:!1,valueType:`json`,location:`body`},{name:`targets`,flag:`--targets`,description:``,required:!1,valueType:`json`,location:`body`},{name:`commentIds`,flag:`--comment-ids`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside creatives messages create --workspace-id <workspaceId> --drop-id <dropId> --instruction <instruction>`}],output:{kind:`json`,description:`Send a live drop conversation input`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.messages.list`,path:[`creatives`,`messages`,`list`],summary:`Read the shared drop conversation`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives messages list --workspace-id <workspaceId> --drop-id <dropId>`}],output:{kind:`json`,description:`Read the shared drop conversation`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages`,auth:`user`}},{id:`creatives.messages.resume`,path:[`creatives`,`messages`,`resume`],summary:`Explicitly resume a held conversation input`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`messageId`,flag:`--message-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives messages resume --workspace-id <workspaceId> --drop-id <dropId> --message-id <messageId>`}],output:{kind:`json`,description:`Explicitly resume a held conversation input`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages/{messageId}/resume`,auth:`user`}},{id:`creatives.messages.stop`,path:[`creatives`,`messages`,`stop`],summary:`Stop an exact conversation input`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`messageId`,flag:`--message-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives messages stop --workspace-id <workspaceId> --drop-id <dropId> --message-id <messageId>`}],output:{kind:`json`,description:`Stop an exact conversation input`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/messages/{messageId}/stop`,auth:`user`}},{id:`creatives.revert`,path:[`creatives`,`revert`],summary:`Restore a creative revision without changing other creatives`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeRevisionId`,flag:`--creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`expectedCreativeRevisionId`,flag:`--expected-creative-revision-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside creatives revert --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --creative-revision-id <creativeRevisionId> --expected-creative-revision-id <expectedCreativeRevisionId>`}],output:{kind:`json`,description:`Restore a creative revision without changing other creatives`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/revert`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.review`,path:[`creatives`,`review`],summary:`Select or discard a creative for campaigns`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`reviewStatus`,flag:`--review-status`,description:``,required:!0,valueType:`string`,enum:[`unreviewed`,`kept`,`discarded`],location:`body`}],examples:[{description:`Example`,command:`adside creatives review --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --review-status unreviewed`}],output:{kind:`json`,description:`Select or discard a creative for campaigns`},transport:{type:`rest`,method:`PATCH`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/review`,auth:`user`,requestContentType:`application/json`}},{id:`creatives.revisions.get`,path:[`creatives`,`revisions`,`get`],summary:`Read a historical creative revision and its published media and copy`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeId`,flag:`--creative-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creativeRevisionId`,flag:`--creative-revision-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives revisions get --workspace-id <workspaceId> --drop-id <dropId> --creative-id <creativeId> --creative-revision-id <creativeRevisionId>`}],output:{kind:`json`,description:`Read a historical creative revision and its published media and copy`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/items/{creativeId}/revisions/{creativeRevisionId}`,auth:`user`}},{id:`creatives.runs.by-request-id`,path:[`creatives`,`runs`,`by-request-id`],summary:`Recover the exact receipt of an edit request without resubmitting`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`requestId`,flag:`--request-id`,description:``,required:!0,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside creatives runs by-request-id --workspace-id <workspaceId> --drop-id <dropId> --request-id <requestId>`}],output:{kind:`json`,description:`Recover the exact receipt of an edit request without resubmitting`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/runs/by-request-id`,auth:`user`}},{id:`creatives.status`,path:[`creatives`,`status`],aliases:[[`creatives`,`result`]],summary:`Read an exact run's progress, terminal result and cleanup state`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`dropId`,flag:`--drop-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`runId`,flag:`--run-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside creatives status --workspace-id <workspaceId> --drop-id <dropId> --run-id <runId>`}],output:{kind:`json`,description:`Read an exact run's progress, terminal result and cleanup state`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/creatives/{dropId}/runs/{runId}`,auth:`user`}},{id:`credits.balance`,path:[`credits`,`balance`],summary:`Read the organization's media generation credit balance`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside credits balance --organization-id <organizationId>`}],output:{kind:`json`,description:`Read the organization's media generation credit balance`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/credits`,auth:`user`}},{id:`credits.ledger`,path:[`credits`,`ledger`],summary:`List where the organization's media generation credit went, newest first`,description:``,source:`rest`,options:[{name:`organizationId`,flag:`--organization-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`runId`,flag:`--run-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`jobId`,flag:`--job-id`,description:``,required:!1,valueType:`string`,location:`query`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`starting_credit`,`top_up`,`charge`,`reversal`,`adjustment`],location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:50,location:`query`}],examples:[{description:`Example`,command:`adside credits ledger --organization-id <organizationId>`}],output:{kind:`json`,description:`List where the organization's media generation credit went, newest first`},transport:{type:`rest`,method:`GET`,path:`/v1/organizations/{organizationId}/credits/ledger`,auth:`user`}},{id:`google-ads.list_accessible_customers`,path:[`google-ads`,`accessible-customers`,`list`],summary:`List the Google Ads customer account this client is connected to. Always returns that one account — other accounts the credentials can reach belong to other clients and are not available here.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside google-ads accessible-customers list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the Google Ads customer account this client is connected to. Always returns that one account — other accounts the credentials can reach belong to other clients and are not available here.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/accessible-customers/list`,auth:`user`}},{id:`google-ads.list_ad_groups`,path:[`google-ads`,`ad-groups`,`list`],summary:`List ad groups for a campaign with bids, status, and rotation settings.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads ad-groups list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List ad groups for a campaign with bids, status, and rotation settings.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/ad-groups/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_google_ads`,path:[`google-ads`,`ads`,`list`],summary:`List ads in an ad group with responsive search/display ad details including headlines, descriptions, and ad strength.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads ads list --workspace-id <workspaceId> --ad-group-id <ad_group_id>`}],output:{kind:`json`,description:`List ads in an ad group with responsive search/display ad details including headlines, descriptions, and ad strength.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/ads/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_asset_group_assets`,path:[`google-ads`,`asset-group-assets`,`list`],summary:`List the assets linked to one Performance Max asset group, including each exact AssetGroupAsset resource name, field type, status, asset ID and image dimensions. Defaults to non-removed links. Use before adding or unlinking assets, and again to verify the result.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`asset_group_id`,flag:`--asset-group-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`field_type`,flag:`--field-type`,description:``,required:!1,valueType:`string`,enum:[`HEADLINE`,`LONG_HEADLINE`,`DESCRIPTION`,`BUSINESS_NAME`,`MARKETING_IMAGE`,`SQUARE_MARKETING_IMAGE`,`PORTRAIT_MARKETING_IMAGE`,`TALL_PORTRAIT_MARKETING_IMAGE`,`LOGO`,`LANDSCAPE_LOGO`,`YOUTUBE_VIDEO`,`CALL_TO_ACTION_SELECTION`],location:`body`},{name:`status`,flag:`--status`,description:`Defaults to all non-removed links`,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`}],examples:[{description:`Example`,command:`adside google-ads asset-group-assets list --workspace-id <workspaceId> --asset-group-id <asset_group_id>`}],output:{kind:`json`,description:`List the assets linked to one Performance Max asset group, including each exact AssetGroupAsset resource name, field type, status, asset ID and image dimensions. Defaults to non-removed links. Use before adding or unlinking assets, and again to verify the result.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/asset-group-assets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_asset_group_product_filters`,path:[`google-ads`,`asset-group-product-filters`,`get`],summary:`Read and normalize Merchant Center product filters attached to one Performance Max asset group or every asset group in a campaign.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`asset_group_id`,flag:`--asset-group-id`,description:``,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads asset-group-product-filters get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read and normalize Merchant Center product filters attached to one Performance Max asset group or every asset group in a campaign.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/asset-group-product-filters/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_asset_groups`,path:[`google-ads`,`asset-groups`,`list`],summary:`List asset groups for a Performance Max campaign with status and final URLs.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads asset-groups list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List asset groups for a Performance Max campaign with status and final URLs.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/asset-groups/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_assets`,path:[`google-ads`,`assets`,`list`],summary:`List assets (text, image, video, callout, promotion) for a Google Ads account. Filter by type. Search for an identical CALLOUT or PROMOTION before creating one so reusable account assets are not duplicated.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`TEXT`,`IMAGE`,`YOUTUBE_VIDEO`,`CALLOUT`,`PROMOTION`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads assets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List assets (text, image, video, callout, promotion) for a Google Ads account. Filter by type. Search for an identical CALLOUT or PROMOTION before creating one so reusable account assets are not duplicated.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/assets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_audience_segments`,path:[`google-ads`,`audience-segments`,`list`],summary:"List Google's ready-made audience segments (in-market, affinity, custom). These attach with `audience_id`, and only Performance Max, Demand Gen and App ad groups accept them. For retargeting the client's own site visitors — the usual Display and Search remarketing case — use list_user_lists instead; it is a different resource with a different id.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads audience-segments list --workspace-id <workspaceId>`}],output:{kind:`json`,description:"List Google's ready-made audience segments (in-market, affinity, custom). These attach with `audience_id`, and only Performance Max, Demand Gen and App ad groups accept them. For retargeting the client's own site visitors — the usual Display and Search remarketing case — use list_user_lists instead; it is a different resource with a different id."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/audience-segments/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_campaign_ad_schedules`,path:[`google-ads`,`campaign-ad-schedules`,`get`],summary:`Read the complete recurring weekly ad schedule for a Google Ads campaign. Schedules use the account time zone; an empty result means there is no schedule restriction and the campaign is eligible 24/7.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-ad-schedules get --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`Read the complete recurring weekly ad schedule for a Google Ads campaign. Schedules use the account time zone; an empty result means there is no schedule restriction and the campaign is eligible 24/7.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-ad-schedules/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_assets`,path:[`google-ads`,`campaign-assets`,`list`],summary:`List callout and promotion assets linked at campaign level. Use this before add_assets_to_campaign to avoid duplicate links, and use it for Performance Max offers that cannot be linked to an asset group.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`field_type`,flag:`--field-type`,description:``,required:!1,valueType:`string`,enum:[`CALLOUT`,`PROMOTION`],location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-assets list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List callout and promotion assets linked at campaign level. Use this before add_assets_to_campaign to avoid duplicate links, and use it for Performance Max offers that cannot be linked to an asset group.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-assets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_budgets`,path:[`google-ads`,`campaign-budgets`,`list`],summary:`List campaign budgets for a Google Ads account with usage information.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-budgets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List campaign budgets for a Google Ads account with usage information.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-budgets/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_negative_keyword_lists`,path:[`google-ads`,`campaign-negative-keyword-lists`,`list`],summary:`List the negative keyword lists attached to a campaign, with exact link resource names. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-negative-keyword-lists list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List the negative keyword lists attached to a campaign, with exact link resource names. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-negative-keyword-lists/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_campaign_negative_keywords`,path:[`google-ads`,`campaign-negative-keywords`,`list`],summary:`List direct negative keyword criteria for one campaign. Shared list members are separate: use list_campaign_negative_keyword_lists. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-negative-keywords list --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:`List direct negative keyword criteria for one campaign. Shared list members are separate: use list_campaign_negative_keyword_lists. Performance Max negatives apply to Search and Shopping inventory only. For own-brand variants, consider brand exclusions. Display/Video negative keywords use contextual matching, not Search query matching.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-negative-keywords/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_campaign_performance`,path:[`google-ads`,`campaign-performance`,`get`],summary:`Get campaign performance metrics (impressions, clicks, cost, conversions, CTR, CPC). Supports date ranges and segmentation.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`date_range`,flag:`--date-range`,description:``,required:!1,valueType:`string`,defaultValue:`LAST_30_DAYS`,enum:[`LAST_7_DAYS`,`LAST_14_DAYS`,`LAST_30_DAYS`,`LAST_90_DAYS`,`THIS_MONTH`,`LAST_MONTH`,`CUSTOM`],location:`body`},{name:`start_date`,flag:`--start-date`,description:`YYYY-MM-DD, required when date_range is CUSTOM`,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:`YYYY-MM-DD, required when date_range is CUSTOM`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:``,required:!1,valueType:`json`,location:`body`},{name:`metrics`,flag:`--metrics`,description:`Metrics to retrieve, e.g. metrics.impressions, metrics.clicks, metrics.cost_micros`,required:!1,valueType:`json`,location:`body`},{name:`segments`,flag:`--segments`,description:`Segment fields, e.g. segments.date, segments.device`,required:!1,valueType:`json`,location:`body`},{name:`order_by`,flag:`--order-by`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaign-performance get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get campaign performance metrics (impressions, clicks, cost, conversions, CTR, CPC). Supports date ranges and segmentation.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaign-performance/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_google_campaigns`,path:[`google-ads`,`campaigns`,`list`],summary:`List campaigns with optional filters for status and type. Includes budget and bidding information.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`advertising_channel_type`,flag:`--advertising-channel-type`,description:``,required:!1,valueType:`string`,enum:[`SEARCH`,`PERFORMANCE_MAX`,`DISPLAY`,`VIDEO`,`SHOPPING`,`DEMAND_GEN`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads campaigns list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List campaigns with optional filters for status and type. Includes budget and bidding information.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/campaigns/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_conversion_actions`,path:[`google-ads`,`conversion-actions`,`list`],summary:`List conversion actions, including primary_for_goal, ownership, and value settings. include_in_conversions_metric is deprecated; use primary_for_goal. Custom goals can still bid on secondary actions. Filter status=REMOVED to inspect removed actions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`REMOVED`,`HIDDEN`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads conversion-actions list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List conversion actions, including primary_for_goal, ownership, and value settings. include_in_conversions_metric is deprecated; use primary_for_goal. Custom goals can still bid on secondary actions. Filter status=REMOVED to inspect removed actions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/conversion-actions/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_customer_conversion_goals`,path:[`google-ads`,`customer-conversion-goals`,`list`],summary:`List existing account-default conversion goals, their exact resource names, and biddability. Customer goals affect all primary actions with matching category and origin in campaigns using account defaults. Campaign overrides and custom goals are independent; custom goals can bid on secondary actions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads customer-conversion-goals list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List existing account-default conversion goals, their exact resource names, and biddability. Customer goals affect all primary actions with matching category and origin in campaigns using account defaults. Campaign overrides and custom goals are independent; custom goals can bid on secondary actions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/customer-conversion-goals/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_customer`,path:[`google-ads`,`customers`,`get`],summary:`Get Google Ads account details including name, currency, timezone, and status.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads customers get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get Google Ads account details including name, currency, timezone, and status.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/customers/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_geo_targets`,path:[`google-ads`,`geo-targets`,`get`],summary:`Search geographic targets by name (countries, regions, cities). Returns geo target constant IDs for campaign targeting.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`query`,flag:`--query`,description:`Location name to search, e.g. 'New York' or 'France'`,required:!0,valueType:`string`,location:`body`},{name:`country_code`,flag:`--country-code`,description:`ISO country code to filter results, e.g. 'US'`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`body`}],examples:[{description:`Example`,command:`adside google-ads geo-targets get --workspace-id <workspaceId> --query <query>`}],output:{kind:`json`,description:`Search geographic targets by name (countries, regions, cities). Returns geo target constant IDs for campaign targeting.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/geo-targets/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.suggest_keyword_ad_groups`,path:[`google-ads`,`keyword-ad-groups`,`suggest`],summary:`Ask Google to assign proposed keywords to the most relevant existing ad groups. Pass real IDs returned by list_ad_groups. Returns normalized keyword and match-type suggestions without adding or changing anything.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`keywords`,flag:`--keywords`,description:``,required:!0,valueType:`json`,location:`body`},{name:`ad_group_ids`,flag:`--ad-group-ids`,description:`Existing ad group IDs from list_ad_groups. Google only suggests among these groups.`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-ad-groups suggest --workspace-id <workspaceId> --keywords '{}' --ad-group-ids '{}'`}],output:{kind:`json`,description:`Ask Google to assign proposed keywords to the most relevant existing ad groups. Pass real IDs returned by list_ad_groups. Returns normalized keyword and match-type suggestions without adding or changing anything.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-ad-groups/suggest`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.generate_keyword_ideas`,path:[`google-ads`,`keyword-ideas`,`generate`],summary:`Generate new Google Search keyword ideas from up to 20 seed terms, a public page, both, or a whole site. Returns historical volume, competition and bid estimates without changing the account. Resolve geo and language IDs first; paginate explicitly with next_page_token.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`seed`,flag:`--seed`,description:`Exactly one seed mode: keywords, one page, both, or a whole site.`,required:!0,valueType:`json`,location:`body`},{name:`geo_target_ids`,flag:`--geo-target-ids`,description:`Geo target IDs from get_geo_targets. Strongly recommended; omitting them requests worldwide ideas.`,required:!1,valueType:`json`,location:`body`},{name:`language_id`,flag:`--language-id`,description:`Language ID from get_languages. Defaults to English (1000).`,required:!1,valueType:`string`,defaultValue:`1000`,location:`body`},{name:`network`,flag:`--network`,description:``,required:!1,valueType:`string`,defaultValue:`GOOGLE_SEARCH`,enum:[`GOOGLE_SEARCH`,`GOOGLE_SEARCH_AND_PARTNERS`],location:`body`},{name:`include_adult_keywords`,flag:`--include-adult-keywords`,description:``,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`include_average_cpc`,flag:`--include-average-cpc`,description:``,required:!1,valueType:`boolean`,defaultValue:!0,location:`body`},{name:`include_monthly_volumes`,flag:`--include-monthly-volumes`,description:`Show the monthly volume series returned for every idea.`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`page_size`,flag:`--page-size`,description:`Ideas to return in this call. Deliberately capped below Google's 10,000-result limit to protect agent context.`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Exact next-page token from a previous call. All other request fields must remain identical.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-ideas generate --workspace-id <workspaceId> --seed '{}'`}],output:{kind:`json`,description:`Generate new Google Search keyword ideas from up to 20 seed terms, a public page, both, or a whole site. Returns historical volume, competition and bid estimates without changing the account. Resolve geo and language IDs first; paginate explicitly with next_page_token.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-ideas/generate`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_keyword_performance`,path:[`google-ads`,`keyword-performance`,`get`],summary:`Get keyword-level performance metrics with quality score breakdown (expected CTR, ad relevance, landing page experience).`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`date_range`,flag:`--date-range`,description:``,required:!1,valueType:`string`,defaultValue:`LAST_30_DAYS`,enum:[`LAST_7_DAYS`,`LAST_14_DAYS`,`LAST_30_DAYS`,`LAST_90_DAYS`,`THIS_MONTH`,`LAST_MONTH`,`CUSTOM`],location:`body`},{name:`start_date`,flag:`--start-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-performance get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get keyword-level performance metrics with quality score breakdown (expected CTR, ad relevance, landing page experience).`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-performance/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.forecast_keyword_plan`,path:[`google-ads`,`keyword-plan`,`forecast`],summary:`Forecast cost plus clicks or conversions for a hypothetical Search keyword plan. Supports Manual CPC, Maximize Clicks and Maximize Conversions. This is a read-only estimate and creates no campaigns, ad groups or keywords.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_groups`,flag:`--ad-groups`,description:`The hypothetical ad-group structure. This does not create anything in Google Ads.`,required:!0,valueType:`json`,location:`body`},{name:`geo_target_ids`,flag:`--geo-target-ids`,description:`Geo target IDs from get_geo_targets.`,required:!1,valueType:`json`,location:`body`},{name:`language_ids`,flag:`--language-ids`,description:``,required:!1,valueType:`json`,location:`body`},{name:`bidding_strategy`,flag:`--bidding-strategy`,description:``,required:!0,valueType:`json`,location:`body`},{name:`currency_code`,flag:`--currency-code`,description:`Omit to use the connected account's currency.`,required:!1,valueType:`string`,location:`body`},{name:`start_date`,flag:`--start-date`,description:`Forecast start in the account time zone. Must be in the future.`,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:`Forecast end in the account time zone, no more than one year ahead.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-plan forecast --workspace-id <workspaceId> --ad-groups '{}' --bidding-strategy '{}'`}],output:{kind:`json`,description:`Forecast cost plus clicks or conversions for a hypothetical Search keyword plan. Supports Manual CPC, Maximize Clicks and Maximize Conversions. This is a read-only estimate and creates no campaigns, ad groups or keywords.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-plan/forecast`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_keyword_plan_metrics`,path:[`google-ads`,`keyword-plan-metrics`,`get`],summary:`Google Keyword Planner data for keywords that are NOT yet in the account: average monthly searches, top-of-page bid range, competition and average CPC, for pre-launch keyword research. Use this to size conquesting or non-brand terms before committing budget. For keywords already running in the account, use get_keyword_performance instead.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`keywords`,flag:`--keywords`,description:`The exact terms to measure. Send them all in one call — Google allows only 1 request/second per account, so splitting is slower, not safer.`,required:!0,valueType:`json`,location:`body`},{name:`geo_target_ids`,flag:`--geo-target-ids`,description:`Geo target constant IDs (from get_geo_targets), e.g. '21137' for California. STRONGLY recommended: omitting this returns worldwide volumes, which can be an order of magnitude higher and is almost never what was asked.`,required:!1,valueType:`json`,location:`body`},{name:`language_id`,flag:`--language-id`,description:`Language constant ID (from get_languages). Defaults to '1000' (English).`,required:!1,valueType:`string`,location:`body`},{name:`network`,flag:`--network`,description:`GOOGLE_SEARCH matches what Keyword Planner shows by default.`,required:!1,valueType:`string`,defaultValue:`GOOGLE_SEARCH`,enum:[`GOOGLE_SEARCH`,`GOOGLE_SEARCH_AND_PARTNERS`],location:`body`},{name:`include_average_cpc`,flag:`--include-average-cpc`,description:`Include the historical average CPC alongside the bid range.`,required:!1,valueType:`boolean`,defaultValue:!0,location:`body`},{name:`include_monthly_volumes`,flag:`--include-monthly-volumes`,description:`Include the 12-month volume series per keyword. Off by default: it multiplies the response size by ~12 and is only useful for seasonality.`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keyword-plan-metrics get --workspace-id <workspaceId> --keywords '{}'`}],output:{kind:`json`,description:`Google Keyword Planner data for keywords that are NOT yet in the account: average monthly searches, top-of-page bid range, competition and average CPC, for pre-launch keyword research. Use this to size conquesting or non-brand terms before committing budget. For keywords already running in the account, use get_keyword_performance instead.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keyword-plan-metrics/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_keywords`,path:[`google-ads`,`keywords`,`list`],summary:`List keywords for an ad group with match type, quality score, and performance data.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`ENABLED`,`PAUSED`,`REMOVED`],location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads keywords list --workspace-id <workspaceId> --ad-group-id <ad_group_id>`}],output:{kind:`json`,description:`List keywords for an ad group with match type, quality score, and performance data.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/keywords/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_languages`,path:[`google-ads`,`languages`,`get`],summary:`Search Google Ads language constants by name or ISO code. Returns the language IDs used for language targeting and for keyword planning.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`query`,flag:`--query`,description:`Filter by language name or ISO code, e.g. 'Spanish' or 'es'.`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:200,location:`body`}],examples:[{description:`Example`,command:`adside google-ads languages get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Search Google Ads language constants by name or ISO code. Returns the language IDs used for language targeting and for keyword planning.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/languages/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_negative_keyword_lists`,path:[`google-ads`,`negative-keyword-lists`,`list`],summary:`List active reusable campaign negative keyword lists with member and campaign counts. Does not include account-level or brand lists.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads negative-keyword-lists list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List active reusable campaign negative keyword lists with member and campaign counts. Does not include account-level or brand lists.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/negative-keyword-lists/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_product_filter_values`,path:[`google-ads`,`product-filter-values`,`list`],summary:`List values currently present in a Performance Max campaign's Merchant Center inventory for a supported product filter attribute. Use this before setting filters.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!0,valueType:`string`,location:`body`},{name:`attribute`,flag:`--attribute`,description:``,required:!0,valueType:`string`,enum:[`product_type_l1`,`product_type_l2`,`product_type_l3`,`product_type_l4`,`product_type_l5`,`brand`,`custom_label_0`,`custom_label_1`,`custom_label_2`,`custom_label_3`,`custom_label_4`],location:`body`},{name:`statuses`,flag:`--statuses`,description:``,required:!1,valueType:`json`,location:`body`},{name:`search`,flag:`--search`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads product-filter-values list --workspace-id <workspaceId> --campaign-id <campaign_id> --attribute product_type_l1`}],output:{kind:`json`,description:`List values currently present in a Performance Max campaign's Merchant Center inventory for a supported product filter attribute. Use this before setting filters.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/product-filter-values/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.get_search_terms_report`,path:[`google-ads`,`search-terms-report`,`get`],summary:`Get actual search queries that triggered your ads (vs keywords you're targeting). Essential for negative keyword discovery.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`ad_group_id`,flag:`--ad-group-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`date_range`,flag:`--date-range`,description:``,required:!1,valueType:`string`,defaultValue:`LAST_30_DAYS`,enum:[`LAST_7_DAYS`,`LAST_14_DAYS`,`LAST_30_DAYS`,`LAST_90_DAYS`,`THIS_MONTH`,`LAST_MONTH`,`CUSTOM`],location:`body`},{name:`start_date`,flag:`--start-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`end_date`,flag:`--end-date`,description:``,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads search-terms-report get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get actual search queries that triggered your ads (vs keywords you're targeting). Essential for negative keyword discovery.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/search-terms-report/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_shared_negative_keywords`,path:[`google-ads`,`shared-negative-keywords`,`list`],summary:`List all keyword members of one active shared negative keyword list, including exact resource names for removal.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`shared_set_id`,flag:`--shared-set-id`,description:``,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-ads shared-negative-keywords list --workspace-id <workspaceId> --shared-set-id <shared_set_id>`}],output:{kind:`json`,description:`List all keyword members of one active shared negative keyword list, including exact resource names for removal.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/shared-negative-keywords/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-ads.list_user_lists`,path:[`google-ads`,`user-lists`,`list`],summary:`List the account's remarketing lists — the people who visited the client's own site, as opposed to the ready-made segments Google publishes (those are list_audience_segments). This is what Display and Search retargeting target. Use it to find the id to pass to add_audience_to_campaign as user_list_id, and to check whether a list has enough members: Google will not serve to a list under roughly 100 people.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`customer_id`,flag:`--customer-id`,description:`Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside google-ads user-lists list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the account's remarketing lists — the people who visited the client's own site, as opposed to the ready-made segments Google publishes (those are list_audience_segments). This is what Display and Search retargeting target. Use it to find the id to pass to add_audience_to_campaign as user_list_id, and to check whether a list has enough members: Google will not serve to a list under roughly 100 people.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-ads/user-lists/list`,auth:`user`,requestContentType:`application/json`}},{id:`google-tag-manager.get_container_config`,path:[`google-tag-manager`,`container-config`,`get`],summary:"Read the tags, triggers and variables of a GTM container, from the published version (`live`) or from a draft workspace.\n\n`live` is what visitors actually execute. A container whose draft holds a perfect setup but was never published tracks nothing, so answer every 'is tracking working' question from `live`.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`container_path`,flag:`--container-path`,description:'The container\'s `path`, as returned by list_gtm_containers — e.g. "accounts/6000123/containers/12345678". Not the GTM-XXXXXX public id.',required:!0,valueType:`string`,location:`body`},{name:`source`,flag:`--source`,description:"`live` reads the published version — what visitors actually execute today, and the only thing that reflects reality. `draft` reads a workspace's unpublished changes. Audit questions are always about `live`; `draft` is for checking work that has not been published yet.",required:!1,valueType:`string`,defaultValue:`live`,enum:[`live`,`draft`],location:`body`},{name:`workspace_path`,flag:`--workspace-path`,description:"Only with source=draft. The workspace `path` to read. Defaults to the container's Default Workspace when omitted.",required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-tag-manager container-config get --workspace-id <workspaceId> --container-path <container_path>`}],output:{kind:`json`,description:"Read the tags, triggers and variables of a GTM container, from the published version (`live`) or from a draft workspace.\n\n`live` is what visitors actually execute. A container whose draft holds a perfect setup but was never published tracks nothing, so answer every 'is tracking working' question from `live`."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-tag-manager/container-config/get`,auth:`user`,requestContentType:`application/json`}},{id:`google-tag-manager.list_gtm_containers`,path:[`google-tag-manager`,`containers`,`list`],summary:`List this client's Google Tag Manager containers. This is the entry point — no other GTM tool can run without a container path from here.
|
|
6
6
|
|
|
7
7
|
Only the GTM account connected for this client is listed. The connected Google login may administer other clients' accounts too; those are never shown and their containers are refused.
|
|
8
8
|
|
|
@@ -10,7 +10,7 @@ Read \`usageContext\` before doing anything else: a \`server\` container has a d
|
|
|
10
10
|
|
|
11
11
|
Only the GTM account connected for this client is listed. The connected Google login may administer other clients' accounts too; those are never shown and their containers are refused.
|
|
12
12
|
|
|
13
|
-
Read \`usageContext\` before doing anything else: a \`server\` container has a different tag-type namespace, so web tags do not exist in it and their absence is normal rather than a problem.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-tag-manager/containers/list`,auth:`user`}},{id:`google-tag-manager.audit_conversion_tracking`,path:[`google-tag-manager`,`conversion-tracking`,`audit`],summary:"Audit what a GTM container actually deploys for conversion tracking, reading the **published** version.\n\nCovers the container half of the audit: base tags (a Google tag on all pages, and something storing the click id), conversion tags without a firing trigger, paused tags, malformed conversion ids, missing consent settings, and the Meta pixel (base code on all pages, conversion events firing on every page, missing sequencing or event id). It ends with the cross-checks to run next with `list_conversion_actions` and `get_account_pixels` — those need the ad accounts and cannot be answered from the container alone.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`container_path`,flag:`--container-path`,description:'The container\'s `path`, from list_gtm_containers — e.g. "accounts/6000123/containers/12345678".',required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-tag-manager conversion-tracking audit --workspace-id <workspaceId> --container-path <container_path>`}],output:{kind:`json`,description:"Audit what a GTM container actually deploys for conversion tracking, reading the **published** version.\n\nCovers the container half of the audit: base tags (a Google tag on all pages, and something storing the click id), conversion tags without a firing trigger, paused tags, malformed conversion ids, missing consent settings, and the Meta pixel (base code on all pages, conversion events firing on every page, missing sequencing or event id). It ends with the cross-checks to run next with `list_conversion_actions` and `get_account_pixels` — those need the ad accounts and cannot be answered from the container alone."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-tag-manager/conversion-tracking/audit`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_ad_account`,path:[`linkedin`,`ad-accounts`,`get`],summary:`Get details of a LinkedIn Ad Account (name, status, currency, type, serving statuses)`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin ad-accounts get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get details of a LinkedIn Ad Account (name, status, currency, type, serving statuses)`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-accounts/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_ad_accounts`,path:[`linkedin`,`ad-accounts`,`list`],summary:`Get the one LinkedIn Ad Account this client is connected to. Every other tool defaults to it, so you rarely need to pass account_id at all — and an account id from anywhere else (memory, an earlier conversation, another client) will be refused.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside linkedin ad-accounts list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get the one LinkedIn Ad Account this client is connected to. Every other tool defaults to it, so you rarely need to pass account_id at all — and an account id from anywhere else (memory, an earlier conversation, another client) will be refused.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-accounts/list`,auth:`user`}},{id:`linkedin.get_ad_segment`,path:[`linkedin`,`ad-segment`,`get`],summary:`Look up one audience segment by its urn:li:adSegment: URN or id. Use this to name a segment found inside a campaign's or saved audience's targeting_criteria: list_ad_segments only returns segments owned by the account in scope, so a segment belonging to a sibling ad account of the same agency appears there as a bare URN. When the segment cannot be read, this says whether it no longer exists or is simply outside this LinkedIn connection's reach — a distinction LinkedIn itself answers with the same 404 for both.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`segment_id`,flag:`--segment-id`,description:`The segment's numeric id, or the full urn:li:adSegment:… as it appears inside a targeting_criteria.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin ad-segment get --workspace-id <workspaceId> --segment-id <segment_id>`}],output:{kind:`json`,description:`Look up one audience segment by its urn:li:adSegment: URN or id. Use this to name a segment found inside a campaign's or saved audience's targeting_criteria: list_ad_segments only returns segments owned by the account in scope, so a segment belonging to a sibling ad account of the same agency appears there as a bare URN. When the segment cannot be read, this says whether it no longer exists or is simply outside this LinkedIn connection's reach — a distinction LinkedIn itself answers with the same 404 for both.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-segment/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_ad_segments`,path:[`linkedin`,`ad-segments`,`list`],summary:`List the audience segments an ad account owns: uploaded contact/company lists (type BULK) and website or engagement retargeting audiences (type RETARGETING). Each result carries the targeting facet its URN belongs under, so it can be dropped straight into a campaign's targeting_criteria. Use this before targeting a matched audience — segment URNs cannot be discovered through search_targeting_facets.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first segment to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many segments to return. LinkedIn defaults to 10 if unset, so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin ad-segments list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the audience segments an ad account owns: uploaded contact/company lists (type BULK) and website or engagement retargeting audiences (type RETARGETING). Each result carries the targeting facet its URN belongs under, so it can be dropped straight into a campaign's targeting_criteria. Use this before targeting a matched audience — segment URNs cannot be discovered through search_targeting_facets.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-segments/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_analytics`,path:[`linkedin`,`analytics`,`get`],summary:`Get performance analytics (impressions, clicks, cost, conversions, etc.) for LinkedIn ad entities. Group by account, campaign group, campaign, or creative with daily/monthly/all-time granularity.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`pivot`,flag:`--pivot`,description:`Dimension to group results by`,required:!0,valueType:`string`,enum:[`ACCOUNT`,`CAMPAIGN_GROUP`,`CAMPAIGN`,`CREATIVE`],location:`body`},{name:`time_granularity`,flag:`--time-granularity`,description:`Time granularity for results`,required:!1,valueType:`string`,defaultValue:`ALL`,enum:[`DAILY`,`MONTHLY`,`ALL`],location:`body`},{name:`date_range_start`,flag:`--date-range-start`,description:`Start date (inclusive)`,required:!0,valueType:`json`,location:`body`},{name:`date_range_end`,flag:`--date-range-end`,description:`End date (inclusive). If omitted, returns data up to now.`,required:!1,valueType:`json`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Filter by campaign IDs`,required:!1,valueType:`json`,location:`body`},{name:`campaign_group_ids`,flag:`--campaign-group-ids`,description:`Filter by campaign group IDs`,required:!1,valueType:`json`,location:`body`},{name:`creative_ids`,flag:`--creative-ids`,description:`Filter by creative URNs`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific metrics to return (max 20). Default: impressions, clicks. Examples: costInLocalCurrency, landingPageClicks, likes, shares, externalWebsiteConversions`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin analytics get --workspace-id <workspaceId> --pivot ACCOUNT --date-range-start '{}'`}],output:{kind:`json`,description:`Get performance analytics (impressions, clicks, cost, conversions, etc.) for LinkedIn ad entities. Group by account, campaign group, campaign, or creative with daily/monthly/all-time granularity.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/analytics/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_audience_size_estimate`,path:[`linkedin`,`audience-size-estimate`,`get`],summary:`Estimate how many LinkedIn members match a targeting criteria. Returns a rounded member count. Call this BEFORE creating a campaign: LinkedIn accepts a campaign with no targeting at all and stores no audience for it, so an unchecked campaign can be created that cannot reach anyone.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`targeting_criteria`,flag:`--targeting-criteria`,description:`Targeting criteria with AND/OR structure. Keys are FACET URNs, not bare names: {"include":{"and":[{"or":{"urn:li:adTargetingFacet:locations":["urn:li:geo:105015875"]}}]}}. A bare "locations" key is refused. Same format as campaign targeting; get the URNs from search_targeting_facets.`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin audience-size-estimate get --workspace-id <workspaceId> --targeting-criteria '{}'`}],output:{kind:`json`,description:`Estimate how many LinkedIn members match a targeting criteria. Returns a rounded member count. Call this BEFORE creating a campaign: LinkedIn accepts a campaign with no targeting at all and stores no audience for it, so an unchecked campaign can be created that cannot reach anyone.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/audience-size-estimate/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_campaign_conversion_rules`,path:[`linkedin`,`campaign-conversion-rules`,`list`],summary:`List which conversion rules are attached to the given campaigns. Use this to answer 'why is this campaign reporting no conversions?' — an unattached rule is credited to nothing. Returns the conversion URNs plus when each was attached; pass those URNs to get_conversion_rule for the detail.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Campaign ids (numeric) or urn:li:sponsoredCampaign: URNs to look up.`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-conversion-rules list --workspace-id <workspaceId> --campaign-ids '{}'`}],output:{kind:`json`,description:`List which conversion rules are attached to the given campaigns. Use this to answer 'why is this campaign reporting no conversions?' — an unattached rule is credited to nothing. Returns the conversion URNs plus when each was attached; pass those URNs to get_conversion_rule for the detail.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-conversion-rules/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_campaign_group`,path:[`linkedin`,`campaign-groups`,`get`],summary:'Get the complete configuration for one LinkedIn campaign group, including schedule, budget, audit/version, objective, and delivery settings. Use list_campaign_groups for discovery and this getter only when full detail is required. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`campaign_group_id`,flag:`--campaign-group-id`,description:`Campaign group ID or urn:li:sponsoredCampaignGroup URN`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-groups get --workspace-id <workspaceId> --campaign-group-id <campaign_group_id>`}],output:{kind:`json`,description:'Get the complete configuration for one LinkedIn campaign group, including schedule, budget, audit/version, objective, and delivery settings. Use list_campaign_groups for discovery and this getter only when full detail is required. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-groups/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_campaign_groups`,path:[`linkedin`,`campaign-groups`,`list`],summary:'Search and list campaign groups for a LinkedIn Ad Account. Filter by status, name, or test flag. Supports cursor-based pagination. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by campaign group status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`ARCHIVED`,`CANCELED`,`DRAFT`,`PAUSED`,`PENDING_DELETION`,`REMOVED`],location:`body`},{name:`name`,flag:`--name`,description:`Filter by campaign group name`,required:!1,valueType:`string`,location:`body`},{name:`test`,flag:`--test`,description:`Filter by test (true) or non-test (false) campaign groups`,required:!1,valueType:`boolean`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by campaign group ID (default: ASCENDING)`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Number of results per page (max 1000)`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page of results`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-groups list --workspace-id <workspaceId>`}],output:{kind:`json`,description:'Search and list campaign groups for a LinkedIn Ad Account. Filter by status, name, or test flag. Supports cursor-based pagination. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-groups/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.verify_campaign_readiness`,path:[`linkedin`,`campaign-readiness`,`verify`],summary:`Verify campaign readiness by checking serving statuses, budget, targeting, and LinkedIn's cross-field campaign rules (objective/format, optimization target/cost type, Connected TV). Returns a diagnostic report with issues and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:`Specific campaign ID to verify. If omitted, checks all ACTIVE campaigns.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-readiness verify --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Verify campaign readiness by checking serving statuses, budget, targeting, and LinkedIn's cross-field campaign rules (objective/format, optimization target/cost type, Connected TV). Returns a diagnostic report with issues and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-readiness/verify`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_linkedin_campaign`,path:[`linkedin`,`campaigns`,`get`],summary:'Get the complete configuration for one LinkedIn campaign, including targetingCriteria, version, schedule, optimization, budget, audit stamps, and delivery settings. Use list/search for discovery, then this getter before any targeting update. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the connected account.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:`Campaign ID or urn:li:sponsoredCampaign URN`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaigns get --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:'Get the complete configuration for one LinkedIn campaign, including targetingCriteria, version, schedule, optimization, budget, audit stamps, and delivery settings. Use list/search for discovery, then this getter before any targeting update. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaigns/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_linkedin_campaigns`,path:[`linkedin`,`campaigns`,`list`],summary:`List campaigns for a LinkedIn Ad Account. Filter by status, type, campaign group, or name. Supports cursor-based pagination. Read servingStatuses, not status, to tell whether a campaign is actually delivering: status is what the advertiser set, servingStatuses is LinkedIn's verdict (RUNNABLE, or a *_HOLD explaining why it is not serving). VOCABULARY: the API's \`campaign\` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by campaign status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`ARCHIVED`,`COMPLETED`,`CANCELED`,`DRAFT`,`PENDING_DELETION`,`REMOVED`],location:`body`},{name:`campaign_group_id`,flag:`--campaign-group-id`,description:`Filter by campaign group ID`,required:!1,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:`Filter by campaign type`,required:!1,valueType:`string`,enum:[`TEXT_AD`,`SPONSORED_UPDATES`,`SPONSORED_INMAILS`,`DYNAMIC`],location:`body`},{name:`name`,flag:`--name`,description:`Filter by campaign name`,required:!1,valueType:`string`,location:`body`},{name:`test`,flag:`--test`,description:`Filter by test (true) or non-test (false)`,required:!1,valueType:`boolean`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by campaign ID (default: ASCENDING)`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Number of results per page (max 1000)`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page of results`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaigns list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List campaigns for a LinkedIn Ad Account. Filter by status, type, campaign group, or name. Supports cursor-based pagination. Read servingStatuses, not status, to tell whether a campaign is actually delivering: status is what the advertiser set, servingStatuses is LinkedIn's verdict (RUNNABLE, or a *_HOLD explaining why it is not serving). VOCABULARY: the API's \`campaign\` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaigns/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.search_campaigns`,path:[`linkedin`,`campaigns`,`search`],summary:'Search campaigns with multiple filters (IDs, statuses, types, campaign groups). More flexible than list_campaigns for complex queries. As with list_linkedin_campaigns, servingStatuses — not status — says whether a campaign is actually delivering. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`List of campaign IDs to fetch`,required:!1,valueType:`json`,location:`body`},{name:`statuses`,flag:`--statuses`,description:`Filter by multiple statuses`,required:!1,valueType:`json`,location:`body`},{name:`campaign_group_ids`,flag:`--campaign-group-ids`,description:`Filter by multiple campaign group IDs`,required:!1,valueType:`json`,location:`body`},{name:`types`,flag:`--types`,description:`Filter by multiple campaign types`,required:!1,valueType:`json`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by campaign ID`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Page size`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaigns search --workspace-id <workspaceId>`}],output:{kind:`json`,description:'Search campaigns with multiple filters (IDs, statuses, types, campaign groups). More flexible than list_campaigns for complex queries. As with list_linkedin_campaigns, servingStatuses — not status — says whether a campaign is actually delivering. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaigns/search`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_conversion_rule`,path:[`linkedin`,`conversion-rule`,`get`],summary:`Get one conversion rule by id, with its attribution settings, value, URL rules, associated campaigns and (for pixel rules) the Insight Tag <img> snippet. Read this before update_conversion_rule so you change only what you mean to — and use it to name a rule id found on a campaign, which list_conversions can only resolve by scanning.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`conversion_rule_id`,flag:`--conversion-rule-id`,description:`The rule's numeric id, or the full urn:lla:llaPartnerConversion:… as it appears in a campaign's conversion list.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin conversion-rule get --workspace-id <workspaceId> --conversion-rule-id <conversion_rule_id>`}],output:{kind:`json`,description:`Get one conversion rule by id, with its attribution settings, value, URL rules, associated campaigns and (for pixel rules) the Insight Tag <img> snippet. Read this before update_conversion_rule so you change only what you mean to — and use it to name a rule id found on a campaign, which list_conversions can only resolve by scanning.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/conversion-rule/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_conversions`,path:[`linkedin`,`conversions`,`list`],summary:"List the conversion rules on a LinkedIn Ad Account: name, type, method, attribution settings, conversion value and enabled status. LinkedIn serves 10 per page, so check `next_start` in the response before concluding you have seen them all.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first rule to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many rules to return. LinkedIn defaults to 10 if unset, so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin conversions list --workspace-id <workspaceId>`}],output:{kind:`json`,description:"List the conversion rules on a LinkedIn Ad Account: name, type, method, attribution settings, conversion value and enabled status. LinkedIn serves 10 per page, so check `next_start` in the response before concluding you have seen them all."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/conversions/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_creative`,path:[`linkedin`,`creatives`,`get`],summary:'Get a creative by ID: its status, review status, serving hold reasons — and the actual content of the ad, read from the post it points at. `post` carries the body text, the headline, the image URN, the landing page and each carousel card. Use it to tell someone what an ad says, or to rebuild one elsewhere. VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`creative_id`,flag:`--creative-id`,description:`Creative ID or URN (e.g. '120491345' or 'urn:li:sponsoredCreative:120491345')`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin creatives get --workspace-id <workspaceId> --creative-id <creative_id>`}],output:{kind:`json`,description:'Get a creative by ID: its status, review status, serving hold reasons — and the actual content of the ad, read from the post it points at. `post` carries the body text, the headline, the image URN, the landing page and each carousel card. Use it to tell someone what an ad says, or to rebuild one elsewhere. VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/creatives/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_linkedin_creatives`,path:[`linkedin`,`creatives`,`list`],summary:'Search and list creatives for a LinkedIn Ad Account. Filter by campaign, status, or creative IDs. Uses q=criteria finder with cursor-based pagination (max 100 per page). VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Filter by campaign URNs or IDs`,required:!1,valueType:`json`,location:`body`},{name:`intended_statuses`,flag:`--intended-statuses`,description:`Filter by intended statuses`,required:!1,valueType:`json`,location:`body`},{name:`creative_ids`,flag:`--creative-ids`,description:`Filter by specific creative URNs`,required:!1,valueType:`json`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by creative ID (default: ASCENDING)`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Number of results per page (max 100)`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page of results`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin creatives list --workspace-id <workspaceId>`}],output:{kind:`json`,description:'Search and list creatives for a LinkedIn Ad Account. Filter by campaign, status, or creative IDs. Uses q=criteria finder with cursor-based pagination (max 100 per page). VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/creatives/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_demographic_insights`,path:[`linkedin`,`demographic-insights`,`get`],summary:`Get professional demographic analytics for LinkedIn ads. Break down performance by member company, industry, seniority, job title, job function, or location. Uses q=analytics with MEMBER_* pivots. Note: demographic data has 12-24h delay and 2-year retention.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`pivot`,flag:`--pivot`,description:`Professional demographic dimension to group results by`,required:!0,valueType:`string`,enum:[`MEMBER_COMPANY`,`MEMBER_COMPANY_SIZE`,`MEMBER_INDUSTRY`,`MEMBER_SENIORITY`,`MEMBER_JOB_TITLE`,`MEMBER_JOB_FUNCTION`,`MEMBER_COUNTRY_V2`,`MEMBER_REGION_V2`,`MEMBER_COUNTY`],location:`body`},{name:`time_granularity`,flag:`--time-granularity`,description:`Time granularity for results`,required:!1,valueType:`string`,defaultValue:`ALL`,enum:[`DAILY`,`MONTHLY`,`ALL`],location:`body`},{name:`date_range_start`,flag:`--date-range-start`,description:`Start date (inclusive)`,required:!0,valueType:`json`,location:`body`},{name:`date_range_end`,flag:`--date-range-end`,description:`End date (inclusive)`,required:!1,valueType:`json`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Filter by campaign IDs`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific metrics to return (max 20). Note: some metrics not available with demographic pivots.`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin demographic-insights get --workspace-id <workspaceId> --pivot MEMBER_COMPANY --date-range-start '{}'`}],output:{kind:`json`,description:`Get professional demographic analytics for LinkedIn ads. Break down performance by member company, industry, seniority, job title, job function, or location. Uses q=analytics with MEMBER_* pivots. Note: demographic data has 12-24h delay and 2-year retention.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/demographic-insights/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_lead_gen_form`,path:[`linkedin`,`lead-gen-forms`,`get`],summary:`Get one lead gen form with the questions it asks and the tracking parameters it appends. Use it to tell a client what a form collects before attaching it to an ad, or to check that an existing ad's form still asks for what the campaign needs.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`lead_gen_form_id`,flag:`--lead-gen-form-id`,description:`Numeric id of the form, or its full urn:li:adForm: URN — either is accepted.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin lead-gen-forms get --workspace-id <workspaceId> --lead-gen-form-id <lead_gen_form_id>`}],output:{kind:`json`,description:`Get one lead gen form with the questions it asks and the tracking parameters it appends. Use it to tell a client what a form collects before attaching it to an ad, or to check that an existing ad's form still asks for what the campaign needs.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/lead-gen-forms/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_lead_gen_forms`,path:[`linkedin`,`lead-gen-forms`,`list`],summary:"List the lead gen forms an ad account owns. A lead gen ad opens one of these inside LinkedIn, pre-filled from the member's profile, instead of sending them to a website. Each result carries the `urn` that create_creative's leadgen_form_id expects, so use this before building a LEAD_GENERATION ad — form URNs cannot be discovered any other way.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first form to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many forms to return. LinkedIn defaults to 10 if unset (measured: 10 served against a total of 30), so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin lead-gen-forms list --workspace-id <workspaceId>`}],output:{kind:`json`,description:"List the lead gen forms an ad account owns. A lead gen ad opens one of these inside LinkedIn, pre-filled from the member's profile, instead of sending them to a website. Each result carries the `urn` that create_creative's leadgen_form_id expects, so use this before building a LEAD_GENERATION ad — form URNs cannot be discovered any other way."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/lead-gen-forms/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_matched_audience`,path:[`linkedin`,`matched-audiences`,`get`],summary:`Check an audience built by uploading a contact or company list: whether LinkedIn has finished matching it, how many contacts were sent, how many members it recognized, and the urn:li:adSegment: URN to target once it is ready. Use this when someone asks how an audience import turned out or how big the audience is — the size is not stored anywhere on our side and only exists here. Matching takes up to 48 hours, so a status of BUILDING shortly after an import is normal and not a failure.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`segment_id`,flag:`--segment-id`,description:`The DMP segment's numeric id — the id an audience import reports when it finishes. Not the urn:li:adSegment: URN, which is a different object; use get_ad_segment for that one.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin matched-audiences get --workspace-id <workspaceId> --segment-id <segment_id>`}],output:{kind:`json`,description:`Check an audience built by uploading a contact or company list: whether LinkedIn has finished matching it, how many contacts were sent, how many members it recognized, and the urn:li:adSegment: URN to target once it is ready. Use this when someone asks how an audience import turned out or how big the audience is — the size is not stored anywhere on our side and only exists here. Matching takes up to 48 hours, so a status of BUILDING shortly after an import is normal and not a failure.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/matched-audiences/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_matched_audiences`,path:[`linkedin`,`matched-audiences`,`list`],summary:`List the audiences an ad account has built from uploaded contact or company lists, with their matching status and sizes. Use this to find an audience by name — after an import, the numeric id needed by get_matched_audience is not something the user has, but the name they chose is.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first audience to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many to return. LinkedIn defaults to 10 if unset, so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin matched-audiences list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the audiences an ad account has built from uploaded contact or company lists, with their matching status and sizes. Use this to find an audience by name — after an import, the numeric id needed by get_matched_audience is not something the user has, but the name they chose is.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/matched-audiences/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.compare_linkedin_performance`,path:[`linkedin`,`performance`,`compare`],summary:`Compare performance across multiple campaigns side-by-side. Returns analytics grouped by campaign for easy comparison of metrics like impressions, clicks, cost, and conversions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Campaign IDs to compare`,required:!0,valueType:`json`,location:`body`},{name:`time_granularity`,flag:`--time-granularity`,description:`Time granularity`,required:!1,valueType:`string`,defaultValue:`ALL`,enum:[`DAILY`,`MONTHLY`,`ALL`],location:`body`},{name:`date_range_start`,flag:`--date-range-start`,description:`Start date (inclusive)`,required:!0,valueType:`json`,location:`body`},{name:`date_range_end`,flag:`--date-range-end`,description:`End date (inclusive)`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific metrics to return (max 20)`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin performance compare --workspace-id <workspaceId> --campaign-ids '{}' --date-range-start '{}'`}],output:{kind:`json`,description:`Compare performance across multiple campaigns side-by-side. Returns analytics grouped by campaign for easy comparison of metrics like impressions, clicks, cost, and conversions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/performance/compare`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_saved_audience`,path:[`linkedin`,`saved-audiences`,`get`],summary:`Get one saved audience with its full targeting criteria. Read this before update_saved_audience: an update REPLACES the criteria rather than merging into them.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`saved_audience_id`,flag:`--saved-audience-id`,description:`Numeric id of the saved audience (adTargetTemplate).`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin saved-audiences get --workspace-id <workspaceId> --saved-audience-id <saved_audience_id>`}],output:{kind:`json`,description:`Get one saved audience with its full targeting criteria. Read this before update_saved_audience: an update REPLACES the criteria rather than merging into them.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/saved-audiences/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_saved_audiences`,path:[`linkedin`,`saved-audiences`,`list`],summary:`List an account's saved audiences (reusable targeting templates built in Campaign Manager). Each one carries a full targeting_criteria that can be copied verbatim into create_linkedin_campaign, or into update_linkedin_campaign to give an existing campaign an audience. Prefer these over composing an audience from scratch: they are the audiences the account already trusts.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`sort_field`,flag:`--sort-field`,description:`Sort order. LinkedIn requires one; NAME is the default here.`,required:!1,valueType:`string`,defaultValue:`NAME`,enum:[`NAME`,`LAST_MODIFIED`,`ID`],location:`body`}],examples:[{description:`Example`,command:`adside linkedin saved-audiences list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List an account's saved audiences (reusable targeting templates built in Campaign Manager). Each one carries a full targeting_criteria that can be copied verbatim into create_linkedin_campaign, or into update_linkedin_campaign to give an existing campaign an audience. Prefer these over composing an audience from scratch: they are the audiences the account already trusts.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/saved-audiences/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_targeting_entities`,path:[`linkedin`,`targeting-entities`,`get`],summary:`Resolve targeting URNs to human-readable names. Pass a list of URNs (e.g. urn:li:seniority:7, urn:li:industry:9) to get their display names.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`urns`,flag:`--urns`,description:`List of URNs to resolve (e.g. ['urn:li:seniority:7', 'urn:li:industry:9'])`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin targeting-entities get --workspace-id <workspaceId> --urns '{}'`}],output:{kind:`json`,description:`Resolve targeting URNs to human-readable names. Pass a list of URNs (e.g. urn:li:seniority:7, urn:li:industry:9) to get their display names.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/targeting-entities/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.search_targeting_facets`,path:[`linkedin`,`targeting-facets`,`search`],summary:`Search for targeting entity values by facet type. Use typeahead search with a query string, or list all values for a facet. Returns URNs to use in campaign targeting criteria.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`facet`,flag:`--facet`,description:`Targeting facet to search (e.g. locations, industries, titles). These facets REQUIRE a query — they cannot be listed: employers, employersAll, employersPast, schools, skills, groups, followedCompanies, firstDegreeConnectionCompanies. Not searchable at all, but valid in campaign targeting: audienceMatchingSegments, dynamicSegments — their values are your own audience segments, not LinkedIn attributes.`,required:!0,valueType:`string`,enum:`locations.profileLocations.industries.seniorities.titles.titlesAll.titlesPast.jobFunctions.degrees.fieldsOfStudy.staffCountRanges.interests.ageRanges.genders.interfaceLocales.companyCategory.growthRate.memberBehaviors.yearsOfExperienceRanges.revenue.employers.employersAll.employersPast.schools.skills.groups.followedCompanies.firstDegreeConnectionCompanies`.split(`.`),location:`body`},{name:`query`,flag:`--query`,description:`Search text for typeahead (e.g. 'Software Engineer'). If omitted, returns all values for the facet — which only works for a listable facet.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin targeting-facets search --workspace-id <workspaceId> --facet locations`}],output:{kind:`json`,description:`Search for targeting entity values by facet type. Use typeahead search with a query string, or list all values for a facet. Returns URNs to use in campaign targeting criteria.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/targeting-facets/search`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_video_upload`,path:[`linkedin`,`video-upload`,`get`],summary:`Status of a video upload started with upload_video: PENDING → PREPARING → UPLOADING → PROCESSING → AVAILABLE (or FAILED). This call WAITS (up to wait_seconds, default 3 minutes) for the upload to finish before answering, so call it once rather than polling; if it still says still_running, call it again. Once AVAILABLE, the video_urn is what create_creative's SINGLE_VIDEO branch takes as video_id.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`wait_seconds`,flag:`--wait-seconds`,description:`Seconds to wait for the upload to reach AVAILABLE (or FAILED) before answering. Default 180, max 240. Leave the default: one call then usually returns the video_urn. 0 returns the current state at once.`,required:!1,valueType:`number`,defaultValue:180,location:`body`},{name:`upload_id`,flag:`--upload-id`,description:`The upload_id returned by upload_video. Omit it to get the most recent upload for this client.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin video-upload get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Status of a video upload started with upload_video: PENDING → PREPARING → UPLOADING → PROCESSING → AVAILABLE (or FAILED). This call WAITS (up to wait_seconds, default 3 minutes) for the upload to finish before answering, so call it once rather than polling; if it still says still_running, call it again. Once AVAILABLE, the video_urn is what create_creative's SINGLE_VIDEO branch takes as video_id.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/video-upload/get`,auth:`user`,requestContentType:`application/json`}},{id:`media.images.cancel`,path:[`media`,`images`,`cancel`],summary:`Cancel an image job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media images cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel an image job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/images/{jobId}/cancel`,auth:`user`}},{id:`media.images.estimate`,path:[`media`,`images`,`estimate`],summary:`Price an image request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`512`,`768`,`1K`,`1.5K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`auto`,`1:1`,`2:3`,`3:2`,`3:4`,`4:3`,`4:5`,`5:4`,`9:16`,`16:9`,`21:9`,`9:21`,`1:2`,`2:1`,`1:4`,`4:1`,`1:8`,`8:1`],location:`body`},{name:`inputReferences`,flag:`--input-references`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside media images estimate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Price an image request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/images/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.images.generate`,path:[`media`,`images`,`generate`],summary:`Generate one image, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`512`,`768`,`1K`,`1.5K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`auto`,`1:1`,`2:3`,`3:2`,`3:4`,`4:3`,`4:5`,`5:4`,`9:16`,`16:9`,`21:9`,`9:21`,`1:2`,`2:1`,`1:4`,`4:1`,`1:8`,`8:1`],location:`body`},{name:`inputReferences`,flag:`--input-references`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside media images generate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Generate one image, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/images`,auth:`user`,requestContentType:`application/json`}},{id:`media.images.get`,path:[`media`,`images`,`get`],summary:`Read an image job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media images get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read an image job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/images/{jobId}`,auth:`user`}},{id:`media.images.models`,path:[`media`,`images`,`models`],summary:`List the image models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media images models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the image models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/images/models`,auth:`user`}},{id:`media.jobs.list`,path:[`media`,`jobs`,`list`],summary:`List the workspace's image and video jobs, newest first`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`image`,`video`],location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`pending`,`in_progress`,`completed`,`failed`,`cancelled`,`expired`],location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`query`}],examples:[{description:`Example`,command:`adside media jobs list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the workspace's image and video jobs, newest first`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/jobs`,auth:`user`}},{id:`media.videos.cancel`,path:[`media`,`videos`,`cancel`],summary:`Cancel a video job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media videos cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel a video job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/videos/{jobId}/cancel`,auth:`user`}},{id:`media.videos.estimate`,path:[`media`,`videos`,`estimate`],summary:`Price a video request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`480p`,`720p`,`768p`,`1080p`,`1K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`9:16`,`16:9`,`1:1`,`4:3`,`3:4`,`3:2`,`2:3`,`21:9`,`9:21`],location:`body`},{name:`frameImages`,flag:`--frame-images`,description:``,required:!1,valueType:`json`,location:`body`},{name:`generateAudio`,flag:`--generate-audio`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media videos estimate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Price a video request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/videos/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.videos.generate`,path:[`media`,`videos`,`generate`],summary:`Generate one video clip, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`480p`,`720p`,`768p`,`1080p`,`1K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`9:16`,`16:9`,`1:1`,`4:3`,`3:4`,`3:2`,`2:3`,`21:9`,`9:21`],location:`body`},{name:`frameImages`,flag:`--frame-images`,description:``,required:!1,valueType:`json`,location:`body`},{name:`generateAudio`,flag:`--generate-audio`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media videos generate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Generate one video clip, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/videos`,auth:`user`,requestContentType:`application/json`}},{id:`media.videos.get`,path:[`media`,`videos`,`get`],summary:`Read a video job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media videos get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read a video job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/videos/{jobId}`,auth:`user`}},{id:`media.videos.models`,path:[`media`,`videos`,`models`],summary:`List the video models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media videos models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the video models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/videos/models`,auth:`user`}},{id:`meta.analyze_account_creatives`,path:[`meta`,`account-creatives`,`analyze`],summary:`Analyze all creatives in an account to identify patterns, performance insights, and optimization opportunities. Provides summary statistics and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID to analyze (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:`Maximum number of creatives to analyze`,required:!1,valueType:`number`,defaultValue:50,location:`body`}],examples:[{description:`Example`,command:`adside meta account-creatives analyze --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Analyze all creatives in an account to identify patterns, performance insights, and optimization opportunities. Provides summary statistics and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-creatives/analyze`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_account_pages`,path:[`meta`,`account-pages`,`get`],summary:`List Facebook Pages available for ad creation on the given ad account, with each Page's Instagram business account as instagram_account_id when Meta lists one for this ad account. Page IDs go in promoted_object and object_story_spec; the Instagram id goes in a creative's instagram_actor_id so the ad runs under the client's own Instagram account. An empty list does NOT mean the account has no Page (Meta gates the list on what the connecting user granted at consent), and a missing instagram_account_id does NOT mean the Page has no Instagram account (usually it is not connected to the ad account yet) — the response says what to check.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-pages get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List Facebook Pages available for ad creation on the given ad account, with each Page's Instagram business account as instagram_account_id when Meta lists one for this ad account. Page IDs go in promoted_object and object_story_spec; the Instagram id goes in a creative's instagram_actor_id so the ad runs under the client's own Instagram account. An empty list does NOT mean the account has no Page (Meta gates the list on what the connecting user granted at consent), and a missing instagram_account_id does NOT mean the Page has no Instagram account (usually it is not connected to the ad account yet) — the response says what to check.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-pages/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_account_pixels`,path:[`meta`,`account-pixels`,`get`],summary:`List pixels/datasets available to this client's connected ad account, including ones with no attached ad sets. Returns IDs, names, last_fired_time and availability. Follow next_cursor for more datasets. Use get_pixel for metadata/settings and get_pixel_stats for recent event activity (standard/custom event names, counts, sources and diagnostics) before launch. An empty list does NOT mean no pixel exists: a pixel created in Events Manager is not listed until it is connected to the ad account. The empty response lists the ad account's Business datasets that are not connected to it and says how to connect one; relay that before suggesting create_dataset.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Next-page cursor from get_account_pixels.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-pixels get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List pixels/datasets available to this client's connected ad account, including ones with no attached ad sets. Returns IDs, names, last_fired_time and availability. Follow next_cursor for more datasets. Use get_pixel for metadata/settings and get_pixel_stats for recent event activity (standard/custom event names, counts, sources and diagnostics) before launch. An empty list does NOT mean no pixel exists: a pixel created in Events Manager is not listed until it is connected to the ad account. The empty response lists the ad account's Business datasets that are not connected to it and says how to connect one; relay that before suggesting create_dataset.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-pixels/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.verify_account_setup`,path:[`meta`,`account-setup`,`verify`],summary:`Check Meta account access, active status, funding visibility, promotable Pages and spending capacity. Unknown prerequisites prevent ready status. Does not establish billing chargeability, business verification or launch readiness.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID to verify (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-setup verify --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Check Meta account access, active status, funding visibility, promotable Pages and spending capacity. Unknown prerequisites prevent ready status. Does not establish billing chargeability, business verification or launch readiness.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-setup/verify`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_meta_account_spend_limit`,path:[`meta`,`account-spend-limit`,`get`],summary:`Read the Meta ad account's spending limit and how much has been spent toward it. When the limit is reached Meta stops delivery for EVERY campaign in the account at once — check this first when all ads stopped running on the same day and no campaign-level setting explains it. Amounts are in the account currency's standard units (5000 = $5,000).`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-spend-limit get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read the Meta ad account's spending limit and how much has been spent toward it. When the limit is reached Meta stops delivery for EVERY campaign in the account at once — check this first when all ads stopped running on the same day and no campaign-level setting explains it. Amounts are in the account currency's standard units (5000 = $5,000).`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-spend-limit/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad_creative`,path:[`meta`,`ad-creative`,`get`],summary:`Get a single ad creative by ID with full details including copy, media, and Advantage+ Creative (asset_feed_spec) data. Use this to retrieve the actual ad copy text (bodies, titles, descriptions) for creatives using Advantage+ or dynamic creative optimization.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creative_id`,flag:`--creative-id`,description:`The creative ID to fetch`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-creative get --workspace-id <workspaceId> --creative-id <creative_id>`}],output:{kind:`json`,description:`Get a single ad creative by ID with full details including copy, media, and Advantage+ Creative (asset_feed_spec) data. Use this to retrieve the actual ad copy text (bodies, titles, descriptions) for creatives using Advantage+ or dynamic creative optimization.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-creative/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad_images`,path:[`meta`,`ad-images`,`get`],summary:`Retrieve ad images from a Meta ad account. Returns image URLs, dimensions, and hashes. Use to get image URLs for displaying ad creatives or generating variations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`hashes`,flag:`--hashes`,description:`Filter by specific image hashes`,required:!1,valueType:`json`,location:`body`},{name:`limit`,flag:`--limit`,description:`Maximum number of images to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-images get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Retrieve ad images from a Meta ad account. Returns image URLs, dimensions, and hashes. Use to get image URLs for displaying ad creatives or generating variations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-images/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad_set`,path:[`meta`,`ad-sets`,`get`],summary:`Retrieve details for a single ad set including its targeting, budget, optimization goal, and schedule. To duplicate it, pass this ad set ID as source_ad_set_id to create_ad_set_enhanced and omit targeting. If faithful duplication is refused, report the unsupported fields; never silently narrow the audience or placements.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`adset_id`,flag:`--adset-id`,description:`Ad set ID to retrieve`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-sets get --workspace-id <workspaceId> --adset-id <adset_id>`}],output:{kind:`json`,description:`Retrieve details for a single ad set including its targeting, budget, optimization goal, and schedule. To duplicate it, pass this ad set ID as source_ad_set_id to create_ad_set_enhanced and omit targeting. If faithful duplication is refused, report the unsupported fields; never silently narrow the audience or placements.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-sets/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_ad_sets`,path:[`meta`,`ad-sets`,`list`],summary:`List all ad sets for a given campaign or ad account. Filter by status and paginate results. Returns ad set details including budget, targeting, and optimization settings.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Filter by campaign ID`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Filter by account ID`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by ad set status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`DELETED`,`ARCHIVED`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of ad sets to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-sets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List all ad sets for a given campaign or ad account. Filter by status and paginate results. Returns ad set details including budget, targeting, and optimization settings.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-sets/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad`,path:[`meta`,`ads`,`get`],summary:`Retrieve details for a single ad including its name, status, ad set, campaign, and creative.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`ad_id`,flag:`--ad-id`,description:`Ad ID to retrieve`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ads get --workspace-id <workspaceId> --ad-id <ad_id>`}],output:{kind:`json`,description:`Retrieve details for a single ad including its name, status, ad set, campaign, and creative.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ads/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_meta_ads`,path:[`meta`,`ads`,`list`],summary:`List all ads for a given campaign, ad set, or ad account. Filter by status and paginate results. Returns ad details including creative, status, and timing.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Filter by campaign ID`,required:!1,valueType:`string`,location:`body`},{name:`adset_id`,flag:`--adset-id`,description:`Filter by ad set ID`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Filter by account ID`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by ad status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`DELETED`,`ARCHIVED`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of ads to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ads list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List all ads for a given campaign, ad set, or ad account. Filter by status and paginate results. Returns ad details including creative, status, and timing.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ads/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.preview_ad`,path:[`meta`,`ads`,`preview`],summary:`Generate HTML preview of how an ad creative will appear in different placements and formats. Useful for testing creative appearance before launching campaigns.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creative_id`,flag:`--creative-id`,description:`Creative ID to preview`,required:!0,valueType:`string`,location:`body`},{name:`ad_format`,flag:`--ad-format`,description:`Ad format for preview`,required:!0,valueType:`string`,enum:[`DESKTOP_FEED_STANDARD`,`MOBILE_FEED_STANDARD`,`MOBILE_FEED_BASIC`,`MOBILE_BANNER`,`MOBILE_MEDIUM_RECTANGLE`,`MOBILE_FULLWIDTH`,`MOBILE_INTERSTITIAL`,`INSTAGRAM_STANDARD`,`INSTAGRAM_STORY`],location:`body`},{name:`product_item_ids`,flag:`--product-item-ids`,description:`Product item IDs for dynamic ads`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside meta ads preview --workspace-id <workspaceId> --creative-id <creative_id> --ad-format DESKTOP_FEED_STANDARD`}],output:{kind:`json`,description:`Generate HTML preview of how an ad creative will appear in different placements and formats. Useful for testing creative appearance before launching campaigns.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ads/preview`,auth:`user`,requestContentType:`application/json`}},{id:`meta.check_api_compliance`,path:[`meta`,`api-compliance`,`check`],summary:`Check if your creative parameters are compliant with current Meta Marketing API (v25.0) requirements. Identifies deprecated features and recommends best practices.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`name`,flag:`--name`,description:`Creative name`,required:!0,valueType:`string`,location:`body`},{name:`page_id`,flag:`--page-id`,description:`Facebook Page ID (required for object_story_spec)`,required:!0,valueType:`string`,location:`body`},{name:`message`,flag:`--message`,description:"Primary ad text/message (single-variant). Mutually exclusive with `bodies`.",required:!1,valueType:`string`,location:`body`},{name:`headline`,flag:`--headline`,description:"Ad title/headline (single-variant). Mutually exclusive with `titles`.",required:!1,valueType:`string`,location:`body`},{name:`bodies`,flag:`--bodies`,description:`Multi-variant primary texts (1–5). When set, the creative is built with asset_feed_spec and must be attached to a Dynamic Creative ad set.`,required:!1,valueType:`json`,location:`body`},{name:`titles`,flag:`--titles`,description:"Multi-variant headlines (1–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`descriptions`,flag:`--descriptions`,description:"Multi-variant descriptions (0–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`picture`,flag:`--picture`,description:`External image URL - must be publicly accessible`,required:!1,valueType:`url`,location:`body`},{name:`image_hash`,flag:`--image-hash`,description:`Pre-uploaded image hash (alternative to picture URL)`,required:!1,valueType:`string`,location:`body`},{name:`video_id`,flag:`--video-id`,description:`Video ID for video creatives`,required:!1,valueType:`string`,location:`body`},{name:`placement_assets`,flag:`--placement-assets`,description:"Placement asset customization (multi-ratio ad): one image or video per placement bucket, each `placement_group` at most once. Requires `image_hash` as the fallback image for placements not listed. Upload every ratio first (upload_image_from_url / upload_video_from_url) and pass the hashes. Mutually exclusive with `bodies`/`titles` — the resulting creative must be attached to a STANDARD ad set (Meta rejects it in a Dynamic Creative ad set).",required:!1,valueType:`json`,location:`body`},{name:`call_to_action_type`,flag:`--call-to-action-type`,description:`Call to action button type (40+ supported types)`,required:!1,valueType:`string`,enum:`LEARN_MORE.SHOP_NOW.SIGN_UP.DOWNLOAD.BOOK_TRAVEL.LISTEN_MUSIC.WATCH_VIDEO.GET_QUOTE.CONTACT_US.APPLY_NOW.GET_DIRECTIONS.CALL_NOW.MESSAGE_PAGE.SUBSCRIBE.BOOK_NOW.ORDER_NOW.DONATE_NOW.SAY_THANKS.SELL_NOW.SHARE.OPEN_LINK.LIKE_PAGE.FOLLOW_PAGE.FOLLOW_USER.REQUEST_TIME.VISIT_PAGES_FEED.USE_APP.PLAY_GAME.INSTALL_APP.USE_MOBILE_APP.INSTALL_MOBILE_APP.OPEN_MOVIES.AUDIO_CALL.VIDEO_CALL.GET_OFFER.GET_OFFER_VIEW.BUY_NOW.ADD_TO_CART.SELL.GIFT_WRAP.MAKE_AN_OFFER.BUY_TICKETS.EXPLORE_MORE.GET_PROMOTIONS.GET_SHOWTIMES.LISTEN_NOW.SAVE.SEE_DETAILS.SEE_MENU.WATCH_MORE.WHATSAPP_MESSAGE`.split(`.`),location:`body`},{name:`link_url`,flag:`--link-url`,description:`Destination URL where users will be directed when clicking the ad`,required:!0,valueType:`url`,location:`body`},{name:`description`,flag:`--description`,description:`Additional description text`,required:!1,valueType:`string`,location:`body`},{name:`instagram_actor_id`,flag:`--instagram-actor-id`,description:`Optional. Instagram Business Account ID of the Page's Instagram account (typically starts with 1784) — the instagram_account_id get_account_pages reports for that Page. When omitted the tool resolves the identity itself: the Page's Instagram business account, else — for placement-customised and variation creatives only, which Meta refuses without one — its Page-backed Instagram account (created when the Page has none — a write on the client's Page the result calls out), else the Page actor override. A standard creative is left without one when the Page has no Instagram account. The result reports which one it used in instagram_identity`,required:!1,valueType:`string`,location:`body`},{name:`adlabels`,flag:`--adlabels`,description:`Ad labels for organization and tracking`,required:!1,valueType:`json`,location:`body`},{name:`enable_standard_enhancements`,flag:`--enable-standard-enhancements`,description:`Enable Standard Enhancements with individual feature control`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`enhancement_features`,flag:`--enhancement-features`,description:`Individual enhancement feature controls`,required:!1,valueType:`json`,location:`body`},{name:`attachment_style`,flag:`--attachment-style`,description:`Attachment style for link ads`,required:!1,valueType:`string`,defaultValue:`link`,enum:[`link`,`album`],location:`body`},{name:`caption`,flag:`--caption`,description:`Caption text (typically domain name)`,required:!1,valueType:`string`,location:`body`},{name:`url_tags`,flag:`--url-tags`,description:`URL tags appended to the link URL for tracking (e.g. utm_source=...&utm_medium=...)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta api-compliance check --workspace-id <workspaceId> --name <name> --page-id <page_id> --link-url https://example.com`}],output:{kind:`json`,description:`Check if your creative parameters are compliant with current Meta Marketing API (v25.0) requirements. Identifies deprecated features and recommends best practices.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/api-compliance/check`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_meta_api_reference`,path:[`meta`,`api-reference`,`get`],summary:`Get a reference guide for valid Meta Marketing API parameters, including allowed optimization goals, billing events, and their valid combinations. Use this to troubleshoot parameter errors or to construct valid requests.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside meta api-reference get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get a reference guide for valid Meta Marketing API parameters, including allowed optimization goals, billing events, and their valid combinations. Use this to troubleshoot parameter errors or to construct valid requests.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/api-reference/get`,auth:`user`}},{id:`meta.get_attribution_data`,path:[`meta`,`attribution-data`,`get`],summary:"Retrieve attribution data with conversion tracking across multiple attribution windows (1-day click, 7-day click, 1-day view). Returns conversion metrics and cost-per-conversion analysis.\n\nRows are heavy: every row carries `actions` and `cost_per_action_type`, each entry split across three attribution windows. The response is capped in size — past that, rows are dropped and a `truncation` object says how many, and those rows are an arbitrary page rather than the top ones, because this endpoint returns no ranking. `summary` is always computed over every fetched row. Narrow the call (`limit`, a single `object_id`) rather than relying on the cap, and use the reporting-warehouse tools to rank objects over a period.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`object_id`,flag:`--object-id`,description:"ID of the object to get insights for. Omit it to use the connected ad account (recommended for account-wide queries at any level). Otherwise pass a campaign ID, ad set ID, or ad ID matching `level`. Account IDs other than the connected account are rejected. Passing a page/business/user ID returns Meta error #100.",required:!1,valueType:`string`,location:`body`},{name:`level`,flag:`--level`,description:`Level of insights to retrieve`,required:!0,valueType:`string`,enum:[`account`,`campaign`,`adset`,`ad`],location:`body`},{name:`date_preset`,flag:`--date-preset`,description:`Date preset for insights`,required:!1,valueType:`string`,enum:[`today`,`yesterday`,`last_3d`,`last_7d`,`last_14d`,`last_28d`,`last_30d`,`last_90d`,`this_week_mon_today`,`this_week_sun_today`,`last_week_mon_sun`,`last_week_sun_sat`,`this_month`,`last_month`,`this_quarter`,`last_quarter`,`this_year`,`last_year`,`maximum`,`data_maximum`],location:`body`},{name:`time_range`,flag:`--time-range`,description:`Custom date range for insights`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific fields to retrieve (e.g., impressions, clicks, spend)`,required:!1,valueType:`json`,location:`body`},{name:`breakdowns`,flag:`--breakdowns`,description:`Breakdown dimensions (e.g., age, gender, placement)`,required:!1,valueType:`json`,location:`body`},{name:`time_increment`,flag:`--time-increment`,description:`Time granularity: "monthly" for monthly rows, "all_days" for daily rows, or a number 1-90 for N-day increments`,required:!1,valueType:`json`,location:`body`},{name:`limit`,flag:`--limit`,description:`Number of insights to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:"Cursor for the next page: pass back the `pagination.next_cursor` value from a previous response. Keep every other parameter identical, or the cursor no longer matches the query it came from.",required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta attribution-data get --workspace-id <workspaceId> --level account`}],output:{kind:`json`,description:"Retrieve attribution data with conversion tracking across multiple attribution windows (1-day click, 7-day click, 1-day view). Returns conversion metrics and cost-per-conversion analysis.\n\nRows are heavy: every row carries `actions` and `cost_per_action_type`, each entry split across three attribution windows. The response is capped in size — past that, rows are dropped and a `truncation` object says how many, and those rows are an arbitrary page rather than the top ones, because this endpoint returns no ranking. `summary` is always computed over every fetched row. Narrow the call (`limit`, a single `object_id`) rather than relying on the cap, and use the reporting-warehouse tools to rank objects over a period."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/attribution-data/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_audience_details`,path:[`meta`,`audience-details`,`get`],summary:`Get detailed information about a specific audience including size estimates, delivery status, operation status, data source, and targeting rules.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`audience_id`,flag:`--audience-id`,description:`The audience ID to get details for`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta audience-details get --workspace-id <workspaceId> --audience-id <audience_id>`}],output:{kind:`json`,description:`Get detailed information about a specific audience including size estimates, delivery status, operation status, data source, and targeting rules.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/audience-details/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.estimate_audience_size`,path:[`meta`,`audience-size`,`estimate`],summary:`Estimate the potential reach of a targeting specification. Returns monthly and daily active user estimates with targeting recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`targeting`,flag:`--targeting`,description:`Targeting parameters for size estimation`,required:!0,valueType:`json`,location:`body`},{name:`optimization_goal`,flag:`--optimization-goal`,description:`Optimization goal for the estimate`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta audience-size estimate --workspace-id <workspaceId> --targeting '{}' --optimization-goal <optimization_goal>`}],output:{kind:`json`,description:`Estimate the potential reach of a targeting specification. Returns monthly and daily active user estimates with targeting recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/audience-size/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_audiences`,path:[`meta`,`audiences`,`list`],summary:`List custom and lookalike audiences for an ad account. Supports filtering by type (custom, lookalike, saved) and pagination.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:`Filter by audience type`,required:!1,valueType:`string`,enum:[`custom`,`lookalike`,`saved`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of audiences to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta audiences list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List custom and lookalike audiences for an ad account. Supports filtering by type (custom, lookalike, saved) and pagination.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/audiences/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.search_behaviors`,path:[`meta`,`behaviors`,`search`],summary:`List all available targetable behaviors from Meta's targeting categories. Returns behavior IDs, names, descriptions, and audience sizes.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`limit`,flag:`--limit`,description:`Number of results to return`,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside meta behaviors search --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List all available targetable behaviors from Meta's targeting categories. Returns behavior IDs, names, descriptions, and audience sizes.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/behaviors/search`,auth:`user`,requestContentType:`application/json`}},{id:`meta.check_campaign_readiness`,path:[`meta`,`campaign-readiness`,`check`],summary:`Check if a campaign is ready for ad set creation. Identify the campaign by ID or by name. Returns a readiness report with issues, requirements, and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Campaign ID. Preferred when known. Provide this or campaign_name, not both.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_name`,flag:`--campaign-name`,description:`Exact campaign name to look up (not an ID). Use campaign_id when the ID is known. Provide this or campaign_id, not both.`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (required when using campaign_name, uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta campaign-readiness check --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Check if a campaign is ready for ad set creation. Identify the campaign by ID or by name. Returns a readiness report with issues, requirements, and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/campaign-readiness/check`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_campaign`,path:[`meta`,`campaigns`,`get`],summary:`Retrieve full details for a specific campaign by ID or name. Returns all campaign fields including status, objective, budget, and timing.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Campaign ID. Preferred when known. Provide this or campaign_name, not both.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_name`,flag:`--campaign-name`,description:`Exact campaign name to look up (not an ID). Use campaign_id when the ID is known. Provide this or campaign_id, not both.`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (required when using campaign_name, uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta campaigns get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Retrieve full details for a specific campaign by ID or name. Returns all campaign fields including status, objective, budget, and timing.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/campaigns/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_meta_campaigns`,path:[`meta`,`campaigns`,`list`],summary:`Retrieve a paginated list of all campaigns for a Meta ad account. Filter by status (e.g., ACTIVE, PAUSED) and view key campaign details including budget, objective, and timing. Use this to audit or select campaigns for further actions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by campaign status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`DELETED`,`ARCHIVED`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of campaigns to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta campaigns list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Retrieve a paginated list of all campaigns for a Meta ad account. Filter by status (e.g., ACTIVE, PAUSED) and view key campaign details including budget, objective, and timing. Use this to audit or select campaigns for further actions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/campaigns/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_creative_best_practices`,path:[`meta`,`creative-best-practices`,`get`],summary:`Get comprehensive best practices for creating high-performing ad creatives. Includes platform-specific guidelines, content recommendations, and optimization strategies.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside meta creative-best-practices get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get comprehensive best practices for creating high-performing ad creatives. Includes platform-specific guidelines, content recommendations, and optimization strategies.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-best-practices/get`,auth:`user`}},{id:`meta.validate_creative_enhanced`,path:[`meta`,`creative-enhanced`,`validate`],summary:`Enhanced creative validation with comprehensive checks including page permissions, image accessibility, and Meta API compliance. Provides detailed feedback and fix suggestions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`name`,flag:`--name`,description:`Creative name`,required:!0,valueType:`string`,location:`body`},{name:`page_id`,flag:`--page-id`,description:`Facebook Page ID (required for object_story_spec)`,required:!0,valueType:`string`,location:`body`},{name:`message`,flag:`--message`,description:`Primary ad text/message`,required:!0,valueType:`string`,location:`body`},{name:`headline`,flag:`--headline`,description:`Ad title/headline`,required:!1,valueType:`string`,location:`body`},{name:`picture`,flag:`--picture`,description:`External image URL - must be publicly accessible`,required:!1,valueType:`url`,location:`body`},{name:`image_hash`,flag:`--image-hash`,description:`Pre-uploaded image hash (alternative to picture URL)`,required:!1,valueType:`string`,location:`body`},{name:`video_id`,flag:`--video-id`,description:`Video ID for video creatives`,required:!1,valueType:`string`,location:`body`},{name:`call_to_action_type`,flag:`--call-to-action-type`,description:`Call to action button type (40+ supported types)`,required:!1,valueType:`string`,enum:`LEARN_MORE.SHOP_NOW.SIGN_UP.DOWNLOAD.BOOK_TRAVEL.LISTEN_MUSIC.WATCH_VIDEO.GET_QUOTE.CONTACT_US.APPLY_NOW.GET_DIRECTIONS.CALL_NOW.MESSAGE_PAGE.SUBSCRIBE.BOOK_NOW.ORDER_NOW.DONATE_NOW.SAY_THANKS.SELL_NOW.SHARE.OPEN_LINK.LIKE_PAGE.FOLLOW_PAGE.FOLLOW_USER.REQUEST_TIME.VISIT_PAGES_FEED.USE_APP.PLAY_GAME.INSTALL_APP.USE_MOBILE_APP.INSTALL_MOBILE_APP.OPEN_MOVIES.AUDIO_CALL.VIDEO_CALL.GET_OFFER.GET_OFFER_VIEW.BUY_NOW.ADD_TO_CART.SELL.GIFT_WRAP.MAKE_AN_OFFER.BUY_TICKETS.EXPLORE_MORE.GET_PROMOTIONS.GET_SHOWTIMES.LISTEN_NOW.SAVE.SEE_DETAILS.SEE_MENU.WATCH_MORE.WHATSAPP_MESSAGE`.split(`.`),location:`body`},{name:`link_url`,flag:`--link-url`,description:`Destination URL where users will be directed when clicking the ad`,required:!1,valueType:`url`,location:`body`},{name:`description`,flag:`--description`,description:`Additional description text`,required:!1,valueType:`string`,location:`body`},{name:`instagram_actor_id`,flag:`--instagram-actor-id`,description:`Optional. Instagram Business Account ID of the Page's Instagram account (typically starts with 1784) — the instagram_account_id get_account_pages reports for that Page. When omitted the tool resolves the identity itself: the Page's Instagram business account, else — for placement-customised and variation creatives only, which Meta refuses without one — its Page-backed Instagram account (created when the Page has none — a write on the client's Page the result calls out), else the Page actor override. A standard creative is left without one when the Page has no Instagram account. The result reports which one it used in instagram_identity`,required:!1,valueType:`string`,location:`body`},{name:`adlabels`,flag:`--adlabels`,description:`Ad labels for organization and tracking`,required:!1,valueType:`json`,location:`body`},{name:`enable_standard_enhancements`,flag:`--enable-standard-enhancements`,description:`Enable Standard Enhancements with individual feature control`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`enhancement_features`,flag:`--enhancement-features`,description:`Individual enhancement feature controls`,required:!1,valueType:`json`,location:`body`},{name:`attachment_style`,flag:`--attachment-style`,description:`Attachment style for link ads`,required:!1,valueType:`string`,defaultValue:`link`,enum:[`link`,`album`],location:`body`},{name:`caption`,flag:`--caption`,description:`Caption text (typically domain name)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta creative-enhanced validate --workspace-id <workspaceId> --name <name> --page-id <page_id> --message <message>`}],output:{kind:`json`,description:`Enhanced creative validation with comprehensive checks including page permissions, image accessibility, and Meta API compliance. Provides detailed feedback and fix suggestions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-enhanced/validate`,auth:`user`,requestContentType:`application/json`}},{id:`meta.troubleshoot_creative_issues`,path:[`meta`,`creative-issues`,`troubleshoot`],summary:`Diagnose and fix common creative creation and performance issues. Provide an error message or describe your issue to get specific solutions and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`issue_description`,flag:`--issue-description`,description:`Describe the creative issue you're experiencing or paste the error message`,required:!0,valueType:`string`,location:`body`},{name:`creative_type`,flag:`--creative-type`,description:`Type of creative experiencing issues`,required:!1,valueType:`string`,enum:[`image`,`video`,`carousel`,`collection`],location:`body`}],examples:[{description:`Example`,command:`adside meta creative-issues troubleshoot --workspace-id <workspaceId> --issue-description <issue_description>`}],output:{kind:`json`,description:`Diagnose and fix common creative creation and performance issues. Provide an error message or describe your issue to get specific solutions and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-issues/troubleshoot`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_creative_performance`,path:[`meta`,`creative-performance`,`get`],summary:`Get guidance on analyzing creative performance metrics. Provides recommended approaches for tracking creative effectiveness and optimization strategies.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creative_id`,flag:`--creative-id`,description:`Creative ID to preview`,required:!0,valueType:`string`,location:`body`},{name:`ad_format`,flag:`--ad-format`,description:`Ad format for preview`,required:!0,valueType:`string`,enum:[`DESKTOP_FEED_STANDARD`,`MOBILE_FEED_STANDARD`,`MOBILE_FEED_BASIC`,`MOBILE_BANNER`,`MOBILE_MEDIUM_RECTANGLE`,`MOBILE_FULLWIDTH`,`MOBILE_INTERSTITIAL`,`INSTAGRAM_STANDARD`,`INSTAGRAM_STORY`],location:`body`},{name:`product_item_ids`,flag:`--product-item-ids`,description:`Product item IDs for dynamic ads`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside meta creative-performance get --workspace-id <workspaceId> --creative-id <creative_id> --ad-format DESKTOP_FEED_STANDARD`}],output:{kind:`json`,description:`Get guidance on analyzing creative performance metrics. Provides recommended approaches for tracking creative effectiveness and optimization strategies.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-performance/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.validate_creative_setup`,path:[`meta`,`creative-setup`,`validate`],summary:`Validate ad creative parameters before creation to catch errors early. Checks required fields, URL validity, and provides object_story_spec preview. Use this before create_ad_creative to avoid API errors.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`name`,flag:`--name`,description:`Creative name`,required:!0,valueType:`string`,location:`body`},{name:`page_id`,flag:`--page-id`,description:`Facebook Page ID (required for object_story_spec)`,required:!0,valueType:`string`,location:`body`},{name:`message`,flag:`--message`,description:"Primary ad text/message (single-variant). Mutually exclusive with `bodies`.",required:!1,valueType:`string`,location:`body`},{name:`headline`,flag:`--headline`,description:"Ad title/headline (single-variant). Mutually exclusive with `titles`.",required:!1,valueType:`string`,location:`body`},{name:`bodies`,flag:`--bodies`,description:`Multi-variant primary texts (1–5). When set, the creative is built with asset_feed_spec and must be attached to a Dynamic Creative ad set.`,required:!1,valueType:`json`,location:`body`},{name:`titles`,flag:`--titles`,description:"Multi-variant headlines (1–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`descriptions`,flag:`--descriptions`,description:"Multi-variant descriptions (0–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`picture`,flag:`--picture`,description:`External image URL - must be publicly accessible`,required:!1,valueType:`url`,location:`body`},{name:`image_hash`,flag:`--image-hash`,description:`Pre-uploaded image hash (alternative to picture URL)`,required:!1,valueType:`string`,location:`body`},{name:`video_id`,flag:`--video-id`,description:`Video ID for video creatives`,required:!1,valueType:`string`,location:`body`},{name:`placement_assets`,flag:`--placement-assets`,description:"Placement asset customization (multi-ratio ad): one image or video per placement bucket, each `placement_group` at most once. Requires `image_hash` as the fallback image for placements not listed. Upload every ratio first (upload_image_from_url / upload_video_from_url) and pass the hashes. Mutually exclusive with `bodies`/`titles` — the resulting creative must be attached to a STANDARD ad set (Meta rejects it in a Dynamic Creative ad set).",required:!1,valueType:`json`,location:`body`},{name:`call_to_action_type`,flag:`--call-to-action-type`,description:`Call to action button type (40+ supported types)`,required:!1,valueType:`string`,enum:`LEARN_MORE.SHOP_NOW.SIGN_UP.DOWNLOAD.BOOK_TRAVEL.LISTEN_MUSIC.WATCH_VIDEO.GET_QUOTE.CONTACT_US.APPLY_NOW.GET_DIRECTIONS.CALL_NOW.MESSAGE_PAGE.SUBSCRIBE.BOOK_NOW.ORDER_NOW.DONATE_NOW.SAY_THANKS.SELL_NOW.SHARE.OPEN_LINK.LIKE_PAGE.FOLLOW_PAGE.FOLLOW_USER.REQUEST_TIME.VISIT_PAGES_FEED.USE_APP.PLAY_GAME.INSTALL_APP.USE_MOBILE_APP.INSTALL_MOBILE_APP.OPEN_MOVIES.AUDIO_CALL.VIDEO_CALL.GET_OFFER.GET_OFFER_VIEW.BUY_NOW.ADD_TO_CART.SELL.GIFT_WRAP.MAKE_AN_OFFER.BUY_TICKETS.EXPLORE_MORE.GET_PROMOTIONS.GET_SHOWTIMES.LISTEN_NOW.SAVE.SEE_DETAILS.SEE_MENU.WATCH_MORE.WHATSAPP_MESSAGE`.split(`.`),location:`body`},{name:`link_url`,flag:`--link-url`,description:`Destination URL where users will be directed when clicking the ad`,required:!0,valueType:`url`,location:`body`},{name:`description`,flag:`--description`,description:`Additional description text`,required:!1,valueType:`string`,location:`body`},{name:`instagram_actor_id`,flag:`--instagram-actor-id`,description:`Optional. Instagram Business Account ID of the Page's Instagram account (typically starts with 1784) — the instagram_account_id get_account_pages reports for that Page. When omitted the tool resolves the identity itself: the Page's Instagram business account, else — for placement-customised and variation creatives only, which Meta refuses without one — its Page-backed Instagram account (created when the Page has none — a write on the client's Page the result calls out), else the Page actor override. A standard creative is left without one when the Page has no Instagram account. The result reports which one it used in instagram_identity`,required:!1,valueType:`string`,location:`body`},{name:`adlabels`,flag:`--adlabels`,description:`Ad labels for organization and tracking`,required:!1,valueType:`json`,location:`body`},{name:`enable_standard_enhancements`,flag:`--enable-standard-enhancements`,description:`Enable Standard Enhancements with individual feature control`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`enhancement_features`,flag:`--enhancement-features`,description:`Individual enhancement feature controls`,required:!1,valueType:`json`,location:`body`},{name:`attachment_style`,flag:`--attachment-style`,description:`Attachment style for link ads`,required:!1,valueType:`string`,defaultValue:`link`,enum:[`link`,`album`],location:`body`},{name:`caption`,flag:`--caption`,description:`Caption text (typically domain name)`,required:!1,valueType:`string`,location:`body`},{name:`url_tags`,flag:`--url-tags`,description:`URL tags appended to the link URL for tracking (e.g. utm_source=...&utm_medium=...)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta creative-setup validate --workspace-id <workspaceId> --name <name> --page-id <page_id> --link-url https://example.com`}],output:{kind:`json`,description:`Validate ad creative parameters before creation to catch errors early. Checks required fields, URL validity, and provides object_story_spec preview. Use this before create_ad_creative to avoid API errors.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-setup/validate`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_meta_creatives`,path:[`meta`,`creatives`,`list`],summary:`Browse an ad account's creatives, one page at a time. Each row is a SUMMARY — id, name, headline, primary text, call to action, destination, whether it is an image or a video, and how many variants a dynamic creative rotates. For the full row — the complete object_story_spec, asset_feed_spec and the Advantage+ enhancement settings, plus the image URL — call get_ad_creative on the id you want; use preview_ad to see the ad rendered. Ask for the smallest page that answers the question and follow next_cursor for the rest: a full page is a large answer whatever we strip from it, because the ad copy itself is the bulk of it.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:`How many creatives to return, 1-50 (default 25). Follow next_cursor for more rather than asking for a bigger page.`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta creatives list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Browse an ad account's creatives, one page at a time. Each row is a SUMMARY — id, name, headline, primary text, call to action, destination, whether it is an image or a video, and how many variants a dynamic creative rotates. For the full row — the complete object_story_spec, asset_feed_spec and the Advantage+ enhancement settings, plus the image URL — call get_ad_creative on the id you want; use preview_ad to see the ad rendered. Ask for the smallest page that answers the question and follow next_cursor for the rest: a full page is a large answer whatever we strip from it, because the ad copy itself is the bulk of it.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creatives/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_custom_conversions`,path:[`meta`,`custom-conversions`,`list`],summary:`List the account's custom conversions — the named conversions built on a dataset's traffic, as opposed to Meta's standard pixel events or named custom pixel events. To verify raw event activity on a dataset, use get_pixel_stats; an empty custom-conversion list does not mean the pixel has no events.
|
|
13
|
+
Read \`usageContext\` before doing anything else: a \`server\` container has a different tag-type namespace, so web tags do not exist in it and their absence is normal rather than a problem.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-tag-manager/containers/list`,auth:`user`}},{id:`google-tag-manager.audit_conversion_tracking`,path:[`google-tag-manager`,`conversion-tracking`,`audit`],summary:"Audit what a GTM container actually deploys for conversion tracking, reading the **published** version.\n\nCovers the container half of the audit: base tags (a Google tag on all pages, and something storing the click id), conversion tags without a firing trigger, paused tags, malformed conversion ids, missing consent settings, and the Meta pixel (base code on all pages, conversion events firing on every page, missing sequencing or event id). It ends with the cross-checks to run next with `list_conversion_actions` and `get_account_pixels` — those need the ad accounts and cannot be answered from the container alone.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`container_path`,flag:`--container-path`,description:'The container\'s `path`, from list_gtm_containers — e.g. "accounts/6000123/containers/12345678".',required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside google-tag-manager conversion-tracking audit --workspace-id <workspaceId> --container-path <container_path>`}],output:{kind:`json`,description:"Audit what a GTM container actually deploys for conversion tracking, reading the **published** version.\n\nCovers the container half of the audit: base tags (a Google tag on all pages, and something storing the click id), conversion tags without a firing trigger, paused tags, malformed conversion ids, missing consent settings, and the Meta pixel (base code on all pages, conversion events firing on every page, missing sequencing or event id). It ends with the cross-checks to run next with `list_conversion_actions` and `get_account_pixels` — those need the ad accounts and cannot be answered from the container alone."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/google-tag-manager/conversion-tracking/audit`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_ad_account`,path:[`linkedin`,`ad-accounts`,`get`],summary:`Get details of a LinkedIn Ad Account (name, status, currency, type, serving statuses)`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin ad-accounts get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get details of a LinkedIn Ad Account (name, status, currency, type, serving statuses)`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-accounts/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_ad_accounts`,path:[`linkedin`,`ad-accounts`,`list`],summary:`Get the one LinkedIn Ad Account this client is connected to. Every other tool defaults to it, so you rarely need to pass account_id at all — and an account id from anywhere else (memory, an earlier conversation, another client) will be refused.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside linkedin ad-accounts list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get the one LinkedIn Ad Account this client is connected to. Every other tool defaults to it, so you rarely need to pass account_id at all — and an account id from anywhere else (memory, an earlier conversation, another client) will be refused.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-accounts/list`,auth:`user`}},{id:`linkedin.get_ad_segment`,path:[`linkedin`,`ad-segment`,`get`],summary:`Look up one audience segment by its urn:li:adSegment: URN or id. Use this to name a segment found inside a campaign's or saved audience's targeting_criteria: list_ad_segments only returns segments owned by the account in scope, so a segment belonging to a sibling ad account of the same agency appears there as a bare URN. When the segment cannot be read, this says whether it no longer exists or is simply outside this LinkedIn connection's reach — a distinction LinkedIn itself answers with the same 404 for both.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`segment_id`,flag:`--segment-id`,description:`The segment's numeric id, or the full urn:li:adSegment:… as it appears inside a targeting_criteria.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin ad-segment get --workspace-id <workspaceId> --segment-id <segment_id>`}],output:{kind:`json`,description:`Look up one audience segment by its urn:li:adSegment: URN or id. Use this to name a segment found inside a campaign's or saved audience's targeting_criteria: list_ad_segments only returns segments owned by the account in scope, so a segment belonging to a sibling ad account of the same agency appears there as a bare URN. When the segment cannot be read, this says whether it no longer exists or is simply outside this LinkedIn connection's reach — a distinction LinkedIn itself answers with the same 404 for both.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-segment/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_ad_segments`,path:[`linkedin`,`ad-segments`,`list`],summary:`List the audience segments an ad account owns: uploaded contact/company lists (type BULK) and website or engagement retargeting audiences (type RETARGETING). Each result carries the targeting facet its URN belongs under, so it can be dropped straight into a campaign's targeting_criteria. Use this before targeting a matched audience — segment URNs cannot be discovered through search_targeting_facets.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first segment to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many segments to return. LinkedIn defaults to 10 if unset, so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin ad-segments list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the audience segments an ad account owns: uploaded contact/company lists (type BULK) and website or engagement retargeting audiences (type RETARGETING). Each result carries the targeting facet its URN belongs under, so it can be dropped straight into a campaign's targeting_criteria. Use this before targeting a matched audience — segment URNs cannot be discovered through search_targeting_facets.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/ad-segments/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_analytics`,path:[`linkedin`,`analytics`,`get`],summary:`Get performance analytics (impressions, clicks, cost, conversions, etc.) for LinkedIn ad entities. Group by account, campaign group, campaign, or creative with daily/monthly/all-time granularity.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`pivot`,flag:`--pivot`,description:`Dimension to group results by`,required:!0,valueType:`string`,enum:[`ACCOUNT`,`CAMPAIGN_GROUP`,`CAMPAIGN`,`CREATIVE`],location:`body`},{name:`time_granularity`,flag:`--time-granularity`,description:`Time granularity for results`,required:!1,valueType:`string`,defaultValue:`ALL`,enum:[`DAILY`,`MONTHLY`,`ALL`],location:`body`},{name:`date_range_start`,flag:`--date-range-start`,description:`Start date (inclusive)`,required:!0,valueType:`json`,location:`body`},{name:`date_range_end`,flag:`--date-range-end`,description:`End date (inclusive). If omitted, returns data up to now.`,required:!1,valueType:`json`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Filter by campaign IDs`,required:!1,valueType:`json`,location:`body`},{name:`campaign_group_ids`,flag:`--campaign-group-ids`,description:`Filter by campaign group IDs`,required:!1,valueType:`json`,location:`body`},{name:`creative_ids`,flag:`--creative-ids`,description:`Filter by creative URNs`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific metrics to return (max 20). Default: impressions, clicks. Examples: costInLocalCurrency, landingPageClicks, likes, shares, externalWebsiteConversions`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin analytics get --workspace-id <workspaceId> --pivot ACCOUNT --date-range-start '{}'`}],output:{kind:`json`,description:`Get performance analytics (impressions, clicks, cost, conversions, etc.) for LinkedIn ad entities. Group by account, campaign group, campaign, or creative with daily/monthly/all-time granularity.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/analytics/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_audience_size_estimate`,path:[`linkedin`,`audience-size-estimate`,`get`],summary:`Estimate how many LinkedIn members match a targeting criteria. Returns a rounded member count. Call this BEFORE creating a campaign: LinkedIn accepts a campaign with no targeting at all and stores no audience for it, so an unchecked campaign can be created that cannot reach anyone.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`targeting_criteria`,flag:`--targeting-criteria`,description:`Targeting criteria with AND/OR structure. Keys are FACET URNs, not bare names: {"include":{"and":[{"or":{"urn:li:adTargetingFacet:locations":["urn:li:geo:105015875"]}}]}}. A bare "locations" key is refused. Same format as campaign targeting; get the URNs from search_targeting_facets.`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin audience-size-estimate get --workspace-id <workspaceId> --targeting-criteria '{}'`}],output:{kind:`json`,description:`Estimate how many LinkedIn members match a targeting criteria. Returns a rounded member count. Call this BEFORE creating a campaign: LinkedIn accepts a campaign with no targeting at all and stores no audience for it, so an unchecked campaign can be created that cannot reach anyone.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/audience-size-estimate/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_campaign_conversion_rules`,path:[`linkedin`,`campaign-conversion-rules`,`list`],summary:`List which conversion rules are attached to the given campaigns. Use this to answer 'why is this campaign reporting no conversions?' — an unattached rule is credited to nothing. Returns the conversion URNs plus when each was attached; pass those URNs to get_conversion_rule for the detail.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Campaign ids (numeric) or urn:li:sponsoredCampaign: URNs to look up.`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-conversion-rules list --workspace-id <workspaceId> --campaign-ids '{}'`}],output:{kind:`json`,description:`List which conversion rules are attached to the given campaigns. Use this to answer 'why is this campaign reporting no conversions?' — an unattached rule is credited to nothing. Returns the conversion URNs plus when each was attached; pass those URNs to get_conversion_rule for the detail.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-conversion-rules/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_campaign_group`,path:[`linkedin`,`campaign-groups`,`get`],summary:'Get the complete configuration for one LinkedIn campaign group, including schedule, budget, audit/version, objective, and delivery settings. Use list_campaign_groups for discovery and this getter only when full detail is required. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:``,required:!1,valueType:`string`,location:`body`},{name:`campaign_group_id`,flag:`--campaign-group-id`,description:`Campaign group ID or urn:li:sponsoredCampaignGroup URN`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-groups get --workspace-id <workspaceId> --campaign-group-id <campaign_group_id>`}],output:{kind:`json`,description:'Get the complete configuration for one LinkedIn campaign group, including schedule, budget, audit/version, objective, and delivery settings. Use list_campaign_groups for discovery and this getter only when full detail is required. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-groups/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_campaign_groups`,path:[`linkedin`,`campaign-groups`,`list`],summary:'Search and list campaign groups for a LinkedIn Ad Account. Filter by status, name, or test flag. Supports cursor-based pagination. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by campaign group status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`ARCHIVED`,`CANCELED`,`DRAFT`,`PAUSED`,`PENDING_DELETION`,`REMOVED`],location:`body`},{name:`name`,flag:`--name`,description:`Filter by campaign group name`,required:!1,valueType:`string`,location:`body`},{name:`test`,flag:`--test`,description:`Filter by test (true) or non-test (false) campaign groups`,required:!1,valueType:`boolean`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by campaign group ID (default: ASCENDING)`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Number of results per page (max 1000)`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page of results`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-groups list --workspace-id <workspaceId>`}],output:{kind:`json`,description:'Search and list campaign groups for a LinkedIn Ad Account. Filter by status, name, or test flag. Supports cursor-based pagination. VOCABULARY: the API\'s `campaignGroup` is what Campaign Manager shows as "Campaign" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-groups/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.verify_campaign_readiness`,path:[`linkedin`,`campaign-readiness`,`verify`],summary:`Verify campaign readiness by checking serving statuses, budget, targeting, and LinkedIn's cross-field campaign rules (objective/format, optimization target/cost type, Connected TV). Returns a diagnostic report with issues and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:`Specific campaign ID to verify. If omitted, checks all ACTIVE campaigns.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaign-readiness verify --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Verify campaign readiness by checking serving statuses, budget, targeting, and LinkedIn's cross-field campaign rules (objective/format, optimization target/cost type, Connected TV). Returns a diagnostic report with issues and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaign-readiness/verify`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_linkedin_campaign`,path:[`linkedin`,`campaigns`,`get`],summary:'Get the complete configuration for one LinkedIn campaign, including targetingCriteria, version, schedule, optimization, budget, audit stamps, and delivery settings. Use list/search for discovery, then this getter before any targeting update. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the connected account.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_id`,flag:`--campaign-id`,description:`Campaign ID or urn:li:sponsoredCampaign URN`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaigns get --workspace-id <workspaceId> --campaign-id <campaign_id>`}],output:{kind:`json`,description:'Get the complete configuration for one LinkedIn campaign, including targetingCriteria, version, schedule, optimization, budget, audit stamps, and delivery settings. Use list/search for discovery, then this getter before any targeting update. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaigns/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_linkedin_campaigns`,path:[`linkedin`,`campaigns`,`list`],summary:`List campaigns for a LinkedIn Ad Account. Filter by status, type, campaign group, or name. Supports cursor-based pagination. Read servingStatuses, not status, to tell whether a campaign is actually delivering: status is what the advertiser set, servingStatuses is LinkedIn's verdict (RUNNABLE, or a *_HOLD explaining why it is not serving). VOCABULARY: the API's \`campaign\` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by campaign status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`ARCHIVED`,`COMPLETED`,`CANCELED`,`DRAFT`,`PENDING_DELETION`,`REMOVED`],location:`body`},{name:`campaign_group_id`,flag:`--campaign-group-id`,description:`Filter by campaign group ID`,required:!1,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:`Filter by campaign type`,required:!1,valueType:`string`,enum:[`TEXT_AD`,`SPONSORED_UPDATES`,`SPONSORED_INMAILS`,`DYNAMIC`],location:`body`},{name:`name`,flag:`--name`,description:`Filter by campaign name`,required:!1,valueType:`string`,location:`body`},{name:`test`,flag:`--test`,description:`Filter by test (true) or non-test (false)`,required:!1,valueType:`boolean`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by campaign ID (default: ASCENDING)`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Number of results per page (max 1000)`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page of results`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaigns list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List campaigns for a LinkedIn Ad Account. Filter by status, type, campaign group, or name. Supports cursor-based pagination. Read servingStatuses, not status, to tell whether a campaign is actually delivering: status is what the advertiser set, servingStatuses is LinkedIn's verdict (RUNNABLE, or a *_HOLD explaining why it is not serving). VOCABULARY: the API's \`campaign\` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaigns/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.search_campaigns`,path:[`linkedin`,`campaigns`,`search`],summary:'Search campaigns with multiple filters (IDs, statuses, types, campaign groups). More flexible than list_campaigns for complex queries. As with list_linkedin_campaigns, servingStatuses — not status — says whether a campaign is actually delivering. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`List of campaign IDs to fetch`,required:!1,valueType:`json`,location:`body`},{name:`statuses`,flag:`--statuses`,description:`Filter by multiple statuses`,required:!1,valueType:`json`,location:`body`},{name:`campaign_group_ids`,flag:`--campaign-group-ids`,description:`Filter by multiple campaign group IDs`,required:!1,valueType:`json`,location:`body`},{name:`types`,flag:`--types`,description:`Filter by multiple campaign types`,required:!1,valueType:`json`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by campaign ID`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Page size`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin campaigns search --workspace-id <workspaceId>`}],output:{kind:`json`,description:'Search campaigns with multiple filters (IDs, statuses, types, campaign groups). More flexible than list_campaigns for complex queries. As with list_linkedin_campaigns, servingStatuses — not status — says whether a campaign is actually delivering. VOCABULARY: the API\'s `campaign` is what Campaign Manager shows as "Ad set" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/campaigns/search`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_conversion_rule`,path:[`linkedin`,`conversion-rule`,`get`],summary:`Get one conversion rule by id, with its attribution settings, value, URL rules, associated campaigns and (for pixel rules) the Insight Tag <img> snippet. Read this before update_conversion_rule so you change only what you mean to — and use it to name a rule id found on a campaign, which list_conversions can only resolve by scanning.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`conversion_rule_id`,flag:`--conversion-rule-id`,description:`The rule's numeric id, or the full urn:lla:llaPartnerConversion:… as it appears in a campaign's conversion list.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin conversion-rule get --workspace-id <workspaceId> --conversion-rule-id <conversion_rule_id>`}],output:{kind:`json`,description:`Get one conversion rule by id, with its attribution settings, value, URL rules, associated campaigns and (for pixel rules) the Insight Tag <img> snippet. Read this before update_conversion_rule so you change only what you mean to — and use it to name a rule id found on a campaign, which list_conversions can only resolve by scanning.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/conversion-rule/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_conversions`,path:[`linkedin`,`conversions`,`list`],summary:"List the conversion rules on a LinkedIn Ad Account: name, type, method, attribution settings, conversion value and enabled status. LinkedIn serves 10 per page, so check `next_start` in the response before concluding you have seen them all.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first rule to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many rules to return. LinkedIn defaults to 10 if unset, so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin conversions list --workspace-id <workspaceId>`}],output:{kind:`json`,description:"List the conversion rules on a LinkedIn Ad Account: name, type, method, attribution settings, conversion value and enabled status. LinkedIn serves 10 per page, so check `next_start` in the response before concluding you have seen them all."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/conversions/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_creative`,path:[`linkedin`,`creatives`,`get`],summary:'Get a creative by ID: its status, review status, serving hold reasons — and the actual content of the ad, read from the post it points at. `post` carries the body text, the headline, the image URN, the landing page and each carousel card. Use it to tell someone what an ad says, or to rebuild one elsewhere. VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`creative_id`,flag:`--creative-id`,description:`Creative ID or URN (e.g. '120491345' or 'urn:li:sponsoredCreative:120491345')`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin creatives get --workspace-id <workspaceId> --creative-id <creative_id>`}],output:{kind:`json`,description:'Get a creative by ID: its status, review status, serving hold reasons — and the actual content of the ad, read from the post it points at. `post` carries the body text, the headline, the image URN, the landing page and each carousel card. Use it to tell someone what an ad says, or to rebuild one elsewhere. VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/creatives/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_linkedin_creatives`,path:[`linkedin`,`creatives`,`list`],summary:'Search and list creatives for a LinkedIn Ad Account. Filter by campaign, status, or creative IDs. Uses q=criteria finder with cursor-based pagination (max 100 per page). VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.',description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Filter by campaign URNs or IDs`,required:!1,valueType:`json`,location:`body`},{name:`intended_statuses`,flag:`--intended-statuses`,description:`Filter by intended statuses`,required:!1,valueType:`json`,location:`body`},{name:`creative_ids`,flag:`--creative-ids`,description:`Filter by specific creative URNs`,required:!1,valueType:`json`,location:`body`},{name:`sort_order`,flag:`--sort-order`,description:`Sort order by creative ID (default: ASCENDING)`,required:!1,valueType:`string`,enum:[`ASCENDING`,`DESCENDING`],location:`body`},{name:`page_size`,flag:`--page-size`,description:`Number of results per page (max 100)`,required:!1,valueType:`number`,defaultValue:100,location:`body`},{name:`page_token`,flag:`--page-token`,description:`Cursor token for next page of results`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin creatives list --workspace-id <workspaceId>`}],output:{kind:`json`,description:'Search and list creatives for a LinkedIn Ad Account. Filter by campaign, status, or creative IDs. Uses q=criteria finder with cursor-based pagination (max 100 per page). VOCABULARY: the API\'s `creative` is what Campaign Manager shows as "Ad" (campaignGroup="Campaign", campaign="Ad set", creative="Ad"). Say both names when reporting to a user, or they will look in the wrong tab and think nothing happened.'},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/creatives/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_demographic_insights`,path:[`linkedin`,`demographic-insights`,`get`],summary:`Get professional demographic analytics for LinkedIn ads. Break down performance by member company, industry, seniority, job title, job function, or location. Uses q=analytics with MEMBER_* pivots. Note: demographic data has 12-24h delay and 2-year retention.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`pivot`,flag:`--pivot`,description:`Professional demographic dimension to group results by`,required:!0,valueType:`string`,enum:[`MEMBER_COMPANY`,`MEMBER_COMPANY_SIZE`,`MEMBER_INDUSTRY`,`MEMBER_SENIORITY`,`MEMBER_JOB_TITLE`,`MEMBER_JOB_FUNCTION`,`MEMBER_COUNTRY_V2`,`MEMBER_REGION_V2`,`MEMBER_COUNTY`],location:`body`},{name:`time_granularity`,flag:`--time-granularity`,description:`Time granularity for results`,required:!1,valueType:`string`,defaultValue:`ALL`,enum:[`DAILY`,`MONTHLY`,`ALL`],location:`body`},{name:`date_range_start`,flag:`--date-range-start`,description:`Start date (inclusive)`,required:!0,valueType:`json`,location:`body`},{name:`date_range_end`,flag:`--date-range-end`,description:`End date (inclusive)`,required:!1,valueType:`json`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Filter by campaign IDs`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific metrics to return (max 20). Note: some metrics not available with demographic pivots.`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin demographic-insights get --workspace-id <workspaceId> --pivot MEMBER_COMPANY --date-range-start '{}'`}],output:{kind:`json`,description:`Get professional demographic analytics for LinkedIn ads. Break down performance by member company, industry, seniority, job title, job function, or location. Uses q=analytics with MEMBER_* pivots. Note: demographic data has 12-24h delay and 2-year retention.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/demographic-insights/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_lead_gen_form`,path:[`linkedin`,`lead-gen-forms`,`get`],summary:`Get one lead gen form with the questions it asks and the tracking parameters it appends. Use it to tell a client what a form collects before attaching it to an ad, or to check that an existing ad's form still asks for what the campaign needs.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`lead_gen_form_id`,flag:`--lead-gen-form-id`,description:`Numeric id of the form, or its full urn:li:adForm: URN — either is accepted.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin lead-gen-forms get --workspace-id <workspaceId> --lead-gen-form-id <lead_gen_form_id>`}],output:{kind:`json`,description:`Get one lead gen form with the questions it asks and the tracking parameters it appends. Use it to tell a client what a form collects before attaching it to an ad, or to check that an existing ad's form still asks for what the campaign needs.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/lead-gen-forms/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_lead_gen_forms`,path:[`linkedin`,`lead-gen-forms`,`list`],summary:"List the lead gen forms an ad account owns. A lead gen ad opens one of these inside LinkedIn, pre-filled from the member's profile, instead of sending them to a website. Each result carries the `urn` that create_creative's leadgen_form_id expects, so use this before building a LEAD_GENERATION ad — form URNs cannot be discovered any other way.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first form to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many forms to return. LinkedIn defaults to 10 if unset (measured: 10 served against a total of 30), so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin lead-gen-forms list --workspace-id <workspaceId>`}],output:{kind:`json`,description:"List the lead gen forms an ad account owns. A lead gen ad opens one of these inside LinkedIn, pre-filled from the member's profile, instead of sending them to a website. Each result carries the `urn` that create_creative's leadgen_form_id expects, so use this before building a LEAD_GENERATION ad — form URNs cannot be discovered any other way."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/lead-gen-forms/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_matched_audience`,path:[`linkedin`,`matched-audiences`,`get`],summary:`Check an audience built by uploading a contact or company list: whether LinkedIn has finished matching it, how many contacts were sent, how many members it recognized, and the urn:li:adSegment: URN to target once it is ready. Use this when someone asks how an audience import turned out or how big the audience is — the size is not stored anywhere on our side and only exists here. Matching takes up to 48 hours, so a status of BUILDING shortly after an import is normal and not a failure.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`segment_id`,flag:`--segment-id`,description:`The DMP segment's numeric id — the id an audience import reports when it finishes. Not the urn:li:adSegment: URN, which is a different object; use get_ad_segment for that one.`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin matched-audiences get --workspace-id <workspaceId> --segment-id <segment_id>`}],output:{kind:`json`,description:`Check an audience built by uploading a contact or company list: whether LinkedIn has finished matching it, how many contacts were sent, how many members it recognized, and the urn:li:adSegment: URN to target once it is ready. Use this when someone asks how an audience import turned out or how big the audience is — the size is not stored anywhere on our side and only exists here. Matching takes up to 48 hours, so a status of BUILDING shortly after an import is normal and not a failure.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/matched-audiences/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_matched_audiences`,path:[`linkedin`,`matched-audiences`,`list`],summary:`List the audiences an ad account has built from uploaded contact or company lists, with their matching status and sizes. Use this to find an audience by name — after an import, the numeric id needed by get_matched_audience is not something the user has, but the name they chose is.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`start`,flag:`--start`,description:`Index of the first audience to return (offset paging).`,required:!1,valueType:`number`,defaultValue:0,location:`body`},{name:`count`,flag:`--count`,description:"How many to return. LinkedIn defaults to 10 if unset, so this tool asks for 100; check `next_start` in the response for more.",required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside linkedin matched-audiences list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the audiences an ad account has built from uploaded contact or company lists, with their matching status and sizes. Use this to find an audience by name — after an import, the numeric id needed by get_matched_audience is not something the user has, but the name they chose is.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/matched-audiences/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.compare_linkedin_performance`,path:[`linkedin`,`performance`,`compare`],summary:`Compare performance across multiple campaigns side-by-side. Returns analytics grouped by campaign for easy comparison of metrics like impressions, clicks, cost, and conversions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_ids`,flag:`--campaign-ids`,description:`Campaign IDs to compare`,required:!0,valueType:`json`,location:`body`},{name:`time_granularity`,flag:`--time-granularity`,description:`Time granularity`,required:!1,valueType:`string`,defaultValue:`ALL`,enum:[`DAILY`,`MONTHLY`,`ALL`],location:`body`},{name:`date_range_start`,flag:`--date-range-start`,description:`Start date (inclusive)`,required:!0,valueType:`json`,location:`body`},{name:`date_range_end`,flag:`--date-range-end`,description:`End date (inclusive)`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific metrics to return (max 20)`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin performance compare --workspace-id <workspaceId> --campaign-ids '{}' --date-range-start '{}'`}],output:{kind:`json`,description:`Compare performance across multiple campaigns side-by-side. Returns analytics grouped by campaign for easy comparison of metrics like impressions, clicks, cost, and conversions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/performance/compare`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_saved_audience`,path:[`linkedin`,`saved-audiences`,`get`],summary:`Get one saved audience with its full targeting criteria. Read this before update_saved_audience: an update REPLACES the criteria rather than merging into them.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`saved_audience_id`,flag:`--saved-audience-id`,description:`Numeric id of the saved audience (adTargetTemplate).`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin saved-audiences get --workspace-id <workspaceId> --saved-audience-id <saved_audience_id>`}],output:{kind:`json`,description:`Get one saved audience with its full targeting criteria. Read this before update_saved_audience: an update REPLACES the criteria rather than merging into them.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/saved-audiences/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.list_saved_audiences`,path:[`linkedin`,`saved-audiences`,`list`],summary:`List an account's saved audiences (reusable targeting templates built in Campaign Manager). Each one carries a full targeting_criteria that can be copied verbatim into create_linkedin_campaign, or into update_linkedin_campaign to give an existing campaign an audience. Prefer these over composing an audience from scratch: they are the audiences the account already trusts.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID (numeric). Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`sort_field`,flag:`--sort-field`,description:`Sort order. LinkedIn requires one; NAME is the default here.`,required:!1,valueType:`string`,defaultValue:`NAME`,enum:[`NAME`,`LAST_MODIFIED`,`ID`],location:`body`}],examples:[{description:`Example`,command:`adside linkedin saved-audiences list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List an account's saved audiences (reusable targeting templates built in Campaign Manager). Each one carries a full targeting_criteria that can be copied verbatim into create_linkedin_campaign, or into update_linkedin_campaign to give an existing campaign an audience. Prefer these over composing an audience from scratch: they are the audiences the account already trusts.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/saved-audiences/list`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_targeting_entities`,path:[`linkedin`,`targeting-entities`,`get`],summary:`Resolve targeting URNs to human-readable names. Pass a list of URNs (e.g. urn:li:seniority:7, urn:li:industry:9) to get their display names.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`urns`,flag:`--urns`,description:`List of URNs to resolve (e.g. ['urn:li:seniority:7', 'urn:li:industry:9'])`,required:!0,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin targeting-entities get --workspace-id <workspaceId> --urns '{}'`}],output:{kind:`json`,description:`Resolve targeting URNs to human-readable names. Pass a list of URNs (e.g. urn:li:seniority:7, urn:li:industry:9) to get their display names.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/targeting-entities/get`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.search_targeting_facets`,path:[`linkedin`,`targeting-facets`,`search`],summary:`Search for targeting entity values by facet type. Use typeahead search with a query string, or list all values for a facet. Returns URNs to use in campaign targeting criteria.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`facet`,flag:`--facet`,description:`Targeting facet to search (e.g. locations, industries, titles). These facets REQUIRE a query — they cannot be listed: employers, employersAll, employersPast, schools, skills, groups, followedCompanies, firstDegreeConnectionCompanies. Not searchable at all, but valid in campaign targeting: audienceMatchingSegments, dynamicSegments — their values are your own audience segments, not LinkedIn attributes.`,required:!0,valueType:`string`,enum:`locations.profileLocations.industries.seniorities.titles.titlesAll.titlesPast.jobFunctions.degrees.fieldsOfStudy.staffCountRanges.interests.ageRanges.genders.interfaceLocales.companyCategory.growthRate.memberBehaviors.yearsOfExperienceRanges.revenue.employers.employersAll.employersPast.schools.skills.groups.followedCompanies.firstDegreeConnectionCompanies`.split(`.`),location:`body`},{name:`query`,flag:`--query`,description:`Search text for typeahead (e.g. 'Software Engineer'). If omitted, returns all values for the facet — which only works for a listable facet.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin targeting-facets search --workspace-id <workspaceId> --facet locations`}],output:{kind:`json`,description:`Search for targeting entity values by facet type. Use typeahead search with a query string, or list all values for a facet. Returns URNs to use in campaign targeting criteria.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/targeting-facets/search`,auth:`user`,requestContentType:`application/json`}},{id:`linkedin.get_video_upload`,path:[`linkedin`,`video-upload`,`get`],summary:`Status of a video upload started with upload_video: PENDING → PREPARING → UPLOADING → PROCESSING → AVAILABLE (or FAILED). This call WAITS (up to wait_seconds, default 3 minutes) for the upload to finish before answering, so call it once rather than polling; if it still says still_running, call it again. Once AVAILABLE, the video_urn is what create_creative's SINGLE_VIDEO branch takes as video_id.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`LinkedIn Ad Account ID. Omit it: it defaults to the account this client is connected to, and any other account is refused.`,required:!1,valueType:`string`,location:`body`},{name:`wait_seconds`,flag:`--wait-seconds`,description:`Seconds to wait for the upload to reach AVAILABLE (or FAILED) before answering. Default 180, max 240. Leave the default: one call then usually returns the video_urn. 0 returns the current state at once.`,required:!1,valueType:`number`,defaultValue:180,location:`body`},{name:`upload_id`,flag:`--upload-id`,description:`The upload_id returned by upload_video. Omit it to get the most recent upload for this client.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside linkedin video-upload get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Status of a video upload started with upload_video: PENDING → PREPARING → UPLOADING → PROCESSING → AVAILABLE (or FAILED). This call WAITS (up to wait_seconds, default 3 minutes) for the upload to finish before answering, so call it once rather than polling; if it still says still_running, call it again. Once AVAILABLE, the video_urn is what create_creative's SINGLE_VIDEO branch takes as video_id.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/linkedin/video-upload/get`,auth:`user`,requestContentType:`application/json`}},{id:`media.images.cancel`,path:[`media`,`images`,`cancel`],summary:`Cancel an image job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media images cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel an image job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/images/{jobId}/cancel`,auth:`user`}},{id:`media.images.estimate`,path:[`media`,`images`,`estimate`],summary:`Price an image request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`512`,`768`,`1K`,`1.5K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`auto`,`1:1`,`2:3`,`3:2`,`3:4`,`4:3`,`4:5`,`5:4`,`9:16`,`16:9`,`21:9`,`9:21`,`1:2`,`2:1`,`1:4`,`4:1`,`1:8`,`8:1`],location:`body`},{name:`inputReferences`,flag:`--input-references`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside media images estimate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Price an image request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/images/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.images.generate`,path:[`media`,`images`,`generate`],summary:`Generate one image, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`512`,`768`,`1K`,`1.5K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`auto`,`1:1`,`2:3`,`3:2`,`3:4`,`4:3`,`4:5`,`5:4`,`9:16`,`16:9`,`21:9`,`9:21`,`1:2`,`2:1`,`1:4`,`4:1`,`1:8`,`8:1`],location:`body`},{name:`inputReferences`,flag:`--input-references`,description:``,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside media images generate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Generate one image, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/images`,auth:`user`,requestContentType:`application/json`}},{id:`media.images.get`,path:[`media`,`images`,`get`],summary:`Read an image job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media images get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read an image job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/images/{jobId}`,auth:`user`}},{id:`media.images.models`,path:[`media`,`images`,`models`],summary:`List the image models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media images models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the image models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/images/models`,auth:`user`}},{id:`media.jobs.list`,path:[`media`,`jobs`,`list`],summary:`List the workspace's image, video and audio jobs, newest first`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`image`,`video`,`speech`,`sound`,`music`],location:`query`},{name:`status`,flag:`--status`,description:``,required:!1,valueType:`string`,enum:[`pending`,`in_progress`,`completed`,`failed`,`cancelled`,`expired`],location:`query`},{name:`cursor`,flag:`--cursor`,description:``,required:!1,valueType:`string`,location:`query`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:20,location:`query`}],examples:[{description:`Example`,command:`adside media jobs list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the workspace's image, video and audio jobs, newest first`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/jobs`,auth:`user`}},{id:`media.music.cancel`,path:[`media`,`music`,`cancel`],summary:`Cancel a music track job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media music cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel a music track job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/music/{jobId}/cancel`,auth:`user`}},{id:`media.music.estimate`,path:[`media`,`music`,`estimate`],summary:`Price a music track request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`instrumental`,flag:`--instrumental`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media music estimate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Price a music track request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/music/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.music.generate`,path:[`media`,`music`,`generate`],summary:`Generate one music track, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`instrumental`,flag:`--instrumental`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media music generate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Generate one music track, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/music`,auth:`user`,requestContentType:`application/json`}},{id:`media.music.get`,path:[`media`,`music`,`get`],summary:`Read a music track job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media music get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read a music track job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/music/{jobId}`,auth:`user`}},{id:`media.music.models`,path:[`media`,`music`,`models`],summary:`List the music track models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media music models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the music track models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/music/models`,auth:`user`}},{id:`media.recommendations.create`,path:[`media`,`recommend`],summary:`Recommend up to three models for a task described in plain words, with why, ready-to-use parameters, the price and the model family's prompting guide`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`task`,flag:`--task`,description:``,required:!0,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:``,required:!1,valueType:`string`,enum:[`image`,`video`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`generateAudio`,flag:`--generate-audio`,description:``,required:!1,valueType:`boolean`,location:`body`},{name:`inputs`,flag:`--inputs`,description:``,required:!1,valueType:`json`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`priority`,flag:`--priority`,description:``,required:!1,valueType:`string`,enum:[`quality`,`balanced`,`cost`],location:`body`}],examples:[{description:`Example`,command:`adside media recommend --workspace-id <workspaceId> --task <task>`}],output:{kind:`json`,description:`Recommend up to three models for a task described in plain words, with why, ready-to-use parameters, the price and the model family's prompting guide`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/recommendations`,auth:`user`,requestContentType:`application/json`}},{id:`media.sounds.cancel`,path:[`media`,`sounds`,`cancel`],summary:`Cancel a sound effect job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media sounds cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel a sound effect job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/sounds/{jobId}/cancel`,auth:`user`}},{id:`media.sounds.estimate`,path:[`media`,`sounds`,`estimate`],summary:`Price a sound effect request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`loop`,flag:`--loop`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media sounds estimate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Price a sound effect request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/sounds/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.sounds.generate`,path:[`media`,`sounds`,`generate`],summary:`Generate one sound effect, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`loop`,flag:`--loop`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media sounds generate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Generate one sound effect, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/sounds`,auth:`user`,requestContentType:`application/json`}},{id:`media.sounds.get`,path:[`media`,`sounds`,`get`],summary:`Read a sound effect job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media sounds get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read a sound effect job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/sounds/{jobId}`,auth:`user`}},{id:`media.sounds.models`,path:[`media`,`sounds`,`models`],summary:`List the sound effect models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media sounds models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the sound effect models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/sounds/models`,auth:`user`}},{id:`media.speech.cancel`,path:[`media`,`speech`,`cancel`],summary:`Cancel a speech clip job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media speech cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel a speech clip job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/speech/{jobId}/cancel`,auth:`user`}},{id:`media.speech.estimate`,path:[`media`,`speech`,`estimate`],summary:`Price a speech clip request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`text`,flag:`--text`,description:``,required:!0,valueType:`string`,location:`body`},{name:`voice`,flag:`--voice`,description:``,required:!1,valueType:`string`,location:`body`},{name:`languageCode`,flag:`--language-code`,description:``,required:!1,valueType:`string`,location:`body`},{name:`stability`,flag:`--stability`,description:``,required:!1,valueType:`number`,location:`body`},{name:`speed`,flag:`--speed`,description:``,required:!1,valueType:`number`,location:`body`}],examples:[{description:`Example`,command:`adside media speech estimate --workspace-id <workspaceId> --text <text>`}],output:{kind:`json`,description:`Price a speech clip request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/speech/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.speech.generate`,path:[`media`,`speech`,`generate`],summary:`Generate one speech clip, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`text`,flag:`--text`,description:``,required:!0,valueType:`string`,location:`body`},{name:`voice`,flag:`--voice`,description:``,required:!1,valueType:`string`,location:`body`},{name:`languageCode`,flag:`--language-code`,description:``,required:!1,valueType:`string`,location:`body`},{name:`stability`,flag:`--stability`,description:``,required:!1,valueType:`number`,location:`body`},{name:`speed`,flag:`--speed`,description:``,required:!1,valueType:`number`,location:`body`}],examples:[{description:`Example`,command:`adside media speech generate --workspace-id <workspaceId> --text <text>`}],output:{kind:`json`,description:`Generate one speech clip, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/speech`,auth:`user`,requestContentType:`application/json`}},{id:`media.speech.get`,path:[`media`,`speech`,`get`],summary:`Read a speech clip job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media speech get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read a speech clip job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/speech/{jobId}`,auth:`user`}},{id:`media.speech.models`,path:[`media`,`speech`,`models`],summary:`List the speech clip models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media speech models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the speech clip models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/speech/models`,auth:`user`}},{id:`media.videos.cancel`,path:[`media`,`videos`,`cancel`],summary:`Cancel a video job; one a provider already accepted may still finish and is still charged`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media videos cancel --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Cancel a video job; one a provider already accepted may still finish and is still charged`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/videos/{jobId}/cancel`,auth:`user`}},{id:`media.videos.estimate`,path:[`media`,`videos`,`estimate`],summary:`Price a video request without generating or charging`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`480p`,`720p`,`768p`,`1080p`,`1K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`9:16`,`16:9`,`1:1`,`4:3`,`3:4`,`3:2`,`2:3`,`21:9`,`9:21`],location:`body`},{name:`frameImages`,flag:`--frame-images`,description:``,required:!1,valueType:`json`,location:`body`},{name:`generateAudio`,flag:`--generate-audio`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media videos estimate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Price a video request without generating or charging`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/videos/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`media.videos.generate`,path:[`media`,`videos`,`generate`],summary:`Generate one video clip, charged at its priceUsd; the same requestId returns the same job`,description:``,source:`rest`,generateRequestId:!0,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`},{name:`requestId`,flag:`--request-id`,description:`Submission identity (generated automatically if omitted)`,required:!1,valueType:`string`,location:`body`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`body`},{name:`prompt`,flag:`--prompt`,description:``,required:!0,valueType:`string`,location:`body`},{name:`maxPriceUsd`,flag:`--max-price-usd`,description:``,required:!1,valueType:`number`,location:`body`},{name:`duration`,flag:`--duration`,description:``,required:!1,valueType:`number`,location:`body`},{name:`resolution`,flag:`--resolution`,description:``,required:!1,valueType:`string`,enum:[`480p`,`720p`,`768p`,`1080p`,`1K`,`2K`,`4K`],location:`body`},{name:`aspectRatio`,flag:`--aspect-ratio`,description:``,required:!1,valueType:`string`,enum:[`9:16`,`16:9`,`1:1`,`4:3`,`3:4`,`3:2`,`2:3`,`21:9`,`9:21`],location:`body`},{name:`frameImages`,flag:`--frame-images`,description:``,required:!1,valueType:`json`,location:`body`},{name:`generateAudio`,flag:`--generate-audio`,description:``,required:!1,valueType:`boolean`,location:`body`}],examples:[{description:`Example`,command:`adside media videos generate --workspace-id <workspaceId> --prompt <prompt>`}],output:{kind:`json`,description:`Generate one video clip, charged at its priceUsd; the same requestId returns the same job`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/media/videos`,auth:`user`,requestContentType:`application/json`}},{id:`media.videos.get`,path:[`media`,`videos`,`get`],summary:`Read a video job, waiting up to waitSeconds for it to finish`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`jobId`,flag:`--job-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`waitSeconds`,flag:`--wait-seconds`,description:``,required:!1,valueType:`number`,defaultValue:0,location:`query`}],examples:[{description:`Example`,command:`adside media videos get --workspace-id <workspaceId> --job-id <jobId>`}],output:{kind:`json`,description:`Read a video job, waiting up to waitSeconds for it to finish`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/videos/{jobId}`,auth:`user`}},{id:`media.videos.models`,path:[`media`,`videos`,`models`],summary:`List the video models, what each is best for, its supported values and prices`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside media videos models --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the video models, what each is best for, its supported values and prices`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/videos/models`,auth:`user`}},{id:`media.voices.list`,path:[`media`,`voices`,`list`],summary:`List the stock voices a speech request may name, with what each suits and the models that offer it`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`model`,flag:`--model`,description:``,required:!1,valueType:`string`,location:`query`}],examples:[{description:`Example`,command:`adside media voices list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List the stock voices a speech request may name, with what each suits and the models that offer it`},transport:{type:`rest`,method:`GET`,path:`/v1/workspaces/{workspaceId}/media/voices`,auth:`user`}},{id:`meta.analyze_account_creatives`,path:[`meta`,`account-creatives`,`analyze`],summary:`Analyze all creatives in an account to identify patterns, performance insights, and optimization opportunities. Provides summary statistics and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID to analyze (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:`Maximum number of creatives to analyze`,required:!1,valueType:`number`,defaultValue:50,location:`body`}],examples:[{description:`Example`,command:`adside meta account-creatives analyze --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Analyze all creatives in an account to identify patterns, performance insights, and optimization opportunities. Provides summary statistics and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-creatives/analyze`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_account_pages`,path:[`meta`,`account-pages`,`get`],summary:`List Facebook Pages available for ad creation on the given ad account, with each Page's Instagram business account as instagram_account_id when Meta lists one for this ad account. Page IDs go in promoted_object and object_story_spec; the Instagram id goes in a creative's instagram_actor_id so the ad runs under the client's own Instagram account. An empty list does NOT mean the account has no Page (Meta gates the list on what the connecting user granted at consent), and a missing instagram_account_id does NOT mean the Page has no Instagram account (usually it is not connected to the ad account yet) — the response says what to check.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-pages get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List Facebook Pages available for ad creation on the given ad account, with each Page's Instagram business account as instagram_account_id when Meta lists one for this ad account. Page IDs go in promoted_object and object_story_spec; the Instagram id goes in a creative's instagram_actor_id so the ad runs under the client's own Instagram account. An empty list does NOT mean the account has no Page (Meta gates the list on what the connecting user granted at consent), and a missing instagram_account_id does NOT mean the Page has no Instagram account (usually it is not connected to the ad account yet) — the response says what to check.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-pages/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_account_pixels`,path:[`meta`,`account-pixels`,`get`],summary:`List pixels/datasets available to this client's connected ad account, including ones with no attached ad sets. Returns IDs, names, last_fired_time and availability. Follow next_cursor for more datasets. Use get_pixel for metadata/settings and get_pixel_stats for recent event activity (standard/custom event names, counts, sources and diagnostics) before launch. An empty list does NOT mean no pixel exists: a pixel created in Events Manager is not listed until it is connected to the ad account. The empty response lists the ad account's Business datasets that are not connected to it and says how to connect one; relay that before suggesting create_dataset.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:``,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Next-page cursor from get_account_pixels.`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-pixels get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List pixels/datasets available to this client's connected ad account, including ones with no attached ad sets. Returns IDs, names, last_fired_time and availability. Follow next_cursor for more datasets. Use get_pixel for metadata/settings and get_pixel_stats for recent event activity (standard/custom event names, counts, sources and diagnostics) before launch. An empty list does NOT mean no pixel exists: a pixel created in Events Manager is not listed until it is connected to the ad account. The empty response lists the ad account's Business datasets that are not connected to it and says how to connect one; relay that before suggesting create_dataset.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-pixels/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.verify_account_setup`,path:[`meta`,`account-setup`,`verify`],summary:`Check Meta account access, active status, funding visibility, promotable Pages and spending capacity. Unknown prerequisites prevent ready status. Does not establish billing chargeability, business verification or launch readiness.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID to verify (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-setup verify --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Check Meta account access, active status, funding visibility, promotable Pages and spending capacity. Unknown prerequisites prevent ready status. Does not establish billing chargeability, business verification or launch readiness.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-setup/verify`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_meta_account_spend_limit`,path:[`meta`,`account-spend-limit`,`get`],summary:`Read the Meta ad account's spending limit and how much has been spent toward it. When the limit is reached Meta stops delivery for EVERY campaign in the account at once — check this first when all ads stopped running on the same day and no campaign-level setting explains it. Amounts are in the account currency's standard units (5000 = $5,000).`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta account-spend-limit get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Read the Meta ad account's spending limit and how much has been spent toward it. When the limit is reached Meta stops delivery for EVERY campaign in the account at once — check this first when all ads stopped running on the same day and no campaign-level setting explains it. Amounts are in the account currency's standard units (5000 = $5,000).`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/account-spend-limit/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad_creative`,path:[`meta`,`ad-creative`,`get`],summary:`Get a single ad creative by ID with full details including copy, media, and Advantage+ Creative (asset_feed_spec) data. Use this to retrieve the actual ad copy text (bodies, titles, descriptions) for creatives using Advantage+ or dynamic creative optimization.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creative_id`,flag:`--creative-id`,description:`The creative ID to fetch`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-creative get --workspace-id <workspaceId> --creative-id <creative_id>`}],output:{kind:`json`,description:`Get a single ad creative by ID with full details including copy, media, and Advantage+ Creative (asset_feed_spec) data. Use this to retrieve the actual ad copy text (bodies, titles, descriptions) for creatives using Advantage+ or dynamic creative optimization.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-creative/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad_images`,path:[`meta`,`ad-images`,`get`],summary:`Retrieve ad images from a Meta ad account. Returns image URLs, dimensions, and hashes. Use to get image URLs for displaying ad creatives or generating variations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`hashes`,flag:`--hashes`,description:`Filter by specific image hashes`,required:!1,valueType:`json`,location:`body`},{name:`limit`,flag:`--limit`,description:`Maximum number of images to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-images get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Retrieve ad images from a Meta ad account. Returns image URLs, dimensions, and hashes. Use to get image URLs for displaying ad creatives or generating variations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-images/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad_set`,path:[`meta`,`ad-sets`,`get`],summary:`Retrieve details for a single ad set including its targeting, budget, optimization goal, and schedule. To duplicate it, pass this ad set ID as source_ad_set_id to create_ad_set_enhanced and omit targeting. If faithful duplication is refused, report the unsupported fields; never silently narrow the audience or placements.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`adset_id`,flag:`--adset-id`,description:`Ad set ID to retrieve`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-sets get --workspace-id <workspaceId> --adset-id <adset_id>`}],output:{kind:`json`,description:`Retrieve details for a single ad set including its targeting, budget, optimization goal, and schedule. To duplicate it, pass this ad set ID as source_ad_set_id to create_ad_set_enhanced and omit targeting. If faithful duplication is refused, report the unsupported fields; never silently narrow the audience or placements.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-sets/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_ad_sets`,path:[`meta`,`ad-sets`,`list`],summary:`List all ad sets for a given campaign or ad account. Filter by status and paginate results. Returns ad set details including budget, targeting, and optimization settings.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Filter by campaign ID`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Filter by account ID`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by ad set status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`DELETED`,`ARCHIVED`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of ad sets to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ad-sets list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List all ad sets for a given campaign or ad account. Filter by status and paginate results. Returns ad set details including budget, targeting, and optimization settings.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ad-sets/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_ad`,path:[`meta`,`ads`,`get`],summary:`Retrieve details for a single ad including its name, status, ad set, campaign, and creative.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`ad_id`,flag:`--ad-id`,description:`Ad ID to retrieve`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ads get --workspace-id <workspaceId> --ad-id <ad_id>`}],output:{kind:`json`,description:`Retrieve details for a single ad including its name, status, ad set, campaign, and creative.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ads/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_meta_ads`,path:[`meta`,`ads`,`list`],summary:`List all ads for a given campaign, ad set, or ad account. Filter by status and paginate results. Returns ad details including creative, status, and timing.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Filter by campaign ID`,required:!1,valueType:`string`,location:`body`},{name:`adset_id`,flag:`--adset-id`,description:`Filter by ad set ID`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Filter by account ID`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by ad status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`DELETED`,`ARCHIVED`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of ads to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta ads list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List all ads for a given campaign, ad set, or ad account. Filter by status and paginate results. Returns ad details including creative, status, and timing.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ads/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.preview_ad`,path:[`meta`,`ads`,`preview`],summary:`Generate HTML preview of how an ad creative will appear in different placements and formats. Useful for testing creative appearance before launching campaigns.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creative_id`,flag:`--creative-id`,description:`Creative ID to preview`,required:!0,valueType:`string`,location:`body`},{name:`ad_format`,flag:`--ad-format`,description:`Ad format for preview`,required:!0,valueType:`string`,enum:[`DESKTOP_FEED_STANDARD`,`MOBILE_FEED_STANDARD`,`MOBILE_FEED_BASIC`,`MOBILE_BANNER`,`MOBILE_MEDIUM_RECTANGLE`,`MOBILE_FULLWIDTH`,`MOBILE_INTERSTITIAL`,`INSTAGRAM_STANDARD`,`INSTAGRAM_STORY`],location:`body`},{name:`product_item_ids`,flag:`--product-item-ids`,description:`Product item IDs for dynamic ads`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside meta ads preview --workspace-id <workspaceId> --creative-id <creative_id> --ad-format DESKTOP_FEED_STANDARD`}],output:{kind:`json`,description:`Generate HTML preview of how an ad creative will appear in different placements and formats. Useful for testing creative appearance before launching campaigns.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/ads/preview`,auth:`user`,requestContentType:`application/json`}},{id:`meta.check_api_compliance`,path:[`meta`,`api-compliance`,`check`],summary:`Check if your creative parameters are compliant with current Meta Marketing API (v25.0) requirements. Identifies deprecated features and recommends best practices.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`name`,flag:`--name`,description:`Creative name`,required:!0,valueType:`string`,location:`body`},{name:`page_id`,flag:`--page-id`,description:`Facebook Page ID (required for object_story_spec)`,required:!0,valueType:`string`,location:`body`},{name:`message`,flag:`--message`,description:"Primary ad text/message (single-variant). Mutually exclusive with `bodies`.",required:!1,valueType:`string`,location:`body`},{name:`headline`,flag:`--headline`,description:"Ad title/headline (single-variant). Mutually exclusive with `titles`.",required:!1,valueType:`string`,location:`body`},{name:`bodies`,flag:`--bodies`,description:`Multi-variant primary texts (1–5). When set, the creative is built with asset_feed_spec and must be attached to a Dynamic Creative ad set.`,required:!1,valueType:`json`,location:`body`},{name:`titles`,flag:`--titles`,description:"Multi-variant headlines (1–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`descriptions`,flag:`--descriptions`,description:"Multi-variant descriptions (0–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`picture`,flag:`--picture`,description:`External image URL - must be publicly accessible`,required:!1,valueType:`url`,location:`body`},{name:`image_hash`,flag:`--image-hash`,description:`Pre-uploaded image hash (alternative to picture URL)`,required:!1,valueType:`string`,location:`body`},{name:`video_id`,flag:`--video-id`,description:`Video ID for video creatives`,required:!1,valueType:`string`,location:`body`},{name:`placement_assets`,flag:`--placement-assets`,description:"Placement asset customization (multi-ratio ad): one image or video per placement bucket, each `placement_group` at most once. Requires `image_hash` as the fallback image for placements not listed. Upload every ratio first (upload_image_from_url / upload_video_from_url) and pass the hashes. Mutually exclusive with `bodies`/`titles` — the resulting creative must be attached to a STANDARD ad set (Meta rejects it in a Dynamic Creative ad set).",required:!1,valueType:`json`,location:`body`},{name:`call_to_action_type`,flag:`--call-to-action-type`,description:`Call to action button type (40+ supported types)`,required:!1,valueType:`string`,enum:`LEARN_MORE.SHOP_NOW.SIGN_UP.DOWNLOAD.BOOK_TRAVEL.LISTEN_MUSIC.WATCH_VIDEO.GET_QUOTE.CONTACT_US.APPLY_NOW.GET_DIRECTIONS.CALL_NOW.MESSAGE_PAGE.SUBSCRIBE.BOOK_NOW.ORDER_NOW.DONATE_NOW.SAY_THANKS.SELL_NOW.SHARE.OPEN_LINK.LIKE_PAGE.FOLLOW_PAGE.FOLLOW_USER.REQUEST_TIME.VISIT_PAGES_FEED.USE_APP.PLAY_GAME.INSTALL_APP.USE_MOBILE_APP.INSTALL_MOBILE_APP.OPEN_MOVIES.AUDIO_CALL.VIDEO_CALL.GET_OFFER.GET_OFFER_VIEW.BUY_NOW.ADD_TO_CART.SELL.GIFT_WRAP.MAKE_AN_OFFER.BUY_TICKETS.EXPLORE_MORE.GET_PROMOTIONS.GET_SHOWTIMES.LISTEN_NOW.SAVE.SEE_DETAILS.SEE_MENU.WATCH_MORE.WHATSAPP_MESSAGE`.split(`.`),location:`body`},{name:`link_url`,flag:`--link-url`,description:`Destination URL where users will be directed when clicking the ad`,required:!0,valueType:`url`,location:`body`},{name:`description`,flag:`--description`,description:`Additional description text`,required:!1,valueType:`string`,location:`body`},{name:`instagram_actor_id`,flag:`--instagram-actor-id`,description:`Optional. Instagram Business Account ID of the Page's Instagram account (typically starts with 1784) — the instagram_account_id get_account_pages reports for that Page. When omitted the tool resolves the identity itself: the Page's Instagram business account, else — for placement-customised and variation creatives only, which Meta refuses without one — its Page-backed Instagram account (created when the Page has none — a write on the client's Page the result calls out), else the Page actor override. A standard creative is left without one when the Page has no Instagram account. The result reports which one it used in instagram_identity`,required:!1,valueType:`string`,location:`body`},{name:`adlabels`,flag:`--adlabels`,description:`Ad labels for organization and tracking`,required:!1,valueType:`json`,location:`body`},{name:`enable_standard_enhancements`,flag:`--enable-standard-enhancements`,description:`Enable Standard Enhancements with individual feature control`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`enhancement_features`,flag:`--enhancement-features`,description:`Individual enhancement feature controls`,required:!1,valueType:`json`,location:`body`},{name:`attachment_style`,flag:`--attachment-style`,description:`Attachment style for link ads`,required:!1,valueType:`string`,defaultValue:`link`,enum:[`link`,`album`],location:`body`},{name:`caption`,flag:`--caption`,description:`Caption text (typically domain name)`,required:!1,valueType:`string`,location:`body`},{name:`url_tags`,flag:`--url-tags`,description:`URL tags appended to the link URL for tracking (e.g. utm_source=...&utm_medium=...)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta api-compliance check --workspace-id <workspaceId> --name <name> --page-id <page_id> --link-url https://example.com`}],output:{kind:`json`,description:`Check if your creative parameters are compliant with current Meta Marketing API (v25.0) requirements. Identifies deprecated features and recommends best practices.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/api-compliance/check`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_meta_api_reference`,path:[`meta`,`api-reference`,`get`],summary:`Get a reference guide for valid Meta Marketing API parameters, including allowed optimization goals, billing events, and their valid combinations. Use this to troubleshoot parameter errors or to construct valid requests.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside meta api-reference get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get a reference guide for valid Meta Marketing API parameters, including allowed optimization goals, billing events, and their valid combinations. Use this to troubleshoot parameter errors or to construct valid requests.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/api-reference/get`,auth:`user`}},{id:`meta.get_attribution_data`,path:[`meta`,`attribution-data`,`get`],summary:"Retrieve attribution data with conversion tracking across multiple attribution windows (1-day click, 7-day click, 1-day view). Returns conversion metrics and cost-per-conversion analysis.\n\nRows are heavy: every row carries `actions` and `cost_per_action_type`, each entry split across three attribution windows. The response is capped in size — past that, rows are dropped and a `truncation` object says how many, and those rows are an arbitrary page rather than the top ones, because this endpoint returns no ranking. `summary` is always computed over every fetched row. Narrow the call (`limit`, a single `object_id`) rather than relying on the cap, and use the reporting-warehouse tools to rank objects over a period.",description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`object_id`,flag:`--object-id`,description:"ID of the object to get insights for. Omit it to use the connected ad account (recommended for account-wide queries at any level). Otherwise pass a campaign ID, ad set ID, or ad ID matching `level`. Account IDs other than the connected account are rejected. Passing a page/business/user ID returns Meta error #100.",required:!1,valueType:`string`,location:`body`},{name:`level`,flag:`--level`,description:`Level of insights to retrieve`,required:!0,valueType:`string`,enum:[`account`,`campaign`,`adset`,`ad`],location:`body`},{name:`date_preset`,flag:`--date-preset`,description:`Date preset for insights`,required:!1,valueType:`string`,enum:[`today`,`yesterday`,`last_3d`,`last_7d`,`last_14d`,`last_28d`,`last_30d`,`last_90d`,`this_week_mon_today`,`this_week_sun_today`,`last_week_mon_sun`,`last_week_sun_sat`,`this_month`,`last_month`,`this_quarter`,`last_quarter`,`this_year`,`last_year`,`maximum`,`data_maximum`],location:`body`},{name:`time_range`,flag:`--time-range`,description:`Custom date range for insights`,required:!1,valueType:`json`,location:`body`},{name:`fields`,flag:`--fields`,description:`Specific fields to retrieve (e.g., impressions, clicks, spend)`,required:!1,valueType:`json`,location:`body`},{name:`breakdowns`,flag:`--breakdowns`,description:`Breakdown dimensions (e.g., age, gender, placement)`,required:!1,valueType:`json`,location:`body`},{name:`time_increment`,flag:`--time-increment`,description:`Time granularity: "monthly" for monthly rows, "all_days" for daily rows, or a number 1-90 for N-day increments`,required:!1,valueType:`json`,location:`body`},{name:`limit`,flag:`--limit`,description:`Number of insights to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:"Cursor for the next page: pass back the `pagination.next_cursor` value from a previous response. Keep every other parameter identical, or the cursor no longer matches the query it came from.",required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta attribution-data get --workspace-id <workspaceId> --level account`}],output:{kind:`json`,description:"Retrieve attribution data with conversion tracking across multiple attribution windows (1-day click, 7-day click, 1-day view). Returns conversion metrics and cost-per-conversion analysis.\n\nRows are heavy: every row carries `actions` and `cost_per_action_type`, each entry split across three attribution windows. The response is capped in size — past that, rows are dropped and a `truncation` object says how many, and those rows are an arbitrary page rather than the top ones, because this endpoint returns no ranking. `summary` is always computed over every fetched row. Narrow the call (`limit`, a single `object_id`) rather than relying on the cap, and use the reporting-warehouse tools to rank objects over a period."},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/attribution-data/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_audience_details`,path:[`meta`,`audience-details`,`get`],summary:`Get detailed information about a specific audience including size estimates, delivery status, operation status, data source, and targeting rules.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`audience_id`,flag:`--audience-id`,description:`The audience ID to get details for`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta audience-details get --workspace-id <workspaceId> --audience-id <audience_id>`}],output:{kind:`json`,description:`Get detailed information about a specific audience including size estimates, delivery status, operation status, data source, and targeting rules.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/audience-details/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.estimate_audience_size`,path:[`meta`,`audience-size`,`estimate`],summary:`Estimate the potential reach of a targeting specification. Returns monthly and daily active user estimates with targeting recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`targeting`,flag:`--targeting`,description:`Targeting parameters for size estimation`,required:!0,valueType:`json`,location:`body`},{name:`optimization_goal`,flag:`--optimization-goal`,description:`Optimization goal for the estimate`,required:!0,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta audience-size estimate --workspace-id <workspaceId> --targeting '{}' --optimization-goal <optimization_goal>`}],output:{kind:`json`,description:`Estimate the potential reach of a targeting specification. Returns monthly and daily active user estimates with targeting recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/audience-size/estimate`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_audiences`,path:[`meta`,`audiences`,`list`],summary:`List custom and lookalike audiences for an ad account. Supports filtering by type (custom, lookalike, saved) and pagination.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`type`,flag:`--type`,description:`Filter by audience type`,required:!1,valueType:`string`,enum:[`custom`,`lookalike`,`saved`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of audiences to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta audiences list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List custom and lookalike audiences for an ad account. Supports filtering by type (custom, lookalike, saved) and pagination.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/audiences/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.search_behaviors`,path:[`meta`,`behaviors`,`search`],summary:`List all available targetable behaviors from Meta's targeting categories. Returns behavior IDs, names, descriptions, and audience sizes.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`limit`,flag:`--limit`,description:`Number of results to return`,required:!1,valueType:`number`,defaultValue:100,location:`body`}],examples:[{description:`Example`,command:`adside meta behaviors search --workspace-id <workspaceId>`}],output:{kind:`json`,description:`List all available targetable behaviors from Meta's targeting categories. Returns behavior IDs, names, descriptions, and audience sizes.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/behaviors/search`,auth:`user`,requestContentType:`application/json`}},{id:`meta.check_campaign_readiness`,path:[`meta`,`campaign-readiness`,`check`],summary:`Check if a campaign is ready for ad set creation. Identify the campaign by ID or by name. Returns a readiness report with issues, requirements, and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Campaign ID. Preferred when known. Provide this or campaign_name, not both.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_name`,flag:`--campaign-name`,description:`Exact campaign name to look up (not an ID). Use campaign_id when the ID is known. Provide this or campaign_id, not both.`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (required when using campaign_name, uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta campaign-readiness check --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Check if a campaign is ready for ad set creation. Identify the campaign by ID or by name. Returns a readiness report with issues, requirements, and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/campaign-readiness/check`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_campaign`,path:[`meta`,`campaigns`,`get`],summary:`Retrieve full details for a specific campaign by ID or name. Returns all campaign fields including status, objective, budget, and timing.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`campaign_id`,flag:`--campaign-id`,description:`Campaign ID. Preferred when known. Provide this or campaign_name, not both.`,required:!1,valueType:`string`,location:`body`},{name:`campaign_name`,flag:`--campaign-name`,description:`Exact campaign name to look up (not an ID). Use campaign_id when the ID is known. Provide this or campaign_id, not both.`,required:!1,valueType:`string`,location:`body`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (required when using campaign_name, uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta campaigns get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Retrieve full details for a specific campaign by ID or name. Returns all campaign fields including status, objective, budget, and timing.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/campaigns/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_meta_campaigns`,path:[`meta`,`campaigns`,`list`],summary:`Retrieve a paginated list of all campaigns for a Meta ad account. Filter by status (e.g., ACTIVE, PAUSED) and view key campaign details including budget, objective, and timing. Use this to audit or select campaigns for further actions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`status`,flag:`--status`,description:`Filter by campaign status`,required:!1,valueType:`string`,enum:[`ACTIVE`,`PAUSED`,`DELETED`,`ARCHIVED`],location:`body`},{name:`limit`,flag:`--limit`,description:`Number of campaigns to return`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta campaigns list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Retrieve a paginated list of all campaigns for a Meta ad account. Filter by status (e.g., ACTIVE, PAUSED) and view key campaign details including budget, objective, and timing. Use this to audit or select campaigns for further actions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/campaigns/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_creative_best_practices`,path:[`meta`,`creative-best-practices`,`get`],summary:`Get comprehensive best practices for creating high-performing ad creatives. Includes platform-specific guidelines, content recommendations, and optimization strategies.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`}],examples:[{description:`Example`,command:`adside meta creative-best-practices get --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Get comprehensive best practices for creating high-performing ad creatives. Includes platform-specific guidelines, content recommendations, and optimization strategies.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-best-practices/get`,auth:`user`}},{id:`meta.validate_creative_enhanced`,path:[`meta`,`creative-enhanced`,`validate`],summary:`Enhanced creative validation with comprehensive checks including page permissions, image accessibility, and Meta API compliance. Provides detailed feedback and fix suggestions.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`name`,flag:`--name`,description:`Creative name`,required:!0,valueType:`string`,location:`body`},{name:`page_id`,flag:`--page-id`,description:`Facebook Page ID (required for object_story_spec)`,required:!0,valueType:`string`,location:`body`},{name:`message`,flag:`--message`,description:`Primary ad text/message`,required:!0,valueType:`string`,location:`body`},{name:`headline`,flag:`--headline`,description:`Ad title/headline`,required:!1,valueType:`string`,location:`body`},{name:`picture`,flag:`--picture`,description:`External image URL - must be publicly accessible`,required:!1,valueType:`url`,location:`body`},{name:`image_hash`,flag:`--image-hash`,description:`Pre-uploaded image hash (alternative to picture URL)`,required:!1,valueType:`string`,location:`body`},{name:`video_id`,flag:`--video-id`,description:`Video ID for video creatives`,required:!1,valueType:`string`,location:`body`},{name:`call_to_action_type`,flag:`--call-to-action-type`,description:`Call to action button type (40+ supported types)`,required:!1,valueType:`string`,enum:`LEARN_MORE.SHOP_NOW.SIGN_UP.DOWNLOAD.BOOK_TRAVEL.LISTEN_MUSIC.WATCH_VIDEO.GET_QUOTE.CONTACT_US.APPLY_NOW.GET_DIRECTIONS.CALL_NOW.MESSAGE_PAGE.SUBSCRIBE.BOOK_NOW.ORDER_NOW.DONATE_NOW.SAY_THANKS.SELL_NOW.SHARE.OPEN_LINK.LIKE_PAGE.FOLLOW_PAGE.FOLLOW_USER.REQUEST_TIME.VISIT_PAGES_FEED.USE_APP.PLAY_GAME.INSTALL_APP.USE_MOBILE_APP.INSTALL_MOBILE_APP.OPEN_MOVIES.AUDIO_CALL.VIDEO_CALL.GET_OFFER.GET_OFFER_VIEW.BUY_NOW.ADD_TO_CART.SELL.GIFT_WRAP.MAKE_AN_OFFER.BUY_TICKETS.EXPLORE_MORE.GET_PROMOTIONS.GET_SHOWTIMES.LISTEN_NOW.SAVE.SEE_DETAILS.SEE_MENU.WATCH_MORE.WHATSAPP_MESSAGE`.split(`.`),location:`body`},{name:`link_url`,flag:`--link-url`,description:`Destination URL where users will be directed when clicking the ad`,required:!1,valueType:`url`,location:`body`},{name:`description`,flag:`--description`,description:`Additional description text`,required:!1,valueType:`string`,location:`body`},{name:`instagram_actor_id`,flag:`--instagram-actor-id`,description:`Optional. Instagram Business Account ID of the Page's Instagram account (typically starts with 1784) — the instagram_account_id get_account_pages reports for that Page. When omitted the tool resolves the identity itself: the Page's Instagram business account, else — for placement-customised and variation creatives only, which Meta refuses without one — its Page-backed Instagram account (created when the Page has none — a write on the client's Page the result calls out), else the Page actor override. A standard creative is left without one when the Page has no Instagram account. The result reports which one it used in instagram_identity`,required:!1,valueType:`string`,location:`body`},{name:`adlabels`,flag:`--adlabels`,description:`Ad labels for organization and tracking`,required:!1,valueType:`json`,location:`body`},{name:`enable_standard_enhancements`,flag:`--enable-standard-enhancements`,description:`Enable Standard Enhancements with individual feature control`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`enhancement_features`,flag:`--enhancement-features`,description:`Individual enhancement feature controls`,required:!1,valueType:`json`,location:`body`},{name:`attachment_style`,flag:`--attachment-style`,description:`Attachment style for link ads`,required:!1,valueType:`string`,defaultValue:`link`,enum:[`link`,`album`],location:`body`},{name:`caption`,flag:`--caption`,description:`Caption text (typically domain name)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta creative-enhanced validate --workspace-id <workspaceId> --name <name> --page-id <page_id> --message <message>`}],output:{kind:`json`,description:`Enhanced creative validation with comprehensive checks including page permissions, image accessibility, and Meta API compliance. Provides detailed feedback and fix suggestions.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-enhanced/validate`,auth:`user`,requestContentType:`application/json`}},{id:`meta.troubleshoot_creative_issues`,path:[`meta`,`creative-issues`,`troubleshoot`],summary:`Diagnose and fix common creative creation and performance issues. Provide an error message or describe your issue to get specific solutions and recommendations.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`issue_description`,flag:`--issue-description`,description:`Describe the creative issue you're experiencing or paste the error message`,required:!0,valueType:`string`,location:`body`},{name:`creative_type`,flag:`--creative-type`,description:`Type of creative experiencing issues`,required:!1,valueType:`string`,enum:[`image`,`video`,`carousel`,`collection`],location:`body`}],examples:[{description:`Example`,command:`adside meta creative-issues troubleshoot --workspace-id <workspaceId> --issue-description <issue_description>`}],output:{kind:`json`,description:`Diagnose and fix common creative creation and performance issues. Provide an error message or describe your issue to get specific solutions and recommendations.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-issues/troubleshoot`,auth:`user`,requestContentType:`application/json`}},{id:`meta.get_creative_performance`,path:[`meta`,`creative-performance`,`get`],summary:`Get guidance on analyzing creative performance metrics. Provides recommended approaches for tracking creative effectiveness and optimization strategies.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`creative_id`,flag:`--creative-id`,description:`Creative ID to preview`,required:!0,valueType:`string`,location:`body`},{name:`ad_format`,flag:`--ad-format`,description:`Ad format for preview`,required:!0,valueType:`string`,enum:[`DESKTOP_FEED_STANDARD`,`MOBILE_FEED_STANDARD`,`MOBILE_FEED_BASIC`,`MOBILE_BANNER`,`MOBILE_MEDIUM_RECTANGLE`,`MOBILE_FULLWIDTH`,`MOBILE_INTERSTITIAL`,`INSTAGRAM_STANDARD`,`INSTAGRAM_STORY`],location:`body`},{name:`product_item_ids`,flag:`--product-item-ids`,description:`Product item IDs for dynamic ads`,required:!1,valueType:`json`,location:`body`}],examples:[{description:`Example`,command:`adside meta creative-performance get --workspace-id <workspaceId> --creative-id <creative_id> --ad-format DESKTOP_FEED_STANDARD`}],output:{kind:`json`,description:`Get guidance on analyzing creative performance metrics. Provides recommended approaches for tracking creative effectiveness and optimization strategies.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-performance/get`,auth:`user`,requestContentType:`application/json`}},{id:`meta.validate_creative_setup`,path:[`meta`,`creative-setup`,`validate`],summary:`Validate ad creative parameters before creation to catch errors early. Checks required fields, URL validity, and provides object_story_spec preview. Use this before create_ad_creative to avoid API errors.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`name`,flag:`--name`,description:`Creative name`,required:!0,valueType:`string`,location:`body`},{name:`page_id`,flag:`--page-id`,description:`Facebook Page ID (required for object_story_spec)`,required:!0,valueType:`string`,location:`body`},{name:`message`,flag:`--message`,description:"Primary ad text/message (single-variant). Mutually exclusive with `bodies`.",required:!1,valueType:`string`,location:`body`},{name:`headline`,flag:`--headline`,description:"Ad title/headline (single-variant). Mutually exclusive with `titles`.",required:!1,valueType:`string`,location:`body`},{name:`bodies`,flag:`--bodies`,description:`Multi-variant primary texts (1–5). When set, the creative is built with asset_feed_spec and must be attached to a Dynamic Creative ad set.`,required:!1,valueType:`json`,location:`body`},{name:`titles`,flag:`--titles`,description:"Multi-variant headlines (1–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`descriptions`,flag:`--descriptions`,description:"Multi-variant descriptions (0–5). Pair with `bodies`.",required:!1,valueType:`json`,location:`body`},{name:`picture`,flag:`--picture`,description:`External image URL - must be publicly accessible`,required:!1,valueType:`url`,location:`body`},{name:`image_hash`,flag:`--image-hash`,description:`Pre-uploaded image hash (alternative to picture URL)`,required:!1,valueType:`string`,location:`body`},{name:`video_id`,flag:`--video-id`,description:`Video ID for video creatives`,required:!1,valueType:`string`,location:`body`},{name:`placement_assets`,flag:`--placement-assets`,description:"Placement asset customization (multi-ratio ad): one image or video per placement bucket, each `placement_group` at most once. Requires `image_hash` as the fallback image for placements not listed. Upload every ratio first (upload_image_from_url / upload_video_from_url) and pass the hashes. Mutually exclusive with `bodies`/`titles` — the resulting creative must be attached to a STANDARD ad set (Meta rejects it in a Dynamic Creative ad set).",required:!1,valueType:`json`,location:`body`},{name:`call_to_action_type`,flag:`--call-to-action-type`,description:`Call to action button type (40+ supported types)`,required:!1,valueType:`string`,enum:`LEARN_MORE.SHOP_NOW.SIGN_UP.DOWNLOAD.BOOK_TRAVEL.LISTEN_MUSIC.WATCH_VIDEO.GET_QUOTE.CONTACT_US.APPLY_NOW.GET_DIRECTIONS.CALL_NOW.MESSAGE_PAGE.SUBSCRIBE.BOOK_NOW.ORDER_NOW.DONATE_NOW.SAY_THANKS.SELL_NOW.SHARE.OPEN_LINK.LIKE_PAGE.FOLLOW_PAGE.FOLLOW_USER.REQUEST_TIME.VISIT_PAGES_FEED.USE_APP.PLAY_GAME.INSTALL_APP.USE_MOBILE_APP.INSTALL_MOBILE_APP.OPEN_MOVIES.AUDIO_CALL.VIDEO_CALL.GET_OFFER.GET_OFFER_VIEW.BUY_NOW.ADD_TO_CART.SELL.GIFT_WRAP.MAKE_AN_OFFER.BUY_TICKETS.EXPLORE_MORE.GET_PROMOTIONS.GET_SHOWTIMES.LISTEN_NOW.SAVE.SEE_DETAILS.SEE_MENU.WATCH_MORE.WHATSAPP_MESSAGE`.split(`.`),location:`body`},{name:`link_url`,flag:`--link-url`,description:`Destination URL where users will be directed when clicking the ad`,required:!0,valueType:`url`,location:`body`},{name:`description`,flag:`--description`,description:`Additional description text`,required:!1,valueType:`string`,location:`body`},{name:`instagram_actor_id`,flag:`--instagram-actor-id`,description:`Optional. Instagram Business Account ID of the Page's Instagram account (typically starts with 1784) — the instagram_account_id get_account_pages reports for that Page. When omitted the tool resolves the identity itself: the Page's Instagram business account, else — for placement-customised and variation creatives only, which Meta refuses without one — its Page-backed Instagram account (created when the Page has none — a write on the client's Page the result calls out), else the Page actor override. A standard creative is left without one when the Page has no Instagram account. The result reports which one it used in instagram_identity`,required:!1,valueType:`string`,location:`body`},{name:`adlabels`,flag:`--adlabels`,description:`Ad labels for organization and tracking`,required:!1,valueType:`json`,location:`body`},{name:`enable_standard_enhancements`,flag:`--enable-standard-enhancements`,description:`Enable Standard Enhancements with individual feature control`,required:!1,valueType:`boolean`,defaultValue:!1,location:`body`},{name:`enhancement_features`,flag:`--enhancement-features`,description:`Individual enhancement feature controls`,required:!1,valueType:`json`,location:`body`},{name:`attachment_style`,flag:`--attachment-style`,description:`Attachment style for link ads`,required:!1,valueType:`string`,defaultValue:`link`,enum:[`link`,`album`],location:`body`},{name:`caption`,flag:`--caption`,description:`Caption text (typically domain name)`,required:!1,valueType:`string`,location:`body`},{name:`url_tags`,flag:`--url-tags`,description:`URL tags appended to the link URL for tracking (e.g. utm_source=...&utm_medium=...)`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta creative-setup validate --workspace-id <workspaceId> --name <name> --page-id <page_id> --link-url https://example.com`}],output:{kind:`json`,description:`Validate ad creative parameters before creation to catch errors early. Checks required fields, URL validity, and provides object_story_spec preview. Use this before create_ad_creative to avoid API errors.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creative-setup/validate`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_meta_creatives`,path:[`meta`,`creatives`,`list`],summary:`Browse an ad account's creatives, one page at a time. Each row is a SUMMARY — id, name, headline, primary text, call to action, destination, whether it is an image or a video, and how many variants a dynamic creative rotates. For the full row — the complete object_story_spec, asset_feed_spec and the Advantage+ enhancement settings, plus the image URL — call get_ad_creative on the id you want; use preview_ad to see the ad rendered. Ask for the smallest page that answers the question and follow next_cursor for the rest: a full page is a large answer whatever we strip from it, because the ad copy itself is the bulk of it.`,description:``,source:`rest`,options:[{name:`workspaceId`,flag:`--workspace-id`,description:``,required:!0,valueType:`string`,location:`path`},{name:`account_id`,flag:`--account-id`,description:`Meta Ad Account ID (uses configured account if not provided)`,required:!1,valueType:`string`,location:`body`},{name:`limit`,flag:`--limit`,description:`How many creatives to return, 1-50 (default 25). Follow next_cursor for more rather than asking for a bigger page.`,required:!1,valueType:`number`,defaultValue:25,location:`body`},{name:`after`,flag:`--after`,description:`Pagination cursor for next page`,required:!1,valueType:`string`,location:`body`}],examples:[{description:`Example`,command:`adside meta creatives list --workspace-id <workspaceId>`}],output:{kind:`json`,description:`Browse an ad account's creatives, one page at a time. Each row is a SUMMARY — id, name, headline, primary text, call to action, destination, whether it is an image or a video, and how many variants a dynamic creative rotates. For the full row — the complete object_story_spec, asset_feed_spec and the Advantage+ enhancement settings, plus the image URL — call get_ad_creative on the id you want; use preview_ad to see the ad rendered. Ask for the smallest page that answers the question and follow next_cursor for the rest: a full page is a large answer whatever we strip from it, because the ad copy itself is the bulk of it.`},transport:{type:`rest`,method:`POST`,path:`/v1/workspaces/{workspaceId}/meta/creatives/list`,auth:`user`,requestContentType:`application/json`}},{id:`meta.list_custom_conversions`,path:[`meta`,`custom-conversions`,`list`],summary:`List the account's custom conversions — the named conversions built on a dataset's traffic, as opposed to Meta's standard pixel events or named custom pixel events. To verify raw event activity on a dataset, use get_pixel_stats; an empty custom-conversion list does not mean the pixel has no events.
|
|
14
14
|
|
|
15
15
|
Use this to find the ID to optimise an ad set towards: pass it as \`promoted_object.custom_conversion_id\` on create_ad_set_enhanced or update_ad_set. Many accounts never adopted Meta's standard event taxonomy and put all their real volume here, so a standard event that looks right can have fired zero times.
|
|
16
16
|
|