Saltearse al contenido

Campañas GTM

Las campañas GTM son los objetos de campaña de AI-Studio de graph8: un brief, una secuencia (referencias ordenadas de pasos) y un catálogo de pasos (las definiciones reales de cada paso). Cada campaña gestiona un conjunto de documentos generados (brief de campaña, documento de secuencia, copy de anuncios, copy de landing page, etc.).

Estos endpoints son la variante de alcance organizacional que utilizan Studio, MCP y el modo GTM de Claude Desktop. La misma superficie también se expone en /repos/{repo_id}/campaigns para usuarios de CLI con spine instalado; consulte la referencia de la CLI para esa variante.

EndpointMétodoDescripción
/campaignsGETListar campañas
/campaignsPOSTCrear una campaña
/campaigns/ideasGETListar ideas de campaña guardadas
/campaigns/{id}GETObtener una campaña con sus documentos
/campaigns/{id}PATCHActualizar campos de contenido de la campaña
/campaigns/{id}/documentsGETListar documentos de una campaña
/campaigns/{id}/documentsPOSTCrear un documento
/campaigns/{id}/documents/{doc_id}GETObtener el contenido completo del documento
/campaigns/{id}/documents/{doc_id}PUTActualizar el contenido del documento
/campaigns/{id}/documents/{doc_id}DELETEEliminar un documento
/campaigns/{id}/sequenceGETObtener documentos de secuencia y catálogo de pasos
/campaigns/{id}/sequencePUTReemplazar el orden de los pasos de la secuencia
/campaigns/{id}/sequence/stepsPOSTAgregar un paso
/campaigns/{id}/sequence/steps/{step_id}PUTActualizar la definición de un paso
/campaigns/{id}/sequence/steps/{step_id}DELETEEliminar un paso
/campaigns/{id}/launchPOSTPoner en cola el lanzamiento de la campaña

Para esquemas legibles por máquina, consulte la documentación interactiva de la API.


Listar campañas

GET /campaigns

Devuelve todas las campañas no archivadas de la organización, paginadas.

Parámetros de consulta

ParámetroTipoPredeterminadoDescripción
pageinteger1Número de página
limitinteger501-200

Ejemplo

Ventana de terminal
curl "https://be.graph8.com/api/v1/campaigns?limit=10" \
-H "Authorization: Bearer $API_KEY"

Respuesta

{
"data": [
{
"id": "cmp_abc",
"name": "Q2 Outbound - VP Marketing",
"slug": "q2-outbound-vp-marketing",
"status": "draft",
"category": "Outbound",
"goal": "Book discovery calls",
"target_persona": "VP Marketing at mid-market SaaS",
"created_at": "2026-04-01T10:00:00Z"
}
]
}

Crear campaña

POST /campaigns

Crea una nueva campaña. El slug se genera automáticamente a partir de name.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringNombre de la campaña
categorystringNo (predeterminado Outbound)Categoría de la campaña
briefstringNoBrief de la campaña
core_conceptstringNoConcepto en una línea
primary_hookstringNoTexto del gancho principal
target_personastringNoPersona objetivo
goalstringNoObjetivo de la campaña

Ejemplo

Ventana de terminal
curl -X POST "https://be.graph8.com/api/v1/campaigns" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Q2 Outbound - VP Marketing",
"category": "Outbound",
"primary_hook": "Cut SDR ramp time in half",
"goal": "Book discovery calls"
}'

Respuesta

{
"data": {
"id": "cmp_abc",
"name": "Q2 Outbound - VP Marketing",
"slug": "q2-outbound-vp-marketing",
"status": "draft",
"category": "Outbound"
}
}

Listar ideas de campaña

GET /campaigns/ideas

Devuelve las ideas de campaña guardadas o generadas con IA (antes de su conversión). Utilícelas para inicializar POST /campaigns.

Parámetros de consulta

ParámetroTipoPredeterminadoDescripción
favoritedboolean-Filtrar solo las ideas marcadas como favoritas
limitinteger501-200

Respuesta

{
"data": [
{
"id": "idea_001",
"rank": 1,
"campaign_name": "Sales Velocity Diagnostic",
"campaign_category": "Outbound",
"campaign_focus": "Mid-market RevOps",
"core_concept": "...",
"why_this_works": "...",
"primary_hook": "Find your stuck deals in 5 minutes",
"secondary_hooks": ["..."],
"target_channels": ["email", "linkedin"],
"required_assets": ["landing page", "demo video"],
"execution_complexity": "medium",
"expected_impact": "high",
"proof_points": ["..."],
"framework_inspiration": "Challenger",
"source": "studio_generated",
"favorited": true,
"converted_to_campaign": false,
"converted_campaign_id": null,
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-01T10:00:00Z"
}
]
}

Obtener campaña

GET /campaigns/{campaign_id}

Devuelve los detalles de la campaña junto con un resumen de los documentos completados.

Ejemplo

Ventana de terminal
curl "https://be.graph8.com/api/v1/campaigns/cmp_abc" \
-H "Authorization: Bearer $API_KEY"

Respuesta

{
"data": {
"id": "cmp_abc",
"name": "Q2 Outbound - VP Marketing",
"slug": "q2-outbound-vp-marketing",
"status": "draft",
"category": "Outbound",
"goal": "Book discovery calls",
"target_persona": "VP Marketing at mid-market SaaS",
"brief": "...",
"core_concept": "...",
"primary_hook": "Cut SDR ramp time in half",
"channels": ["email", "linkedin"],
"documents": [
{"id": "doc_001", "name": "Campaign Brief", "type": "campaign_brief"},
{"id": "doc_002", "name": "Sequence", "type": "sequence"}
],
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-10T14:30:00Z"
}
}

Errores

EstadoSignificado
404Campaña no encontrada

Actualizar campaña

PATCH /campaigns/{campaign_id}

Actualiza los campos de contenido de una campaña.

Cuerpo de la solicitud

CampoTipoDescripción
namestringNombre de la campaña
briefstringBrief de la campaña
core_conceptstringConcepto central
primary_hookstringTexto del gancho principal
target_personastringPersona objetivo
categorystringCategoría de la campaña
goalstringObjetivo de la campaña

Errores

EstadoSignificado
400No se proporcionaron campos
404Campaña no encontrada

Listar documentos de la campaña

GET /campaigns/{campaign_id}/documents

Devuelve los metadatos de cada documento asociado a la campaña (sin el payload de contenido).

Respuesta

{
"data": {
"campaign_id": "cmp_abc",
"documents": [
{
"id": "doc_001",
"campaign_id": "cmp_abc",
"display_name": "Campaign Brief",
"name": "Campaign Brief",
"file_type": "campaign_brief",
"type": "campaign_brief",
"folder_path": "/brief",
"status": "completed",
"version": 2,
"current_version": 2,
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-05T11:00:00Z"
}
],
"count": 1
}
}

Obtener documento de la campaña

GET /campaigns/{campaign_id}/documents/{document_id}

Devuelve el contenido completo del documento.

Ejemplo

Ventana de terminal
curl "https://be.graph8.com/api/v1/campaigns/cmp_abc/documents/doc_001" \
-H "Authorization: Bearer $API_KEY"

Respuesta

{
"data": {
"id": "doc_001",
"campaign_id": "cmp_abc",
"name": "Campaign Brief",
"type": "campaign_brief",
"status": "completed",
"version": 2,
"content": "# Campaign Brief\n\nGoal: ...",
"created_at": "2026-04-01T10:00:00Z",
"updated_at": "2026-04-05T11:00:00Z"
}
}

Crear documento de campaña

POST /campaigns/{campaign_id}/documents

Crea un nuevo documento adjunto a la campaña.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
file_typestringTipo de documento (campaign_brief, sequence, step_catalog, etc.)
display_namestringNombre legible para humanos
contentstringNoContenido del documento (predeterminado "")
folder_pathstringNoRuta de carpeta opcional
statusstringNo (predeterminado draft)Estado del documento

Respuesta 201 Created

Devuelve la misma estructura de documento que GET .../documents/{document_id}.


Actualizar documento de campaña

PUT /campaigns/{campaign_id}/documents/{document_id}

Actualiza el contenido. Incrementa version y current_version en 1, y registra completed=true y generating=false en los metadatos.

Cuerpo de la solicitud

CampoTipoDescripción
contentstringNuevo contenido (mantiene el existente si está vacío)
statusstringAnulación de estado opcional
structured_dataobjectPayload estructurado opcional almacenado en los metadatos

Errores

EstadoSignificado
404Documento no encontrado (o su campaña principal está archivada)

Eliminar documento de campaña

DELETE /campaigns/{campaign_id}/documents/{document_id}

Eliminación permanente. Devuelve 404 si no se encuentra el documento o su campaña principal.

Respuesta

{ "data": { "status": "deleted", "document_id": "doc_001" } }

Obtener secuencia

GET /campaigns/{campaign_id}/sequence

Devuelve tanto el documento de secuencia (lista ordenada de referencias de pasos) como el documento de catálogo de pasos (definiciones de pasos identificadas por step_id).

Respuesta

{
"data": {
"campaign_id": "cmp_abc",
"sequence": {
"steps": [
{"step_id": "step_1", "day": 0, "condition": null, "stop_on_reply": true},
{"step_id": "step_2", "day": 3, "condition": "no_reply", "stop_on_reply": true}
]
},
"step_catalog": {
"steps": {
"step_1": {"name": "Intro email", "channel": "email", "mode": "send", ...},
"step_2": {"name": "LinkedIn follow-up", "channel": "linkedin", "mode": "send", ...}
}
},
"sequence_doc_id": "doc_seq_001",
"catalog_doc_id": "doc_cat_001"
}
}

Errores

EstadoSignificado
404Campaña no encontrada

Actualizar secuencia

PUT /campaigns/{campaign_id}/sequence

Reemplaza la lista ordenada de referencias de pasos. Cada step_id debe existir en el catálogo de pasos.

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
stepsobject[]Referencias ordenadas de pasos

Cada elemento step:

CampoTipoDescripción
step_idstringID del paso (debe existir en el catálogo)
dayintegerDesplazamiento en días desde el inicio de la secuencia
conditionstringCondición opcional (no_reply, etc.)
stop_on_replybooleanPredeterminado true

Errores

EstadoSignificado
400step_id no está en el catálogo
404Documento de secuencia no encontrado

Crear paso de secuencia

POST /campaigns/{campaign_id}/sequence/steps

Crea un nuevo paso y lo agrega a la secuencia en una sola llamada. El endpoint genera un nuevo step_id (step_N).

Cuerpo de la solicitud

CampoTipoRequeridoDescripción
namestringNombre del paso
channelstringemail, linkedin, sms, phone, etc.
modestringsend, manual, etc.
dayintegerDesplazamiento en días para la ubicación en la secuencia
platformstringNoPlataforma del subcanal
angle_idstringNo (predeterminado angle_1)Referencia del ángulo de mensajería
cta_typestringNo (predeterminado soft_ask)Tipo de CTA
personalization_levelstringNo (predeterminado medium)Nivel de personalización
constraintsobjectNoDiccionario de restricciones
conditionstringNoCondición de la secuencia
stop_on_replybooleanNo (predeterminado true)Detiene la inscripción del contacto al recibir respuesta

Respuesta 201 Created

{
"data": {
"status": "created",
"step_id": "step_3",
"step": {
"step_id": "step_3",
"name": "Final follow-up",
"channel": "email",
"mode": "send",
"platform": null,
"angle_id": "angle_1",
"cta_type": "soft_ask",
"personalization_level": "medium",
"constraints": {}
},
"day": 7
}
}

Actualizar paso de secuencia

PUT /campaigns/{campaign_id}/sequence/steps/{step_id}

Actualiza la definición de un paso en el catálogo y, opcionalmente, su ubicación en la secuencia. Todos los campos son opcionales: envíe solo los que desee modificar.

Cuerpo de la solicitud

CampoTipoDescripción
namestringNombre del paso
channelstringCanal
modestringModo
platformstringPlataforma
angle_idstringÁngulo de mensajería
cta_typestringTipo de CTA
personalization_levelstringNivel
constraintsobjectDiccionario de restricciones
do_not_send_rulesstring[]Reglas que deben suprimir el envío
dayintegerUbicación en la secuencia (actualiza el documento de secuencia, no el catálogo)
conditionstringCondición de ubicación en la secuencia
stop_on_replybooleanAnulación de ubicación en la secuencia

Los campos day, condition y stop_on_reply modifican el documento de secuencia; el resto modifica la entrada del catálogo.

Errores

EstadoSignificado
404Paso o catálogo de pasos no encontrado

Eliminar paso de secuencia

DELETE /campaigns/{campaign_id}/sequence/steps/{step_id}

Elimina un paso del catálogo y todas sus referencias en la secuencia.

Respuesta

{ "data": { "status": "deleted", "step_id": "step_3" } }

Errores

EstadoSignificado
404Paso no encontrado

Lanzar campaña

POST /campaigns/{campaign_id}/launch

Advertencia: pone en cola prospección real hacia contactos reales en los canales vinculados. El endpoint responde de inmediato con el estado launch_queued; utilice la CLI de spine (g8 watch) o su propio sondeo contra /sequences/{id} para monitorear el progreso.

Ejemplo

Ventana de terminal
curl -X POST "https://be.graph8.com/api/v1/campaigns/cmp_abc/launch" \
-H "Authorization: Bearer $API_KEY"

Respuesta

{
"data": {
"status": "launch_queued",
"campaign_id": "cmp_abc",
"message": "Campaign launch has been queued. Use g8 watch to monitor progress."
}
}