# Proyectos

Un proyecto es una marca monitorizada: su dominio, configuración regional, prompts y competidores. Casi todos los demás endpoints reciben un `project_id`, así que empieza aquí.

### GET`/dimensions/projects`

Lista los proyectos del usuario autenticado (también sirve como comprobación de autenticación).

### GET`/dimensions/projects/:id`

Obtén información detallada sobre un proyecto: nombres coincidentes, sector, modelo de negocio, recuento de prompts por enfoque de marca y `data_coverage` (los modelos, países e idiomas que realmente tienen datos), de modo que una sola llamada sustituye a las consultas independientes de modelos y locales.

### GET`/dimensions/models`

Lista los modelos presentes en las métricas diarias del proyecto.

### GET`/dimensions/locales`

Lista los países e idiomas presentes en las métricas diarias del proyecto.

### POST`/projects`

Crea un proyecto completo en una sola llamada (modo rápido): proyecto, prompts (en cola para ejecución y categorización), competidores y suscripción al correo semanal. Idempotente cuando se proporciona external_identifier. El proyecto siempre pertenece al propietario de la cuenta.

- **Cuerpo (JSON)**: `website_url` (obligatorio, URL HTTP(S) pública con un nombre de host DNS o una dirección IP pública; se rechazan las URL con credenciales, las direcciones IP privadas y especiales, localhost y los nombres de host internos), `name` (obligatorio), `main_country` (obligatorio), `main_language` (obligatorio), `brand_name`, `description`, `industry` (array), `business_model`, `target_audience`, `brand_voice`, `goals`, `primary_products` (array), `matching_names` (array), `prompts` (array, máx. 100), `competitors` (array de objetos {domain, brand_name, matching_names}), `owned_media` (objeto, Growth+), `use_subdomain`, `weekly_email_subscribed`, `external_identifier` (solo cuentas con embed habilitado; clave de idempotencia, \[a-z0-9_-\]{1,64}), `execute_prompts_immediately` (por defecto, true).

### PATCH`/projects/:id`

Actualiza el perfil del proyecto (el Brand Book y el emparejamiento de marca), con los mismos campos que en Configuración del proyecto. Los siete campos del Brand Book (`industry`, `business_model`, `description`, `primary_products`, `target_audience`, `brand_voice`, `goals`) se usan en todas las tareas de GEO Writer y en las sugerencias de prompts. `industry`, `description` y `target_audience` también ayudan a ajustar los consejos de Recomendaciones. Cambiar `matching_names` vuelve a ejecutar el emparejamiento de menciones y citaciones en todo el historial del proyecto en segundo plano (`rematching: true`; mientras tanto, las ediciones quedan bloqueadas); un cambio de `brand_name` solo se aplica a ejecuciones futuras. Se rechazan los campos desconocidos.

- **Cuerpo (JSON)**: envía solo los campos que quieras cambiar: `brand_name`, `description`, `industry` (una sola clave), `business_model`, `target_audience`, `brand_voice`, `goals`, `primary_products` (array de sustitución completa), `matching_names` (array de SUSTITUCIÓN COMPLETA; envía todas las variantes que quieras conservar).

### Asistente de borradores de proyecto

Asistente de creación de proyectos en varios pasos con sugerencias de IA: POST /project_drafts inicia un borrador (devuelve el nombre, la descripción y el sector sugeridos para la URL), PATCH envía cada paso (details, prompts, competitors, owned_media) con una validación estricta del avance entre pasos y devuelve sugerencias para el siguiente paso, y POST /project_drafts/:id/finalize crea el proyecto real. Los borradores caducan tras 24h.

- La `website_url` inicial debe ser una URL HTTP(S) pública con un nombre de host DNS o una dirección IP pública. Se rechazan las URL con credenciales, las direcciones IP privadas y especiales, localhost y los nombres de host internos. Pasos: `details` (name obligatorio), `prompts` (máx. 100, sujeto a cuota), `competitors` (limitado por plan), `owned_media` (opcional, Growth+). Sugerencias por paso, con opción de desactivarlas mediante `suggest=false`; las URL frías pueden tardar hasta ~2 minutos, configura el timeout del cliente en 180s. Finalize es idempotente y vuelve a comprobar todos los requisitos.
