Referencia completa del CLI
Esta es la referencia completa del CLI de Ads Uploader. Para una introducción y una guía para empezar, consulta Configuración por CLI.
Comandos
Autenticación
| Comando | Qué hace |
|---|---|
ads login | Autentica mediante el navegador (abre tu navegador predeterminado) |
ads logout | Borra las credenciales almacenadas |
ads whoami | Muestra el usuario actualmente conectado |
ads config | Muestra la configuración (cuenta, URL de la API, ruta de credenciales) |
Navegación
| Comando | Qué hace |
|---|---|
ads accounts | Lista todas las cuentas publicitarias conectadas a tu cuenta de Meta |
ads account <id> | Establece una cuenta publicitaria predeterminada para comandos futuros |
ads pages | Lista las páginas de Facebook con las que puedes anunciarte, incluida cualquier cuenta de Instagram vinculada, para usar con las sustituciones de perfil |
ads targeting:search "Austin" --type city | Encuentra claves de ciudad para la segmentación del conjunto de anuncios |
ads targeting:search "90210" --type zip | Encuentra claves de código postal para la segmentación del conjunto de anuncios |
ads targeting:search "advertising" --type detailed | Encuentra IDs y tipos de segmentación detallada |
ads campaigns | Lista las campañas activas |
ads campaigns --status all | Incluye las campañas pausadas y archivadas |
ads campaigns --search "text" | Filtra las campañas por nombre |
ads campaign <id> | Muestra los conjuntos de anuncios dentro de una campaña |
ads adsets --campaign <id> | Lista los conjuntos de anuncios de una campaña (admite --search, --status) |
ads adset <id> | Muestra los anuncios dentro de un conjunto de anuncios |
ads ad <id> | Muestra los detalles completos del anuncio, incluida la configuración del creativo |
ads presets | Lista tus preajustes de API guardados |
ads presets <id> | Muestra los detalles de un preajuste específico |
ads presets:save --from-ad <adId> --name "Preset Name" | Guarda un anuncio existente como preajuste de API |
ads text-presets | Lista tus preajustes de texto guardados |
ads text-presets <id> | Muestra los detalles de un preajuste de texto específico |
ads uploads | Lista las subidas recientes |
ads uploads <batchId> | Muestra los detalles de la subida (archivos, variantes, hashes) |
Subida de medios
| Comando | Qué hace |
|---|---|
ads upload <inputs...> | Sube rutas locales y URL HTTPS públicas a tu cuenta publicitaria |
ads upload ./directory/ | Sube un directorio completo |
ads upload:drive <folderUrl> | Importa una carpeta pública de Google Drive como trabajo en segundo plano |
Los argumentos HTTPS, incluidos los enlaces públicos a archivos de Google Drive, se detectan automáticamente. Puedes combinar rutas locales y URL: primero se suben los archivos locales y luego el servidor importa las URL al mismo lote, para que la agrupación funcione con todas las entradas. Las carpetas públicas de Drive deben compartirse como Anyone with the link (Viewer).
Los archivos locales se preparan en paralelo, y los fallos de red transitorios se reintentan automáticamente con backoff. Las importaciones de URL y carpetas de Drive usan pipelines de archivos paralelos con concurrencia limitada en un trabajo en segundo plano, mientras el CLI muestra un contador de completados/total y cada archivo activo. Rara vez necesitas tocar estos flags, pero están disponibles:
| Flag de subida | Descripción |
|---|---|
--concurrency <n> | Número de archivos preparados en paralelo, 1-6 (predeterminado: 4). Los vídeos grandes se limitan automáticamente para no exceder la memoria. |
--upload-timeout <ms> | Tiempo de espera de subida por archivo (predeterminado: 120000) |
--api-timeout <ms> | Tiempo de espera de la solicitud de API en milisegundos (predeterminado: 60000) |
Creación de anuncios
| Comando | Qué hace |
|---|---|
ads create spec.json | Crea anuncios a partir de un archivo de especificación |
ads create:preview spec.json | Ejecución de prueba que muestra qué se crearía |
ads create:interactive | Asistente guiado (acepta todos los flags de creación) |
Gestión de trabajos
| Comando | Qué hace |
|---|---|
ads jobs <jobId> | Comprueba el estado de un trabajo |
ads jobs <jobId> --follow | Transmite actualizaciones de progreso en vivo |
ads jobs cancel <jobId> | Cancela un trabajo en ejecución |
Flags de creación
Estos flags se aplican a ads create, ads create:preview y ads create:interactive. Se pueden usar en lugar de un archivo de especificación o junto con él.
| Flag | Descripción |
|---|---|
--account <id> | Sustituye la cuenta publicitaria predeterminada |
--preset <id> | Usa un preajuste de API guardado (alternativa al archivo de especificación) |
--text-preset <id> | Carga un preajuste de texto guardado |
--copy-from <adId> | Copia la configuración de un anuncio existente |
--upload <batchId> | Especifica el ID de la subida |
--status <PAUSED|ACTIVE> | Establece el estado del anuncio (predeterminado: ACTIVE) |
--pause-at <level> | Nivel de pausa: ad (predeterminado), adSet o campaign |
--daily-budget <amount> | Sustituye el presupuesto diario por conjunto de anuncios (unidades de moneda, p. ej. 50 para 50 $) |
--bid-amount <amount> | Sustituye la puja/límite de coste por conjunto de anuncios (unidades de moneda) |
--minimum-roas <ratio> | Sustituye el objetivo mínimo de ROAS por conjunto de anuncios (p. ej. 1.5) |
--campaign-daily-budget <amount> | Establece un presupuesto diario de campaña CBO en unidades monetarias enteras. Es incompatible con el presupuesto total; omite ambos para heredar el presupuesto de la campaña de origen. |
--campaign-lifetime-budget <amount> | Establece un presupuesto total de campaña CBO en unidades monetarias enteras. Es incompatible con el presupuesto diario; omite ambos para heredar el presupuesto de la campaña de origen. |
--adset-min-spend <amount> | Establece el gasto mínimo del conjunto de anuncios con CBO en unidades monetarias enteras; 0 elimina el límite heredado del conjunto de anuncios de origen. |
--adset-max-spend <amount> | Establece el gasto máximo del conjunto de anuncios con CBO en unidades monetarias enteras; 0 elimina el límite heredado del conjunto de anuncios de origen. |
--adset-min-spend-pct <5-100> | Establece el gasto mínimo del conjunto de anuncios como porcentaje del presupuesto de campaña, en pasos de 5 %. También funciona con una campaña CBO existente; es incompatible con --adset-min-spend. |
--adset-max-spend-pct <5-100> | Establece el gasto máximo del conjunto de anuncios como porcentaje del presupuesto de campaña, en pasos de 5 %. También funciona con una campaña CBO existente; es incompatible con --adset-max-spend. |
--location <ISO> | Segmenta un país por su código ISO de dos letras. Repite el flag para varios países. |
--age-min <n> | Edad mínima, de 13 a 65 |
--age-max <n> | Edad máxima, de 13 a 65 (65 significa 65+) |
--gender <gender> | all, men o women. all elimina una restricción de género heredada del conjunto de anuncios de origen. |
--ai-disclosure | Declara por tu cuenta el contenido creativo generado con IA (transparencia de contenido de IA de Meta). Desactivado por defecto. |
--page <id> | Usa esta página de Facebook en lugar de la de la plantilla (consulta Opciones de perfil) |
--instagram <id> | Usa esta cuenta de Instagram en lugar de la de la plantilla |
--use-page-identity | Usa la página de Facebook como identidad de Instagram; no se puede combinar con --instagram |
--threads <id> | Usa este perfil de Threads en lugar del de la plantilla |
--text-file <path> | Carga la configuración de texto desde un archivo JSON |
--expanded | Muestra los valores completos de título, texto principal y descripción en las vistas previas |
Flags de navegación
Estos flags están disponibles en campaigns, adsets, adset y campaign:
| Flag | Descripción |
|---|---|
--status <status> | active (predeterminado) o all |
--inactive | Abreviatura de --status all (en campaigns) |
--search <text> | Filtra por nombre (en campaigns, adsets) |
Búsqueda de segmentación
La segmentación por ciudad, código postal y segmentación detallada usan identificadores de Meta en lugar de nombres. Busca a través de Ads Uploader para obtener valores que puedas pegar en una especificación:
ads targeting:search "Austin" --type city
ads targeting:search "90210" --type zip
ads targeting:search "advertising" --type detailed
| Flag | Descripción |
|---|---|
--type <type> | Obligatorio. city devuelve valores de targeting.cities[].key; zip devuelve valores de targeting.zips[].key; detailed devuelve entradas para targeting.detailedTargetingGroups. |
--account <id> | Sustituye la cuenta publicitaria predeterminada configurada |
--limit <n> | Devuelve de 1 a 25 coincidencias |
--json | Devuelve resultados estructurados listos para pegar |
Los resultados de segmentación detallada incluyen id, name, type, un rango de tamaño de público y la ruta de la categoría. El type identifica la categoría de segmentación detallada, como interests, behaviors, work_employers o work_positions. Busca siempre estos identificadores; nunca los adivines.
Flags de detalle
Estos flags están disponibles en ad:
| Flag | Descripción |
|---|---|
--expanded | Muestra los valores completos de título, texto principal y descripción |
Flags comunes
| Flag | Descripción |
|---|---|
--account <id> | Sustituye la cuenta publicitaria predeterminada para cualquier comando |
--json | Devuelve JSON sin procesar (disponible en la mayoría de los comandos, pensado para scripting) |
Formato del archivo de especificación
El archivo de especificación JSON controla cada aspecto de la creación de anuncios. Proporciona una fuente de plantilla (adPresetId o copyFromAd) más uploadId o mediaItems capturados con un mediaHash de Facebook para cada imagen y un mediaId para cada vídeo. Los vídeos estándar, de carrusel, flexibles y de ubicación también necesitan thumbnailHash; los vídeos Multi Media usan su URL de miniatura pública capturada.
Especificación mínima
{
"adPresetId": "your_preset_id",
"uploadId": "batch_abc123"
}
Ejemplo completo
{
"adPresetId": "preset_id_here",
"uploadId": "batch_abc123",
"adSet": {
"name": "My New Ad Set",
"dailyBudget": 50
},
"adNamePattern": "{filename}",
"texts": {
"perAd": {
"hero.jpg": {
"headlines": ["Main Headline"],
"bodies": ["Ad copy here."],
"descriptions": ["Short description"],
"cta": "SHOP_NOW",
"link": "https://example.com/landing"
}
}
},
"creativeEnhancements": "none",
"options": {
"status": "PAUSED",
"pauseAt": "adSet"
}
}
Fuente de plantilla
Necesitas una de estas para indicarle al CLI qué configuración de anuncio usar como base.
| Campo | Descripción |
|---|---|
adPresetId | El ID de un preajuste de API guardado. Fija la campaña, el conjunto de anuncios y la configuración del anuncio. |
copyFromAd | Un ID de anuncio de Facebook del que copiar la configuración. |
Cuando uses copyFromAd, proporciona la subida, o lanza un build web guardado cuyas imágenes capturadas tengan mediaHash y cuyos vídeos tengan mediaId. Opcionalmente puedes establecer la campaña y el conjunto de anuncios:
{
"copyFromAd": "120233848667930472",
"uploadId": "batch_abc123",
"campaign": { "id": "120233848666410472" },
"adSet": { "id": "120233848666620472" }
}
Para encontrar el ID de anuncio correcto, navega por tu cuenta: ads campaigns luego ads campaign <id> luego ads adset <id> luego ads ad <id>.
Opciones de perfil
De forma predeterminada, los nuevos anuncios heredan la página de Facebook, la cuenta de Instagram y el perfil de Threads del anuncio de plantilla o del preajuste. Es el mismo control de Opciones de perfil disponible mediante el panel de Valores predeterminados en la aplicación web. Sustituye cualquiera de ellos con un bloque profile (o con los flags --page / --instagram / --use-page-identity / --threads, que tienen prioridad sobre el archivo de especificación):
{
"copyFromAd": "120233848667930472",
"uploadId": "batch_abc123",
"profile": {
"pageId": "123456789012345",
"instagramId": "17841400000000000",
"threadsId": "987654321098765"
}
}
Ejecuta ads pages para listar los IDs de página que puedes usar, junto con la cuenta de Instagram vinculada de cada página.
Si sustituyes solo la página, Ads Uploader usa automáticamente su cuenta de Instagram vinculada. Si no hay ninguna cuenta de Instagram vinculada, usa la página de Facebook como identidad de Instagram. Threads siempre se restablece porque puede pertenecer a la página antigua; establécelo explícitamente cuando lo necesites.
Para elegir explícitamente el actor de página, usa --use-page-identity o establece "useFacebookPage": true dentro de profile. No lo combines con --instagram ni con instagramId. También puedes cambiar solo el perfil de Instagram o Threads sin tocar la página, estableciendo solo esos campos.
Para lanzamientos multicampaña, asigna identidades de forma independiente con profile.campaigns. Indexa cada sustitución por el id de la campaña correspondiente (recomendado) o por un nombre de campaña inequívoco:
{
"campaign": {
"mode": "duplicate",
"campaigns": [
{ "id": "prospecting", "name": "Prospecting" },
{ "id": "retargeting", "name": "Retargeting" }
]
},
"profile": {
"campaigns": {
"prospecting": { "pageId": "page_1", "instagramId": "ig_1", "threadsId": null },
"retargeting": { "pageId": "page_2", "useFacebookPage": true, "threadsId": "threads_2" }
}
}
}
Cada clave de profile.campaigns debe coincidir con una campaña de campaign.campaigns; las claves que no coincidan o sean ambiguas se rechazan antes del lanzamiento.
Estructura de la campaña
De forma predeterminada, los anuncios van a la campaña del anuncio de plantilla. Puedes crear una nueva campaña proporcionando campaign.name.
Para los modos multicampaña, usa campaign.mode con un array campaigns:
{
"campaign": {
"mode": "duplicate",
"campaigns": [
{ "name": "Campaign A" },
{ "name": "Campaign B" }
]
}
}
| Modo | Comportamiento |
|---|---|
"single" | Predeterminado. Una sola campaña. |
"duplicate" | Todos los medios se duplican en cada campaña. |
"split" | Los medios se reparten equitativamente entre las campañas. |
Modos de conjunto de anuncios
De forma predeterminada, los anuncios van al conjunto de anuncios existente del anuncio de plantilla. Los siguientes modos te dan control sobre cómo se distribuyen los anuncios entre los conjuntos de anuncios.
Crear un nuevo conjunto de anuncios:
{ "adSet": { "name": "My Ad Set" } }
Usar un conjunto de anuncios existente por ID:
{ "adSet": { "id": "120233848666620472" } }
Un conjunto de anuncios por cada archivo subido:
{ "adSet": { "mode": "perUpload" } }
Agrupación automática en conjuntos de anuncios de tamaño fijo:
{ "adSet": { "mode": "autoGroup", "adsPerAdSet": 5 } }
Grupos personalizados con control total sobre qué archivos van a dónde:
{
"adSet": {
"groups": [
{ "name": "Images - April 10", "media": ["hero.jpg", "banner.jpg"] },
{ "name": "Videos - April 10", "media": ["promo.mp4"] }
]
}
}
Patrón de nombres de conjunto de anuncios para los modos de varios conjuntos de anuncios:
{ "adSet": { "mode": "perUpload", "namePattern": "Ad Set {index:01}" } }
La agrupación por variantes agrupa los anuncios por identificador de variación en el mismo conjunto de anuncios:
{ "adSet": { "mode": "autoGroup", "groupVariations": true, "variationIdentifier": "-" } }
Sustitución de presupuesto y puja
Sustituye el presupuesto diario o el importe de la puja en los nuevos conjuntos de anuncios. Los valores están en las unidades de moneda de tu cuenta (p. ej. 50 para 50 $ o 50 euros).
dailyBudget y bidAmount usan las unidades de moneda de la cuenta. minimumRoas es una relación, así que 1.5 significa un objetivo de ROAS de 1.5x.
- Campañas ABO (el presupuesto está en el conjunto de anuncios): combina
dailyBudgetconbidAmountpara estrategias de puja/límite de coste, o conminimumRoasparaLOWEST_COST_WITH_MIN_ROAS. - Campañas CBO (el presupuesto está en la campaña): no establezcas
dailyBudgeten el conjunto de anuncios. Usacampaign.dailyBudgetocampaign.lifetimeBudget(son incompatibles entre sí) para sustituir el presupuesto de la campaña de origen, u omite ambos para heredarlo. Los límites de gasto mínimo y máximo del conjunto de anuncios pueden ser importes enteros o porcentajes del 5-100 % del presupuesto de campaña (en pasos de 5 %); los porcentajes también funcionan con una campaña CBO existente. EstablecebidAmountominimumRoasen el conjunto de anuncios cuando su estrategia de origen use ese control.
bidAmount y minimumRoas son mutuamente excluyentes porque pertenecen a estrategias de puja distintas.
{ "adSet": { "dailyBudget": 50 } }
{ "adSet": { "bidAmount": 5 } }
{ "adSet": { "minimumRoas": 1.5 } }
{ "adSet": { "dailyBudget": 50, "bidAmount": 5 } }
También disponibles como flags del CLI: --daily-budget 50, --bid-amount 5, --minimum-roas 1.5, --campaign-daily-budget 100, --campaign-lifetime-budget 1000, --adset-min-spend 20, --adset-max-spend 80, --adset-min-spend-pct 20 y --adset-max-spend-pct 80.
Ad Set Targeting
La segmentación se aplica a los nuevos conjuntos de anuncios. Omite el bloque targeting de nivel superior para heredar el público del conjunto de anuncios de origen sin cambios. Cualquier modo puede usar adSet.targetingPerAdSet, indexado igual que texts.perAdset por el nombre final del conjunto de anuncios, su ID, o un campaign::key a prueba de colisiones. El modo personalizado también admite adSet.groups[].targeting. El orden de prioridad es targetingPerAdSet, luego groups[].targeting, luego el valor por defecto del build, luego el público de origen. La segmentación por conjunto de anuncios solo está disponible en la especificación, porque los flags del CLI no pueden referirse a un conjunto de anuncios planificado en concreto.
Con varias campañas, la copia de cada conjunto de anuncios en cada campaña se segmenta por separado; usa "Campaign name::Ad set name" como clave para referirte a una copia concreta.
{
"targeting": {
"countries": ["US"],
"cities": [
{
"key": "2525495",
"name": "Austin",
"region": "Texas",
"countryCode": "US",
"radius": 25,
"distance_unit": "mile"
}
],
"zips": [
{
"key": "US:90210",
"name": "90210",
"region": "California",
"countryCode": "US"
}
],
"selectionVersion": 4,
"ageSelected": true,
"ageMin": 21,
"ageMax": 55,
"genderSelected": true,
"genders": "women",
"detailedTargetingSelected": true,
"detailedTargetingGroups": [[
{
"id": "112002898811624",
"name": "Advertising agency",
"type": "work_employers"
}
]]
}
}
{
"targeting": { "countries": ["US"], "ageMin": 21, "ageMax": 55 },
"adSet": {
"mode": "perUpload",
"namePattern": "Ad Set {index:01}",
"targetingPerAdSet": {
"Ad Set 02": { "countries": ["CA"], "genders": "women" },
"Ad Set 01": { "countries": ["GB"] }
}
}
}
Para el modo personalizado, groups[].targeting sigue siendo válido y mantiene la sobrescritura junto a su grupo de medios:
{
"adSet": {
"mode": "custom",
"groups": [{
"name": "Canada Women",
"media": ["canada.jpg"],
"targeting": { "countries": ["CA"], "genders": "women" }
}]
}
}
Usa ads targeting:search para encontrar la key de la ciudad (tipo city), la key del código postal como US:90210 (tipo zip), y el id, name y type de cada selección detallada (tipo detailed). Omite los países, las ciudades y los códigos postales para heredar las ubicaciones de origen. Los países, las ciudades y los códigos postales se combinan como alternativas, así que añadir Austin o un código postal a countries: ["US"] sigue segmentando todo Estados Unidos; omite los países para segmentar solo la ciudad o el código postal. Los códigos postales no tienen radio.
Configuración de texto
El texto común aplica la misma copia a todos los anuncios:
{
"texts": {
"common": {
"headlines": ["Headline 1", "Headline 2"],
"bodies": ["Primary text"],
"descriptions": ["Description"]
},
"strategy": "flexible"
}
}
El texto por anuncio te permite establecer una copia única para cada archivo:
{
"texts": {
"perAd": {
"hero.jpg": {
"headlines": ["Hero Headline"],
"bodies": ["Hero copy"],
"descriptions": ["Hero desc"],
"cta": "LEARN_MORE",
"link": "https://example.com/hero",
"urlTags": "utm_content=hero"
},
"banner.jpg": {
"headlines": ["Banner Headline"],
"bodies": ["Banner copy"]
}
}
}
}
Las claves por anuncio son nombres de archivo (no rutas completas). Cada entrada admite: headlines, bodies, descriptions, cta, link, displayUrl, urlTags. Los campos que no especifiques se heredan del anuncio de plantilla.
El texto por conjunto de anuncios aplica un bloque de texto a todos los anuncios de un conjunto de anuncios de destino. Usa un nombre o ID de conjunto de anuncios simple cuando sea único, o una entrada campaign::key cuando el mismo nombre de conjunto de anuncios aparezca en más de una campaña:
{
"texts": {
"perAdset": {
"Prospecting::prospecting_set": {
"headlines": ["Prospecting headline"],
"bodies": ["Prospecting copy"],
"descriptions": ["Prospecting description"],
"cta": "SHOP_NOW",
"link": "https://example.com/prospecting",
"displayUrl": "example.com/prospecting",
"urlTags": "utm_campaign=prospecting",
"aiDisclosure": false
}
}
}
}
Cada clave de texts.perAdset debe coincidir con un conjunto de anuncios planificado. Las claves que no coincidan se rechazan en lugar de recurrir al texto común.
Los preajustes de texto te permiten cargar una configuración de texto guardada:
{ "textPresetId": "preset_id_here" }
No puedes combinar textPresetId con texts.
Las opciones de estrategia controlan cómo se gestionan varias variaciones de texto:
"flexible"(predeterminado) deja que Meta optimice entre tus variaciones de texto. Varios títulos y textos se convierten en opciones que Facebook combina libremente."separate"crea un anuncio separado para cada combinación de texto.
CTA y enlaces
Una CTA de nivel superior se aplica a todos los anuncios. Las CTA por anuncio en texts.perAd y las CTA por conjunto de anuncios en texts.perAdset la sustituyen.
{
"cta": {
"type": "SHOP_NOW",
"link": "https://example.com",
"displayUrl": "example.com"
},
"urlTags": "utm_source=facebook&utm_medium=paid"
}
Tipos de CTA estándar: LEARN_MORE, SHOP_NOW, SIGN_UP, SUBSCRIBE, GET_OFFER, CONTACT_US, DOWNLOAD, ORDER_NOW, BUY_NOW, BOOK_NOW, APPLY_NOW, GET_QUOTE, GET_IN_TOUCH, WATCH_MORE, PLAY_GAME, GET_IN_TOUCH, WATCH_MORE
Las CTA específicas del objetivo se heredan del anuncio de plantilla y no deben establecerse manualmente. Establecerlas en el tipo de campaña incorrecto causará un error de la API de Facebook.
| CTA | Objetivo de campaña requerido |
|---|---|
MESSAGE_PAGE | Destino Messenger |
WHATSAPP_MESSAGE | Destino WhatsApp |
INSTAGRAM_MESSAGE | Destino DM de Instagram |
CALL_NOW | Campaña de llamada |
Prueba dividida de URL (destino dividido)
Proporciona de 2 a 5 URLs de destino bajo texts.urlVariants y cada conjunto de anuncios generado se duplica una vez por URL para que Meta optimice cada combinación de anuncio y página de destino de forma independiente.
{
"texts": {
"common": { "headlines": ["Hero"], "bodies": ["Copy"] },
"urlVariants": [
{ "link": "https://example.com/homepage", "label": "homepage" },
{ "link": "https://example.com/quiz", "label": "quiz-v2" }
]
}
}
labeles opcional. Cuando se omite, se usa el último slug de la ruta de la URL (/quiz-v2→quiz-v2), con retroceso al nombre de host para las URLs raíz.- En el modo de conjunto de anuncios único, la etiqueta de cada variante se convierte en el nombre completo del conjunto de anuncios.
- En los modos
perUploadyautoGroup, el nombre de cada conjunto de anuncios duplicado añade_{label}al patrón (o sustituye un token{destination}si incluyes uno). - El token
{date}en una etiqueta se resuelve a la fecha de hoy (p. ej.launch-{date}→launch-2026-04-27). - Cada URL de destino debe ser única. Las URLs idénticas (o variantes con barra final o con distinta mayúscula/minúscula de la misma URL) se fusionan en una sola entrada, así que asegúrate de tener al menos 2 destinos distintos.
- El presupuesto de tu conjunto de anuncios se multiplica por el número de variantes, ya que cada duplicado es su propio conjunto de anuncios.
- No compatible con anuncios de origen con destino especial (formulario de clientes potenciales, Messenger, WhatsApp, DM de Instagram, llamada). El CLI rechaza esta combinación con un error claro, esos formatos no se enrutan a través de
cta.link. - Las sustituciones de
linkpor anuncio entexts.perAdpierden frente a la URL de la variante cuando ambas están establecidas.
Mejoras creativas
Controla las mejoras creativas de Advantage+:
{ "creativeEnhancements": "none" }
| Valor | Efecto |
|---|---|
| omitido | Todas las funciones desactivadas |
"metaDefaults" | Alias obsoleto de "none" |
"all" | Todas las funciones activadas |
"none" | Todas las funciones desactivadas |
["feature1", "feature2"] | Solo las funciones listadas activadas, el resto desactivado |
Funciones disponibles: text_translation, inline_comment, enhance_cta, text_optimizations, reveal_details_over_time, show_destination_blurbs, image_brightness_and_contrast, image_touchups, video_auto_crop, video_filtering, pac_relaxation, image_animation, image_templates, adapt_to_placement, product_extensions, product_tags, description_automation, add_text_overlay, music, carousel_to_video, carousel_dynamic_description, multi_share_end_card, multi_share_optimized
La clave show_destination_blurbs se muestra como Show spotlights, y pac_relaxation como Flex media.
Cuando selecciones funciones concretas, lista solo las que sean relevantes para el tipo de medio. Las funciones de vídeo (video_auto_crop, video_filtering) solo se aplican a los anuncios de vídeo. Las funciones de carrusel (carousel_to_video, carousel_dynamic_description, multi_share_end_card, multi_share_optimized) solo se aplican a los anuncios de carrusel.
product_tags se aplica a anuncios de imagen y de vídeo, y solo al clonar. Solo puede activarse cuando el anuncio de origen tiene un catálogo asociado y etiquetas de producto explícitas con posición; se conservan todas las etiquetas de origen y sus posiciones. "all" la incluye solo para una fuente elegible y nunca inventa una etiqueta de producto.
Anuncios de carrusel
Agrupa los archivos subidos en anuncios de carrusel con texto por tarjeta y texto general opcional del carrusel. cardTexts controla las tarjetas individuales. El texto general del carrusel puede colocarse en el objeto del carrusel o establecerse en texts.perAd usando el name del carrusel; los campos colocados ganan cuando ambos están presentes.
{
"carousel": [
{
"name": "My Carousel",
"cards": ["slide1.jpg", "slide2.jpg", "slide3.jpg"],
"headlines": ["Overall Carousel Headline"],
"bodies": ["Overall primary text"],
"descriptions": ["Overall description"],
"cta": "SHOP_NOW",
"link": "https://example.com/carousel",
"urlTags": "utm_content=my_carousel",
"cardTexts": [
{ "headline": "Slide 1", "description": "First card", "link": "https://example.com/1" },
{ "headline": "Slide 2", "description": "Second card", "link": "https://example.com/2" }
]
}
]
}
Forma alternativa para el texto general:
{
"texts": {
"perAd": {
"My Carousel": {
"headlines": ["Overall Carousel Headline"],
"bodies": ["Overall primary text"],
"descriptions": ["Overall description"],
"cta": "SHOP_NOW",
"link": "https://example.com/carousel",
"urlTags": "utm_content=my_carousel"
}
}
},
"carousel": [
{
"name": "My Carousel",
"cards": ["slide1.jpg", "slide2.jpg", "slide3.jpg"]
}
]
}
Las tarjetas deben referenciar nombres de archivo de la subida. Mínimo 2 tarjetas por carrusel. Los archivos reclamados por un carrusel se eliminan de la lista de anuncios estándar.
Anuncios flexibles
Agrupa varios recursos en un único anuncio flexible donde Meta elige el mejor recurso por ubicación:
{
"flexible": [
{
"name": "Multi-Asset Ad",
"assets": ["hero.jpg", "promo.mp4", "banner.jpg"]
}
]
}
Mínimo 2 recursos por grupo. Los archivos reclamados por un grupo flexible se eliminan de la lista de anuncios estándar.
Anuncios multimedia
Agrupa de 2 a 10 imágenes o vídeos subidos en un anuncio Multi Media de Meta:
{
"multimedia": [
{
"name": "Mixed Media Ad",
"assets": ["hero.jpg", "promo.mp4", "banner.jpg"],
"assetTexts": [
{
"headline": "Hero headline",
"primaryText": "Hero primary text",
"description": "Hero description",
"link": "https://example.com/hero",
"displayUrl": "example.com/hero"
}
]
}
]
}
Los recursos deben referenciar nombres de archivo de la subida. assetTexts es opcional y se alinea con assets por índice; cada campo es una única sustitución para ese recurso y los campos en blanco recurren al texto principal y a las URLs del anuncio. El recurso principal renderizado usa el texto y la URL principales del anuncio, y cualquier sustitución del texto principal de un recurso se convierte en la primera opción de texto principal. Los vídeos necesitan una URL de miniatura pública en caché procedente del procesamiento de la subida. Los archivos reclamados por un grupo Multi Media se eliminan de la lista de anuncios estándar.
Nombres de anuncios
Personaliza cómo se nombran tus anuncios:
{ "adNamePattern": "{filename} - {date}" }
| Marcador de posición | Qué inserta |
|---|---|
{filename} | Nombre de archivo original sin extensión |
{index:01} | Índice con ceros a la izquierda (01, 02, 03...) |
{variation} | Identificador de variación si la agrupación por variantes está activada |
{campaign} | Nombre de la campaña |
{date} | Fecha actual (AAAA-MM-DD) |
{date:short} | Fecha corta (MM-DD) |
{timestamp} | Marca de tiempo Unix |
Opciones
{
"options": {
"status": "PAUSED",
"pauseAt": "adSet",
"schedule": {
"startTime": "2026-04-01T09:00:00",
"endTime": "2026-04-30T23:59:59"
}
}
}
| Campo | Valores | Descripción |
|---|---|---|
status | "PAUSED", "ACTIVE" | Estado de lanzamiento del anuncio (predeterminado: ACTIVE) |
pauseAt | "ad", "adSet", "campaign" | En qué nivel pausar (predeterminado: ad) |
schedule.startTime | Cadena ISO 8601 | Hora de inicio programada (usa la zona horaria de la cuenta publicitaria) |
schedule.endTime | Cadena ISO 8601 | Hora de fin programada (opcional) |
Subida y detección de variantes
Los grupos de variantes se detectan automáticamente a partir de las convenciones de nombres de archivo, igual que en la aplicación web. Consulta Variaciones de relación de aspecto para todos los detalles sobre las convenciones de nombres.
Sufijos de relación: hero_1x1.jpg + hero_4x5.jpg + hero_9x16.jpg + hero_16x9.jpg + hero_1.91x1.jpg se agrupan como un único anuncio con variantes. Hasta 5 relaciones por grupo.
Posición del token: el token de relación puede aparecer al final (hero_4x5.jpg), en el medio (hero_4x5_v2.jpg) o al principio (4x5_hero.jpg).
Sufijos de palabra heredados: hero.jpg + hero_vertical.jpg + hero_horizontal.jpg siguen funcionando y se asignan a 9x16 y 16x9.
El delimitador predeterminado es _. Puedes cambiarlo (o aceptar varios) en Cuenta > Valores predeterminados > Ubicaciones > Separador de nombre de archivo.
Patrones comunes
Subir y crear con un preajuste
ads upload ./creatives/hero.jpg ./creatives/banner.jpg
ads create:preview spec.json
ads create spec.json
Donde spec.json contiene:
{ "adPresetId": "PRESET_ID", "uploadId": "BATCH_ID" }
Copiar la configuración de un anuncio existente
Navega por tu cuenta para encontrar el anuncio:
ads campaigns
ads campaign 120233848666410472
ads adset 120233848666620472
ads ad 120233848667930472
Luego crea una especificación que lo referencie:
{
"copyFromAd": "120233848667930472",
"uploadId": "BATCH_ID"
}
El anuncio de origen debe tener configuración de creativo en línea. Si se construyó a partir de una publicación de página existente, el CLI lo rechazará antes de enviar una solicitud de creación.
Guardar un preajuste de API a partir de un anuncio existente
ads presets:save --from-ad 120233848667930472 --name "Spring Purchase Template"
ads create --preset PRESET_ID --upload BATCH_ID
Esto guarda la misma forma de preajuste de API que usa la aplicación web. El anuncio de origen debe tener configuración de creativo en línea; los anuncios respaldados por publicaciones de página no pueden guardarse como preajustes de API.
Texto por anuncio con copia única por archivo
{
"adPresetId": "PRESET_ID",
"uploadId": "BATCH_ID",
"texts": {
"perAd": {
"hero.jpg": {
"headlines": ["Summer Sale Now On"],
"bodies": ["Save up to 50% on all items"],
"cta": "SHOP_NOW",
"link": "https://example.com/summer"
},
"banner.jpg": {
"headlines": ["New Collection Available"],
"bodies": ["Browse our latest styles"],
"cta": "LEARN_MORE",
"link": "https://example.com/new"
}
}
}
}
Agrupación automática en varios conjuntos de anuncios
{
"adPresetId": "PRESET_ID",
"uploadId": "BATCH_ID",
"adSet": { "mode": "autoGroup", "adsPerAdSet": 3 }
}
Notas importantes
- Siempre previsualiza primero.
create:previewdetecta errores de configuración antes de tocar Facebook. - Los anuncios están activos de forma predeterminada. Usa
--status PAUSEDo"status": "PAUSED"en la especificación para crearlos pausados. uploadIdproviene de la salida de la subida. Es el ID de la subida que devuelveads upload.- Las subidas están vinculadas a una cuenta publicitaria. Los archivos se suben directamente a la biblioteca de medios de Facebook de la cuenta seleccionada. El ID de la subida solo puede usarse con la misma cuenta.
copyFromAdnecesita medios resolubles. ProporcionauploadId, o lanza un build guardado cuyas imágenes capturadas tenganmediaHashy cuyos vídeos tenganmediaId. Opcionalmente, proporcionacampaign.idyadSet.idpara controlar la ubicación.- Las claves de texto por anuncio son nombres de archivo. Usa
"hero.jpg", no"/path/to/hero.jpg". textPresetIdytextsson mutuamente excluyentes. Usa uno u otro, no ambos.- Las CTA específicas del objetivo se heredan de la plantilla. No establezcas
MESSAGE_PAGE,WHATSAPP_MESSAGE, etc. manualmente.