{"openapi":"3.1.0","info":{"title":"Hapee API","version":"1.0.0","description":"API REST de Hapee para integrar tu sistema con una subcuenta.\n\n## Lo esencial en cinco lineas\n\n- **Autenticacion**: `Authorization: Bearer hp_live_...` (o `hp_test_...` en sandbox).\n- **La subcuenta sale de la credencial.** Nunca se manda por parametro.\n- **Formatos**: JSON UTF-8, fechas ISO 8601 en UTC (`Z`), telefonos E.164,\n  montos como texto decimal con su `currency` ISO 4217, RUT como `12345678-K`.\n- **Listas**: paginacion por cursor (`limit` hasta 100, `cursor`, `next_cursor`).\n- **Escrituras**: manda `Idempotency-Key` y un reintento no duplica nada.\n\n## Enterarse de lo que pasa\n\nHay dos caminos y sirven los mismos eventos, con el mismo cuerpo:\n\n- **Webhooks**: nos das una URL https y te avisamos. Firmados con HMAC-SHA256.\n- **`GET /events`**: si tu sistema no puede exponer una URL publica, consultas\n  tu con un cursor. Retencion de 30 dias.\n\nPodes usar los dos, o solo uno. No hay que configurar nada distinto.\n\n## Errores\n\nTodos tienen la misma forma, y el `code` es estable:\n\n```json\n{\n  \"error\": {\n    \"code\": \"validation_error\",\n    \"message\": \"El RUT no es valido.\",\n    \"details\": [{\"field\": \"rut\", \"issue\": \"invalid_check_digit\"}],\n    \"request_id\": \"a1b2c3...\"\n  }\n}\n```\n\n## Versionado\n\n`v1` es estable. **Agregar un campo a una respuesta no es un cambio que rompa**,\nasi que tu integracion tiene que ignorar los que no conoce. Un cambio que rompa\nsale como `v2`, y `v1` sigue vivo al menos 12 meses desde el anuncio.","contact":{"name":"Soporte Hapee","url":"https://hapee.ai"}},"servers":[{"url":"https://beta.hapee.ai/api/v1","description":"Produccion"},{"url":"https://staging.hapee.ai/api/v1","description":"Pruebas (sandbox)"}],"security":[{"bearerAuth":[]}],"paths":{"/pipelines":{"get":{"tags":["api-v1-deals"],"summary":"V1 List Pipelines","operationId":"v1_list_pipelines_api_v1_pipelines_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-deals"],"summary":"V1 Create Pipeline","description":"Crea un pipeline. Si no se mandan `stages`, se crean las seis por defecto:\nun pipeline sin etapas deja el kanban inusable.","operationId":"v1_create_pipeline_api_v1_pipelines_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/deals":{"get":{"tags":["api-v1-deals"],"summary":"V1 List Deals","operationId":"v1_list_deals_api_v1_deals_get","parameters":[{"name":"pipeline_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pipeline Id"}},{"name":"stage_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stage Id"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-deals"],"summary":"V1 Create Deal","operationId":"v1_create_deal_api_v1_deals_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/deals/{deal_id}":{"get":{"tags":["api-v1-deals"],"summary":"V1 Get Deal","operationId":"v1_get_deal_api_v1_deals__deal_id__get","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-deals"],"summary":"V1 Update Deal","operationId":"v1_update_deal_api_v1_deals__deal_id__patch","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-deals"],"summary":"V1 Delete","operationId":"v1_delete_api_v1_deals__deal_id__delete","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deals/upsert":{"post":{"tags":["api-v1-deals"],"summary":"V1 Upsert Deal","description":"Upsert por external_id.","operationId":"v1_upsert_deal_api_v1_deals_upsert_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/deals/{deal_id}/move-stage":{"post":{"tags":["api-v1-deals"],"summary":"V1 Move Stage","operationId":"v1_move_stage_api_v1_deals__deal_id__move_stage_post","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deals/{deal_id}/won":{"post":{"tags":["api-v1-deals"],"summary":"V1 Won","operationId":"v1_won_api_v1_deals__deal_id__won_post","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deals/{deal_id}/lost":{"post":{"tags":["api-v1-deals"],"summary":"V1 Lost","operationId":"v1_lost_api_v1_deals__deal_id__lost_post","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}/forecast":{"get":{"tags":["api-v1-deals"],"summary":"V1 Forecast","operationId":"v1_forecast_api_v1_pipelines__pipeline_id__forecast_get","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{contacto_id}/deals":{"get":{"tags":["api-v1-deals"],"summary":"V1 Contact Deals","operationId":"v1_contact_deals_api_v1_contacts__contacto_id__deals_get","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}":{"patch":{"tags":["api-v1-deals"],"summary":"V1 Update Pipeline","description":"Modifica el pipeline. `razones_config` NO se toca por API: adentro esta\ndetras de un permiso por usuario que una API key no tiene como respetar.","operationId":"v1_update_pipeline_api_v1_pipelines__pipeline_id__patch","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-deals"],"summary":"V1 Delete Pipeline","description":"Elimina el pipeline y TODO lo que cuelga de el (etapas, negocios cerrados\no en papelera, historial, auditoria, metas, snapshots de forecast).\n\nSe NIEGA si hay negocios ABIERTOS: son plata en curso, y borrarlos porque\nalguien pidio borrar el tablero seria irreversible y silencioso. Hay que\nmoverlos o cerrarlos primero. Para sacarlo de circulacion sin perder nada,\nesta `/archive`.","operationId":"v1_delete_pipeline_api_v1_pipelines__pipeline_id__delete","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}/archive":{"post":{"tags":["api-v1-deals"],"summary":"V1 Archive Pipeline","description":"Archiva el pipeline: sale de las listas activas pero no se borra nada.\nEs lo que hay que usar cuando el pipeline tiene historial que conservar.","operationId":"v1_archive_pipeline_api_v1_pipelines__pipeline_id__archive_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}/duplicate":{"post":{"tags":["api-v1-deals"],"summary":"V1 Duplicate Pipeline","description":"Clona el pipeline con sus etapas (sin negocios). La copia nunca queda como\npipeline por defecto.","operationId":"v1_duplicate_pipeline_api_v1_pipelines__pipeline_id__duplicate_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}/stages":{"post":{"tags":["api-v1-deals"],"summary":"V1 Create Stage","description":"Agrega una etapa al pipeline. Sin `orden`, va al final.\n`stage_type` = open|won|lost.","operationId":"v1_create_stage_api_v1_pipelines__pipeline_id__stages_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stages/{stage_id}":{"patch":{"tags":["api-v1-deals"],"summary":"V1 Update Stage","description":"Modifica una etapa. Cambiar `stage_type` sincroniza los flags legacy\n`es_ganado`/`es_perdido`, que son los que lee el forecast.","operationId":"v1_update_stage_api_v1_stages__stage_id__patch","parameters":[{"name":"stage_id","in":"path","required":true,"schema":{"type":"integer","title":"Stage Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-deals"],"summary":"V1 Delete Stage","description":"Elimina una etapa. Si tiene negocios, hay que decir a que etapa se mueven\n(`move_deals_to`) — y tiene que ser una etapa del MISMO pipeline: con un id\ncualquiera los negocios terminaban en el tablero de otro, o de otro inquilino.","operationId":"v1_delete_stage_api_v1_stages__stage_id__delete","parameters":[{"name":"stage_id","in":"path","required":true,"schema":{"type":"integer","title":"Stage Id"}},{"name":"move_deals_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Move Deals To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}/stages/reorder":{"post":{"tags":["api-v1-deals"],"summary":"V1 Reorder Stages","description":"Reordena las etapas. Body: `{\"order\": [stage_id, stage_id, ...]}`.\nLos ids que no son de ESTE pipeline se ignoran.","operationId":"v1_reorder_stages_api_v1_pipelines__pipeline_id__stages_reorder_post","parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"integer","title":"Pipeline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendars":{"get":{"tags":["api-v1-calendar"],"summary":"V1 List Calendars","operationId":"v1_list_calendars_api_v1_calendars_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-calendar"],"summary":"V1 Create Calendar","description":"Crea un calendario. `slug` es obligatorio y único por subcuenta (es la URL\npública de reserva). La zona horaria sale de la subcuenta si no se manda:\ncon un literal, una subcuenta de otro país arranca con el reloj equivocado.","operationId":"v1_create_calendar_api_v1_calendars_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/calendars/{calendar_id}/availability":{"get":{"tags":["api-v1-calendar"],"summary":"V1 Availability","operationId":"v1_availability_api_v1_calendars__calendar_id__availability_get","parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}},{"name":"date_from","in":"query","required":true,"schema":{"type":"string","title":"Date From"}},{"name":"date_to","in":"query","required":true,"schema":{"type":"string","title":"Date To"}},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tz"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendars/{calendar_id}/appointments":{"get":{"tags":["api-v1-calendar"],"summary":"V1 List Appointments","operationId":"v1_list_appointments_api_v1_calendars__calendar_id__appointments_get","parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/appointments/{apt_id}":{"get":{"tags":["api-v1-calendar"],"summary":"V1 Get Appointment","operationId":"v1_get_appointment_api_v1_appointments__apt_id__get","parameters":[{"name":"apt_id","in":"path","required":true,"schema":{"type":"integer","title":"Apt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendars/{calendar_id}/book":{"post":{"tags":["api-v1-calendar"],"summary":"V1 Book","operationId":"v1_book_api_v1_calendars__calendar_id__book_post","parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/appointments/{apt_id}/cancel":{"post":{"tags":["api-v1-calendar"],"summary":"V1 Cancel","operationId":"v1_cancel_api_v1_appointments__apt_id__cancel_post","parameters":[{"name":"apt_id","in":"path","required":true,"schema":{"type":"integer","title":"Apt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/appointments/{apt_id}/reschedule":{"post":{"tags":["api-v1-calendar"],"summary":"V1 Reschedule","operationId":"v1_reschedule_api_v1_appointments__apt_id__reschedule_post","parameters":[{"name":"apt_id","in":"path","required":true,"schema":{"type":"integer","title":"Apt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{contacto_id}/appointments":{"get":{"tags":["api-v1-calendar"],"summary":"V1 Contact Appointments","operationId":"v1_contact_appointments_api_v1_contacts__contacto_id__appointments_get","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/calendars/{calendar_id}":{"patch":{"tags":["api-v1-calendar"],"summary":"V1 Update Calendar","description":"Modifica un calendario. Cambiar el `slug` cambia la URL pública de reserva:\nlos enlaces ya repartidos dejan de funcionar.","operationId":"v1_update_calendar_api_v1_calendars__calendar_id__patch","parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-calendar"],"summary":"V1 Delete Calendar","description":"Elimina un calendario — SALVO que tenga citas FUTURAS confirmadas o\npendientes: en ese caso se archiva (`activo=False`) y se dice por qué.\nBorrarlo dejaría a gente real con una cita agendada contra la nada.\n\nSin citas futuras se borra de verdad, y con él sus citas pasadas y sus\nbloqueos de agenda (su FK es NOT NULL: si no se purgan primero, el ORM\nintenta anularla y el borrado falla).","operationId":"v1_delete_calendar_api_v1_calendars__calendar_id__delete","parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sites":{"get":{"tags":["platform-core"],"summary":"V1 List Sites","operationId":"v1_list_sites_api_v1_sites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sites/{site_id}/pages":{"get":{"tags":["platform-core"],"summary":"V1 Site Pages","operationId":"v1_site_pages_api_v1_sites__site_id__pages_get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"integer","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/blog/posts":{"get":{"tags":["platform-core"],"summary":"V1 Blog List","operationId":"v1_blog_list_api_v1_blog_posts_get","parameters":[{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"publicado","title":"Estado"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/blog/posts/{slug}":{"get":{"tags":["platform-core"],"summary":"V1 Blog Detail","operationId":"v1_blog_detail_api_v1_blog_posts__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conversations":{"get":{"tags":["platform-core"],"summary":"V1 Convs","operationId":"v1_convs_api_v1_conversations_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conversations/{conv_id}":{"get":{"tags":["platform-core"],"summary":"V1 Conv Detail","operationId":"v1_conv_detail_api_v1_conversations__conv_id__get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/conversations/{conv_id}/messages":{"post":{"tags":["platform-core"],"summary":"V1 Conv Send","operationId":"v1_conv_send_api_v1_conversations__conv_id__messages_post","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"integer","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts":{"get":{"tags":["api-v1"],"summary":"Contacts List","operationId":"contacts_list_api_v1_contacts_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1"],"summary":"Contacts Create","operationId":"contacts_create_api_v1_contacts_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{cid}":{"get":{"tags":["api-v1"],"summary":"Contacts Get","operationId":"contacts_get_api_v1_contacts__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1"],"summary":"Contacts Patch","operationId":"contacts_patch_api_v1_contacts__cid__patch","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1"],"summary":"Contacts Delete","operationId":"contacts_delete_api_v1_contacts__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/upsert":{"post":{"tags":["api-v1"],"summary":"Contacts Upsert","operationId":"contacts_upsert_api_v1_contacts_upsert_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{cid}/tags":{"post":{"tags":["api-v1"],"summary":"Contacts Add Tag","operationId":"contacts_add_tag_api_v1_contacts__cid__tags_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tags":{"get":{"tags":["api-v1"],"summary":"Tags List","description":"Las etiquetas de la subcuenta, con su id.\n\nFaltaba, y se notaba en un lugar concreto: los pasos `add_tag` y `remove_tag`\nde una automatización piden `tag_ids`, y por API no había de dónde sacarlos.\nQuedaba mandar `tag_names` y dejar que el alta implícita cree la etiqueta —\nque es justo como nacen los duplicados por un espacio o una mayúscula.","operationId":"tags_list_api_v1_tags_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{cid}/tags/{tag_id}":{"delete":{"tags":["api-v1"],"summary":"Contacts Remove Tag","operationId":"contacts_remove_tag_api_v1_contacts__cid__tags__tag_id__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"tag_id","in":"path","required":true,"schema":{"type":"integer","title":"Tag Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"X-Api-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tasks":{"get":{"tags":["api-v1-tasks"],"summary":"V1 List Tasks","operationId":"v1_list_tasks_api_v1_tasks_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Project Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"assignee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assignee Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-tasks"],"summary":"V1 Create Task","operationId":"v1_create_task_api_v1_tasks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tasks/{task_id}":{"patch":{"tags":["api-v1-tasks"],"summary":"V1 Update Task","operationId":"v1_update_task_api_v1_tasks__task_id__patch","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"integer","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/companies":{"get":{"tags":["api-v1-empresas"],"summary":"V1 List Companies","operationId":"v1_list_companies_api_v1_companies_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-empresas"],"summary":"V1 Create Company","operationId":"v1_create_company_api_v1_companies_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/companies/{empresa_id}":{"get":{"tags":["api-v1-empresas"],"summary":"V1 Get Company","operationId":"v1_get_company_api_v1_companies__empresa_id__get","parameters":[{"name":"empresa_id","in":"path","required":true,"schema":{"type":"integer","title":"Empresa Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-empresas"],"summary":"V1 Update Company","operationId":"v1_update_company_api_v1_companies__empresa_id__patch","parameters":[{"name":"empresa_id","in":"path","required":true,"schema":{"type":"integer","title":"Empresa Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-empresas"],"summary":"V1 Delete Company","operationId":"v1_delete_company_api_v1_companies__empresa_id__delete","parameters":[{"name":"empresa_id","in":"path","required":true,"schema":{"type":"integer","title":"Empresa Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/companies/upsert":{"post":{"tags":["api-v1-empresas"],"summary":"V1 Upsert Company","description":"Crea o actualiza una empresa emparejando por identidad, no por nombre.\n\nLa precedencia es `external_id > rut > email` y la resuelve\n`api_identidad_service`, la MISMA puerta que usa el upsert de contactos: dos\nreglas de emparejamiento distintas para el mismo ERP terminan con el cliente\nduplicado en una tabla y no en la otra.\n\nEl nombre NO es criterio de identidad a proposito. «Comercial Andes SpA» y\n«COMERCIAL ANDES» son la misma empresa y no matchean; peor, dos sucursales\ndistintas pueden llamarse igual. El RUT es lo que identifica a una persona\njuridica ante el SII, y `external_id` es lo que el ERP afirma sobre su\npropia base.\n\nRespuesta: el objeto completo mas `created: true|false`, para que el ERP\nsepa si acaba de nacer sin tener que consultar de nuevo.","operationId":"v1_upsert_company_api_v1_companies_upsert_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/products":{"get":{"tags":["api-v1-productos"],"summary":"V1 List Products","operationId":"v1_list_products_api_v1_products_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"tipo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-productos"],"summary":"V1 Create Product","description":"Crea un producto.\n\nPasa por `producto_service.crear` (2026-08-31) y no por un INSERT propio: el\nservicio es el que rechaza el SKU repetido y acota `tipo`/`estado` al\ncatalogo. Antes esta ruta armaba el Producto a mano y por API se podian\ncrear dos productos con el mismo SKU — que la interfaz impide y que despues\nrompe la importacion y el emparejado de cotizaciones.","operationId":"v1_create_product_api_v1_products_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/products/{producto_id}":{"get":{"tags":["api-v1-productos"],"summary":"V1 Get Product","operationId":"v1_get_product_api_v1_products__producto_id__get","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-productos"],"summary":"V1 Update Product","description":"Modifica un producto. `campos_custom` se MERGEA (no reemplaza): la ficha\nguarda propiedad por propiedad y un PATCH de un campo no puede borrar el resto.","operationId":"v1_update_product_api_v1_products__producto_id__patch","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-productos"],"summary":"V1 Delete Product","description":"Manda el producto a la PAPELERA (soft-delete). Se puede recuperar con\n`/products/{id}/restore`.","operationId":"v1_delete_product_api_v1_products__producto_id__delete","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/products/{producto_id}/restore":{"post":{"tags":["api-v1-productos"],"summary":"V1 Restore Product","description":"Saca el producto de la papelera y lo deja activo.","operationId":"v1_restore_product_api_v1_products__producto_id__restore_post","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/products/{producto_id}/archive":{"post":{"tags":["api-v1-productos"],"summary":"V1 Archive Product","description":"Archiva el producto (`estado='archivado'`): deja de ofrecerse, pero no se\nborra ni se pierde el historial de cotizaciones que lo usan.","operationId":"v1_archive_product_api_v1_products__producto_id__archive_post","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/products/{producto_id}/clone":{"post":{"tags":["api-v1-productos"],"summary":"V1 Clone Product","description":"Clona el producto CON sus precios y tramos de volumen.","operationId":"v1_clone_product_api_v1_products__producto_id__clone_post","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/products/{producto_id}/prices":{"get":{"tags":["api-v1-productos"],"summary":"V1 List Prices","operationId":"v1_list_prices_api_v1_products__producto_id__prices_get","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-productos"],"summary":"V1 Save Price","description":"Crea un precio del producto, o ACTUALIZA uno existente si el cuerpo trae `id`.\n\nUn precio es la combinacion (moneda, tipo_precio, periodicidad, vigencia):\nel price book es por moneda y NO se convierte solo. `tipo_precio` =\nunico|recurrente; `periodicidad` (mensual|trimestral|semestral|anual|\npersonalizada) solo aplica a los recurrentes y se ignora en los unicos.","operationId":"v1_save_price_api_v1_products__producto_id__prices_post","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/products/{producto_id}/prices/{precio_id}":{"delete":{"tags":["api-v1-productos"],"summary":"V1 Delete Price","operationId":"v1_delete_price_api_v1_products__producto_id__prices__precio_id__delete","parameters":[{"name":"producto_id","in":"path","required":true,"schema":{"type":"integer","title":"Producto Id"}},{"name":"precio_id","in":"path","required":true,"schema":{"type":"integer","title":"Precio Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/product-categories":{"get":{"tags":["api-v1-productos"],"summary":"V1 List Categories","operationId":"v1_list_categories_api_v1_product_categories_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-productos"],"summary":"V1 Create Category","operationId":"v1_create_category_api_v1_product_categories_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/forms":{"get":{"tags":["api-v1-forms"],"summary":"V1 List Forms","operationId":"v1_list_forms_api_v1_forms_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-forms"],"summary":"V1 Create Form","description":"Crea un formulario. Nace en BORRADOR: publicarlo es un acto aparte.\n\nSin `campos`, se crean los cuatro por defecto (email, nombre, teléfono,\nmensaje) en la forma que el runtime público entiende — un formulario con\ncampos a medias se ve bien y no mapea nada al contacto.","operationId":"v1_create_form_api_v1_forms_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/forms/{form_id}":{"get":{"tags":["api-v1-forms"],"summary":"V1 Get Form","operationId":"v1_get_form_api_v1_forms__form_id__get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["api-v1-forms"],"summary":"V1 Update Form","description":"Edita el formulario.\n\nSi mandás `version`, se comprueba contra la guardada y se rechaza con 409 si\nquedó vieja: dos pantallas editando a la vez, la segunda revierte lo que la\nprimera guardó y así es como \"desaparecen los destinatarios\". Sin `version`\nno se exige nada (compatibilidad con llamadores viejos), pero conviene\nmandarla: leé con `obtener_formulario` y devolvé la que venga.","operationId":"v1_update_form_api_v1_forms__form_id__put","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-forms"],"summary":"V1 Delete Form","description":"ARCHIVA el formulario: sale del listado y deja de estar público.\n\nNo se borra físicamente y es a propósito: los envíos recibidos tienen FK al\nformulario, y borrarlo se llevaría los leads que ya entraron por él. El slug\nqueda ocupado (el alta lo tiene en cuenta y numera el siguiente).","operationId":"v1_delete_form_api_v1_forms__form_id__delete","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forms/{form_id}/submissions":{"get":{"tags":["api-v1-forms"],"summary":"V1 List Submissions","operationId":"v1_list_submissions_api_v1_forms__form_id__submissions_get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forms/{form_id}/submissions/{sub_id}":{"get":{"tags":["api-v1-forms"],"summary":"V1 Get Submission","operationId":"v1_get_submission_api_v1_forms__form_id__submissions__sub_id__get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}},{"name":"sub_id","in":"path","required":true,"schema":{"type":"integer","title":"Sub Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forms/{form_id}/publish":{"post":{"tags":["api-v1-forms"],"summary":"V1 Publish Form","description":"PUBLICA el formulario: queda accesible en su URL pública y empieza a\nrecibir envíos de gente real. Acepta los mismos campos que el PUT — publicar\nno puede ser una forma silenciosa de descartar la mitad de lo editado.","operationId":"v1_publish_form_api_v1_forms__form_id__publish_post","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/forms/{form_id}/unpublish":{"post":{"tags":["api-v1-forms"],"summary":"V1 Unpublish Form","description":"Despublica: deja de estar accesible y de recibir envíos. No borra nada.","operationId":"v1_unpublish_form_api_v1_forms__form_id__unpublish_post","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"integer","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows":{"get":{"tags":["api-v1-workflows"],"summary":"V1 List Workflows","operationId":"v1_list_workflows_api_v1_workflows_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-workflows"],"summary":"V1 Create Workflow","description":"Crea una automatización VACÍA y en borrador (`status='draft'`, `activo=False`).\n\nEl lienzo se llena después con PUT (`graph`/`triggers`), y publicar es un\nacto aparte que valida. La zona horaria sale de la SUBCUENTA, no de un\ndefault escrito a mano: la ventana de horario hábil de un cliente de otro\npaís correría con el reloj equivocado.","operationId":"v1_create_workflow_api_v1_workflows_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/workflows/catalog":{"get":{"tags":["api-v1-workflows"],"summary":"V1 Workflow Catalog","description":"Catálogo de lo que se puede poner en un lienzo: activadores, acciones y\npasos de lógica, cada uno con su identificador interno y el schema de su\nconfig (claves, tipo, y cuáles son requeridas).\n\nEs la referencia para armar un `graph` a mano: los `type`/`subtype` de acá\nson los que el motor matchea por igualdad exacta, y cualquier otro string se\nguarda pero no se ejecuta nunca.\n\nTrae además lo que no vive en el catálogo y sin lo cual no se puede escribir\nun `if_else` ni un filtro: los operadores válidos y los espacios de nombres\nde los campos. Y dos avisos: los `alias` (dos identificadores para el mismo\npaso) y los `pasos_simulados`, que dan verde sin hacer nada.\n\nCompleto son ~28 KB, que en un cliente con contexto ajustado es caro para\nresolver una duda sobre un paso. `grupo` (triggers|actions|logic) y `tipo`\n(un identificador exacto) lo recortan; `reglas`, `alias` y\n`pasos_simulados` van SIEMPRE, porque son chicos y son justo lo que uno no\nsabe que tiene que preguntar.","operationId":"v1_workflow_catalog_api_v1_workflows_catalog_get","parameters":[{"name":"grupo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grupo"}},{"name":"tipo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/merge-fields":{"get":{"tags":["api-v1-workflows"],"summary":"V1 Workflow Merge Fields","description":"Los merge tags `{{...}}` que se pueden usar en la config de los pasos:\nestándar del contacto y del negocio, más los campos personalizados de ESTA\nsubcuenta.\n\nMismo catálogo que ofrece el selector de variables de la interfaz. Lo que\nNO está acá se renderiza vacío.","operationId":"v1_workflow_merge_fields_api_v1_workflows_merge_fields_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"objeto","in":"query","required":false,"schema":{"type":"string","default":"contact","title":"Objeto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/validate":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Validate Workflow","description":"Dry-run: analiza un grafo y NO escribe nada.\n\nDos formas de llamarlo: con `workflow_id` (analiza el borrador guardado) o\ncon `graph` + `triggers` sueltos (analiza algo que todavía no se guardó).\n\nDevuelve `errores` —lo que impide publicar— y `advertencias`, que son los\npasos que se publican igual y no van a hacer lo que parece: claves\nrequeridas ausentes, campos que el paso no lee (un `to_stage_id` donde va\n`stage_id`), activadores que la plataforma no emite, y pasos simulados.","operationId":"v1_validate_workflow_api_v1_workflows_validate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/workflows/{wf_id}":{"get":{"tags":["api-v1-workflows"],"summary":"V1 Get Workflow","operationId":"v1_get_workflow_api_v1_workflows__wf_id__get","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["api-v1-workflows"],"summary":"V1 Update Workflow","description":"Edita la automatización. Campos: nombre, descripcion, graph, triggers,\nsettings, folder_id. REEMPLAZA la columna completa, no mergea.\n\nSi el workflow está PUBLICADO y cambia el contenido, se re-publica en\ncaliente (paridad con la interfaz). Un grafo inválido a mitad de edición se\nguarda como borrador pero NO sale a producción: la respuesta trae\n`errores_publicacion` y la publicación vigente sigue intacta.","operationId":"v1_update_workflow_api_v1_workflows__wf_id__put","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-workflows"],"summary":"V1 Delete Workflow","description":"Elimina la automatización. Los enrollments en vuelo se CANCELAN primero:\nborrar el workflow y dejarlos activos deja filas apuntando a la nada, y el\nmotor las recoge en la próxima pasada.","operationId":"v1_delete_workflow_api_v1_workflows__wf_id__delete","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/enrollments":{"get":{"tags":["api-v1-workflows"],"summary":"V1 List Enrollments","operationId":"v1_list_enrollments_api_v1_workflows__wf_id__enrollments_get","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/enroll":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Enroll","description":"Inscribe un contacto en el workflow (vía outbox, idempotente). Body: contacto_id, cliente_id?.","operationId":"v1_enroll_api_v1_workflows__wf_id__enroll_post","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/duplicate":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Duplicate Workflow","description":"Duplica la automatización. La copia nace en borrador y apagada.","operationId":"v1_duplicate_workflow_api_v1_workflows__wf_id__duplicate_post","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/publish":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Publish Workflow","description":"PUBLICA la automatización: valida el grafo, congela la versión que va a\ncorrer y registra los disparadores. Desde acá el workflow actúa sobre\ncontactos reales.\n\nUn grafo inválido responde 400 con la lista de errores y NO publica nada.","operationId":"v1_publish_workflow_api_v1_workflows__wf_id__publish_post","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/unpublish":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Unpublish Workflow","description":"Despublica: vuelve a borrador y da de baja los disparadores registrados.\nDeja de entrar gente nueva.","operationId":"v1_unpublish_workflow_api_v1_workflows__wf_id__unpublish_post","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/pause":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Pause Workflow","description":"Pausa la automatización (`status='paused'`).","operationId":"v1_pause_workflow_api_v1_workflows__wf_id__pause_post","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workflows/{wf_id}/resume":{"post":{"tags":["api-v1-workflows"],"summary":"V1 Resume Workflow","description":"Reanuda: vuelve a 'published' solo si había una versión publicada; si no,\na 'draft'. Reanudar NO puede publicar por la puerta de atrás algo que nunca\nse publicó.","operationId":"v1_resume_workflow_api_v1_workflows__wf_id__resume_post","parameters":[{"name":"wf_id","in":"path","required":true,"schema":{"type":"integer","title":"Wf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/properties":{"get":{"tags":["api-v1-propiedades"],"summary":"V1 List Properties","description":"Lista campos personalizados por `objeto` (contact/company/opportunity/appointment/\nproduct/quote/co:<key>).","operationId":"v1_list_properties_api_v1_properties_get","parameters":[{"name":"objeto","in":"query","required":false,"schema":{"type":"string","default":"contact","title":"Objeto"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-propiedades"],"summary":"V1 Create Property","description":"Crea un campo personalizado. Body: label, tipo, objeto?, nombre?, opciones?, obligatorio?, ...","operationId":"v1_create_property_api_v1_properties_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/properties/{cf_id}":{"get":{"tags":["api-v1-propiedades"],"summary":"V1 Get Property","operationId":"v1_get_property_api_v1_properties__cf_id__get","parameters":[{"name":"cf_id","in":"path","required":true,"schema":{"type":"integer","title":"Cf Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-propiedades"],"summary":"V1 Update Property","description":"Modifica un campo personalizado.\n\n`objeto` NO es editable: mover una propiedad de `contact` a `opportunity`\ndejaría sus datos huérfanos en el JSON del objeto viejo.\n\nRenombrar (`nombre`) es lo delicado: si la clave está en uso responde 409 con\nla lista de usos. Para hacerlo igual, mandá `confirmar_rename: true` —\ny despues hay que actualizar esos usos a mano, porque el rename NO los\nreescribe (tampoco lo hace la interfaz).","operationId":"v1_update_property_api_v1_properties__cf_id__patch","parameters":[{"name":"cf_id","in":"path","required":true,"schema":{"type":"integer","title":"Cf Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-propiedades"],"summary":"V1 Delete Property","description":"Elimina un campo personalizado.\n\nSi la clave está EN USO responde 409 con la lista; para borrarlo igual,\n`confirmar=true`. Con `borrar_data=true` además se quita la clave del JSON\nde todos los contactos de la subcuenta (irreversible: se pierden los valores).\nSin él, los valores quedan guardados y vuelven a aparecer si alguien recrea\nla propiedad con el mismo nombre.","operationId":"v1_delete_property_api_v1_properties__cf_id__delete","parameters":[{"name":"cf_id","in":"path","required":true,"schema":{"type":"integer","title":"Cf Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"confirmar","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Confirmar"}},{"name":"borrar_data","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Borrar Data"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-objects":{"get":{"tags":["api-v1-custom-objects"],"summary":"V1 List Custom Objects","operationId":"v1_list_custom_objects_api_v1_custom_objects_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-objects/{co_id}":{"get":{"tags":["api-v1-custom-objects"],"summary":"V1 Get Custom Object","operationId":"v1_get_custom_object_api_v1_custom_objects__co_id__get","parameters":[{"name":"co_id","in":"path","required":true,"schema":{"type":"integer","title":"Co Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/custom-objects/{co_id}/records":{"get":{"tags":["api-v1-custom-objects"],"summary":"V1 List Records","operationId":"v1_list_records_api_v1_custom_objects__co_id__records_get","parameters":[{"name":"co_id","in":"path","required":true,"schema":{"type":"integer","title":"Co Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-custom-objects"],"summary":"V1 Create Record","description":"Crea un record del objeto. Body: valores (dict), cliente_id?.","operationId":"v1_create_record_api_v1_custom_objects__co_id__records_post","parameters":[{"name":"co_id","in":"path","required":true,"schema":{"type":"integer","title":"Co Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/whatsapp/numbers":{"get":{"tags":["api-v1-whatsapp"],"summary":"V1 List Numbers","operationId":"v1_list_numbers_api_v1_whatsapp_numbers_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/whatsapp/templates":{"get":{"tags":["api-v1-whatsapp"],"summary":"V1 List Templates","operationId":"v1_list_templates_api_v1_whatsapp_templates_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"approved","title":"Estado"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/whatsapp/send-template":{"post":{"tags":["api-v1-whatsapp"],"summary":"V1 Send Template","description":"Envía una plantilla a un contacto. Body: contacto_id, template_name, variables?, idioma?, marca_id?, cliente_id?.","operationId":"v1_send_template_api_v1_whatsapp_send_template_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/email/campaigns":{"get":{"tags":["api-v1-email"],"summary":"V1 List Campaigns","operationId":"v1_list_campaigns_api_v1_email_campaigns_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/campaigns/{campaign_id}":{"get":{"tags":["api-v1-email"],"summary":"V1 Get Campaign","operationId":"v1_get_campaign_api_v1_email_campaigns__campaign_id__get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/email/templates":{"get":{"tags":["api-v1-email"],"summary":"V1 List Templates","operationId":"v1_list_templates_api_v1_email_templates_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"incluir_globales","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Incluir Globales"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grillo/projects":{"get":{"tags":["api-v1-grillo"],"summary":"V1 List Projects","operationId":"v1_list_projects_api_v1_grillo_projects_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grillo/projects/{project_id}/posts":{"get":{"tags":["api-v1-grillo"],"summary":"V1 List Posts","operationId":"v1_list_posts_api_v1_grillo_projects__project_id__posts_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-grillo"],"summary":"V1 Create Post","operationId":"v1_create_post_api_v1_grillo_projects__project_id__posts_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grillo/posts/{post_id}":{"get":{"tags":["api-v1-grillo"],"summary":"V1 Get Post","operationId":"v1_get_post_api_v1_grillo_posts__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-grillo"],"summary":"V1 Update Post","operationId":"v1_update_post_api_v1_grillo_posts__post_id__patch","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grillo/posts/{post_id}/status":{"post":{"tags":["api-v1-grillo"],"summary":"V1 Change Post Status","operationId":"v1_change_post_status_api_v1_grillo_posts__post_id__status_post","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grillo/projects/{project_id}/posts/bulk":{"post":{"tags":["api-v1-grillo"],"summary":"V1 Create Posts Bulk","description":"Crea VARIOS posts de una vez. Pensado para cargar el mes de un cliente.\n\nExiste porque un mes son ~30 posts y una llamada por post significa 30\nviajes: lento, caro, y si el proceso se corta a la mitad quedan 14 creados y\n16 no, sin que nadie sepa cuáles.\n\nPARCIAL A PROPÓSITO, y por eso responde 207: cada post se valida y se guarda\npor separado, y la respuesta dice qué entró y qué no, con el índice y el\nmotivo de cada rechazo. La alternativa —abortar todo por un `platform` mal\nescrito en el post 19— obligaría a rehacer el mes entero para arreglar una\nlínea. Un lote que falla ENTERO se distingue igual: `creados` viene vacío.\n\nCada elemento acepta lo mismo que el alta de a uno. Tope de 60 por llamada:\ndos meses de contenido diario, y evita que un pedido armado mal deje la\npetición colgada.","operationId":"v1_create_posts_bulk_api_v1_grillo_projects__project_id__posts_bulk_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"207":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/quotes":{"get":{"tags":["api-v1-cotizaciones"],"summary":"V1 List Quotes","operationId":"v1_list_quotes_api_v1_quotes_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/quotes/{quote_id}":{"get":{"tags":["api-v1-cotizaciones"],"summary":"V1 Get Quote","operationId":"v1_get_quote_api_v1_quotes__quote_id__get","parameters":[{"name":"quote_id","in":"path","required":true,"schema":{"type":"integer","title":"Quote Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reports":{"get":{"tags":["api-v1-informes"],"summary":"V1 List Reports","operationId":"v1_list_reports_api_v1_reports_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"estado","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estado"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/reports/{report_id}":{"get":{"tags":["api-v1-informes"],"summary":"V1 Get Report","operationId":"v1_get_report_api_v1_reports__report_id__get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"integer","title":"Report Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai-agents":{"get":{"tags":["api-v1-ai-agents"],"summary":"V1 List Agents","operationId":"v1_list_agents_api_v1_ai_agents_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"tipo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"}},{"name":"activo","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Activo"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-ai-agents"],"summary":"V1 Create Agent","description":"Crea un agente. Nace APAGADO (`activo=False`, `modo='apagado'`), igual\nque en la interfaz: encenderlo es un acto aparte (`/deploy`) que valida.","operationId":"v1_create_agent_api_v1_ai_agents_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ai-agents/{agent_id}":{"get":{"tags":["api-v1-ai-agents"],"summary":"V1 Get Agent","operationId":"v1_get_agent_api_v1_ai_agents__agent_id__get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-ai-agents"],"summary":"V1 Update Agent","operationId":"v1_update_agent_api_v1_ai_agents__agent_id__patch","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-ai-agents"],"summary":"V1 Delete Agent","description":"Borrado DURO (la tabla no tiene papelera), igual que la interfaz.","operationId":"v1_delete_agent_api_v1_ai_agents__agent_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai-agents/{agent_id}/duplicate":{"post":{"tags":["api-v1-ai-agents"],"summary":"V1 Duplicate Agent","operationId":"v1_duplicate_agent_api_v1_ai_agents__agent_id__duplicate_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai-agents/{agent_id}/deploy":{"post":{"tags":["api-v1-ai-agents"],"summary":"V1 Deploy Agent","description":"Prende o apaga el agente (`{\"activo\": true|false}`). Prender ES publicar:\nes el momento en que empieza a hablarle a clientes, así que valida primero.","operationId":"v1_deploy_agent_api_v1_ai_agents__agent_id__deploy_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai-agents/{agent_id}/publicar":{"post":{"tags":["api-v1-ai-agents"],"summary":"V1 Publicar Agent","description":"Empuja el borrador a producción sin tocar el interruptor.","operationId":"v1_publicar_agent_api_v1_ai_agents__agent_id__publicar_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai-agents/{agent_id}/principal":{"post":{"tags":["api-v1-ai-agents"],"summary":"V1 Set Principal","description":"Marca/desmarca el agente principal de la subcuenta (máximo 1: des-marca\nal anterior en la misma transacción). El principal responde automático los\nmensajes entrantes de conversaciones sin agente asignado.","operationId":"v1_set_principal_api_v1_ai_agents__agent_id__principal_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/events":{"get":{"tags":["api-v1-webhooks"],"summary":"Webhooks Catalogo","description":"Los tipos de evento a los que se puede suscribir un endpoint.","operationId":"webhooks_catalogo_api_v1_webhooks_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/endpoints":{"get":{"tags":["api-v1-webhooks"],"summary":"Endpoints List","operationId":"endpoints_list_api_v1_webhooks_endpoints_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-webhooks"],"summary":"Endpoints Create","operationId":"endpoints_create_api_v1_webhooks_endpoints_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/webhooks/endpoints/{endpoint_id}":{"get":{"tags":["api-v1-webhooks"],"summary":"Endpoints Get","operationId":"endpoints_get_api_v1_webhooks_endpoints__endpoint_id__get","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"integer","title":"Endpoint Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-v1-webhooks"],"summary":"Endpoints Update","operationId":"endpoints_update_api_v1_webhooks_endpoints__endpoint_id__patch","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"integer","title":"Endpoint Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-webhooks"],"summary":"Endpoints Delete","operationId":"endpoints_delete_api_v1_webhooks_endpoints__endpoint_id__delete","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"integer","title":"Endpoint Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/endpoints/{endpoint_id}/rotate-secret":{"post":{"tags":["api-v1-webhooks"],"summary":"Endpoints Rotar","description":"Emite un secreto nuevo dejando el anterior valido 24 h.\n\nDurante el traslape cada entrega viaja con DOS cabeceras de firma\n(`X-Hapee-Signature` con el nuevo y `X-Hapee-Signature-Previous` con el\nviejo). Sin eso, el cliente tendria que cambiar el secreto en el mismo\ninstante que nosotros y todo evento en vuelo en esa ventana le llegaria con\nuna firma que no valida — o sea que rotar exigiria una caida coordinada.","operationId":"endpoints_rotar_api_v1_webhooks_endpoints__endpoint_id__rotate_secret_post","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"integer","title":"Endpoint Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/endpoints/{endpoint_id}/ping":{"post":{"tags":["api-v1-webhooks"],"summary":"Endpoints Ping","description":"Emite un `webhook.test` real por el camino real. Ver nota 4 del encabezado.","operationId":"endpoints_ping_api_v1_webhooks_endpoints__endpoint_id__ping_post","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"integer","title":"Endpoint Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/deliveries":{"get":{"tags":["api-v1-webhooks"],"summary":"Deliveries List","description":"Entregas de esta subcuenta, mas nuevas primero.\n\nEl filtro por `cliente_id` NO es opcional aunque el parametro lo sea: sale\nde la credencial. Un job sin `cliente_id` (los de formulario, anteriores a\nesto) queda fuera por construccion, que es lo correcto — no son de la API.","operationId":"deliveries_list_api_v1_webhooks_deliveries_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"endpoint_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Endpoint Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/deliveries/{delivery_id}":{"get":{"tags":["api-v1-webhooks"],"summary":"Deliveries Get","operationId":"deliveries_get_api_v1_webhooks_deliveries__delivery_id__get","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/deliveries/{delivery_id}/redeliver":{"post":{"tags":["api-v1-webhooks"],"summary":"Deliveries Redeliver","description":"Vuelve a encolar el MISMO cuerpo. Clona, no reabre (nota 3 del encabezado).","operationId":"deliveries_redeliver_api_v1_webhooks_deliveries__delivery_id__redeliver_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me":{"get":{"tags":["api-v1-integracion"],"summary":"Me","description":"Identidad y limites de la credencial que hace la llamada.\n\nEs el primer request de toda integracion: confirma que la key sirve, contra\nque subcuenta opera y en que modo. **No expone nada de la key salvo su\nprefijo**: ni el hash, ni el token, ni a quien pertenece si es de servicio.","operationId":"me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/events":{"get":{"tags":["api-v1-integracion"],"summary":"Events List","description":"Eventos de la subcuenta, del mas VIEJO al mas nuevo.\n\nEl orden ascendente es a proposito y es lo contrario de casi todo listado de\nesta API: quien consume esto esta poniendose al dia, y para eso hay que\navanzar en el orden en que ocurrieron las cosas. Con orden descendente, un\nconsumidor que arranca de cero procesaria la venta antes que el contacto.","operationId":"events_list_api_v1_events_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs":{"get":{"tags":["api-v1-integracion"],"summary":"Jobs List","operationId":"jobs_list_api_v1_jobs_get","parameters":[{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}":{"get":{"tags":["api-v1-integracion"],"summary":"Jobs Get","description":"Estado del trabajo y, cuando termino, el resultado POR ITEM.","operationId":"jobs_get_api_v1_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/batch":{"post":{"tags":["api-v1-batch"],"summary":"Batch Contacts","description":"Carga o actualiza hasta 100 contactos en una llamada.","operationId":"batch_contacts_api_v1_contacts_batch_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/companies/batch":{"post":{"tags":["api-v1-batch"],"summary":"Batch Companies","description":"Carga o actualiza hasta 100 empresas en una llamada.","operationId":"batch_companies_api_v1_companies_batch_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contacts/{contacto_id}/notes":{"get":{"tags":["api-v1-notas-tareas"],"summary":"Notas List","description":"Notas del contacto. Las fijadas primero, despues por fecha descendente.","operationId":"notas_list_api_v1_contacts__contacto_id__notes_get","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-notas-tareas"],"summary":"Notas Create","operationId":"notas_create_api_v1_contacts__contacto_id__notes_post","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{contacto_id}/notes/{nota_id}":{"patch":{"tags":["api-v1-notas-tareas"],"summary":"Notas Update","operationId":"notas_update_api_v1_contacts__contacto_id__notes__nota_id__patch","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"nota_id","in":"path","required":true,"schema":{"type":"integer","title":"Nota Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-notas-tareas"],"summary":"Notas Delete","operationId":"notas_delete_api_v1_contacts__contacto_id__notes__nota_id__delete","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"nota_id","in":"path","required":true,"schema":{"type":"integer","title":"Nota Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{contacto_id}/tasks":{"get":{"tags":["api-v1-notas-tareas"],"summary":"Tareas List","operationId":"tareas_list_api_v1_contacts__contacto_id__tasks_get","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-v1-notas-tareas"],"summary":"Tareas Create","operationId":"tareas_create_api_v1_contacts__contacto_id__tasks_post","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contacts/{contacto_id}/tasks/{tarea_id}":{"patch":{"tags":["api-v1-notas-tareas"],"summary":"Tareas Update","operationId":"tareas_update_api_v1_contacts__contacto_id__tasks__tarea_id__patch","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"tarea_id","in":"path","required":true,"schema":{"type":"integer","title":"Tarea Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-v1-notas-tareas"],"summary":"Tareas Delete","operationId":"tareas_delete_api_v1_contacts__contacto_id__tasks__tarea_id__delete","parameters":[{"name":"contacto_id","in":"path","required":true,"schema":{"type":"integer","title":"Contacto Id"}},{"name":"tarea_id","in":"path","required":true,"schema":{"type":"integer","title":"Tarea Id"}},{"name":"cliente_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cliente Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"webhooks":{"appointment.cancelled":{"post":{"summary":"La cita se cancelo","description":"Se envia a cada endpoint suscrito a `appointment.cancelled`.\n\n**Cabeceras**: `X-Hapee-Event: appointment.cancelled`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_appointment_cancelled","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"appointment.created":{"post":{"summary":"Se agendo una cita","description":"Se envia a cada endpoint suscrito a `appointment.created`.\n\n**Cabeceras**: `X-Hapee-Event: appointment.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_appointment_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"appointment.updated":{"post":{"summary":"La cita se reagendo o cambio","description":"Se envia a cada endpoint suscrito a `appointment.updated`.\n\n**Cabeceras**: `X-Hapee-Event: appointment.updated`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_appointment_updated","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"company.archived":{"post":{"summary":"La empresa se archivo","description":"Se envia a cada endpoint suscrito a `company.archived`.\n\n**Cabeceras**: `X-Hapee-Event: company.archived`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_company_archived","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"company.created":{"post":{"summary":"Se creo una empresa","description":"Se envia a cada endpoint suscrito a `company.created`.\n\n**Cabeceras**: `X-Hapee-Event: company.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_company_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"company.updated":{"post":{"summary":"Cambio algun dato de la empresa","description":"Se envia a cada endpoint suscrito a `company.updated`.\n\n**Cabeceras**: `X-Hapee-Event: company.updated`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_company_updated","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"contact.created":{"post":{"summary":"Se creo un contacto","description":"Se envia a cada endpoint suscrito a `contact.created`.\n\n**Cabeceras**: `X-Hapee-Event: contact.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_contact_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"contact.deleted":{"post":{"summary":"El contacto paso a la papelera","description":"Se envia a cada endpoint suscrito a `contact.deleted`.\n\n**Cabeceras**: `X-Hapee-Event: contact.deleted`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_contact_deleted","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"contact.tag_added":{"post":{"summary":"Se le agrego una etiqueta","description":"Se envia a cada endpoint suscrito a `contact.tag_added`.\n\n**Cabeceras**: `X-Hapee-Event: contact.tag_added`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_contact_tag_added","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"contact.tag_removed":{"post":{"summary":"Se le quito una etiqueta","description":"Se envia a cada endpoint suscrito a `contact.tag_removed`.\n\n**Cabeceras**: `X-Hapee-Event: contact.tag_removed`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_contact_tag_removed","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"contact.updated":{"post":{"summary":"Cambio algun dato del contacto","description":"Se envia a cada endpoint suscrito a `contact.updated`.\n\n**Cabeceras**: `X-Hapee-Event: contact.updated`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_contact_updated","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"custom_object.record.created":{"post":{"summary":"Se creo un registro","description":"Se envia a cada endpoint suscrito a `custom_object.record.created`.\n\n**Cabeceras**: `X-Hapee-Event: custom_object.record.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_custom_object_record_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"custom_object.record.deleted":{"post":{"summary":"Se elimino un registro","description":"Se envia a cada endpoint suscrito a `custom_object.record.deleted`.\n\n**Cabeceras**: `X-Hapee-Event: custom_object.record.deleted`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_custom_object_record_deleted","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"custom_object.record.updated":{"post":{"summary":"Cambio un registro","description":"Se envia a cada endpoint suscrito a `custom_object.record.updated`.\n\n**Cabeceras**: `X-Hapee-Event: custom_object.record.updated`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_custom_object_record_updated","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"deal.created":{"post":{"summary":"Se creo un negocio","description":"Se envia a cada endpoint suscrito a `deal.created`.\n\n**Cabeceras**: `X-Hapee-Event: deal.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_deal_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"deal.deleted":{"post":{"summary":"El negocio se elimino","description":"Se envia a cada endpoint suscrito a `deal.deleted`.\n\n**Cabeceras**: `X-Hapee-Event: deal.deleted`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_deal_deleted","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"deal.lost":{"post":{"summary":"El negocio se marco como perdido","description":"Se envia a cada endpoint suscrito a `deal.lost`.\n\n**Cabeceras**: `X-Hapee-Event: deal.lost`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_deal_lost","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"deal.stage_changed":{"post":{"summary":"El negocio cambio de etapa","description":"Se envia a cada endpoint suscrito a `deal.stage_changed`.\n\n**Cabeceras**: `X-Hapee-Event: deal.stage_changed`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_deal_stage_changed","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"deal.updated":{"post":{"summary":"Cambio algun dato del negocio","description":"Se envia a cada endpoint suscrito a `deal.updated`.\n\n**Cabeceras**: `X-Hapee-Event: deal.updated`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_deal_updated","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"deal.won":{"post":{"summary":"El negocio se marco como ganado","description":"Se envia a cada endpoint suscrito a `deal.won`.\n\n**Cabeceras**: `X-Hapee-Event: deal.won`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_deal_won","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"form.submitted":{"post":{"summary":"Se envio un formulario","description":"Se envia a cada endpoint suscrito a `form.submitted`.\n\n**Cabeceras**: `X-Hapee-Event: form.submitted`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_form_submitted","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"invoice.overdue":{"post":{"summary":"El documento vencio impago","description":"Se envia a cada endpoint suscrito a `invoice.overdue`.\n\n**Cabeceras**: `X-Hapee-Event: invoice.overdue`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_invoice_overdue","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"invoice.paid":{"post":{"summary":"El documento se pago","description":"Se envia a cada endpoint suscrito a `invoice.paid`.\n\n**Cabeceras**: `X-Hapee-Event: invoice.paid`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_invoice_paid","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"invoice.sent":{"post":{"summary":"Se emitio un documento de cobro","description":"Se envia a cada endpoint suscrito a `invoice.sent`.\n\n**Cabeceras**: `X-Hapee-Event: invoice.sent`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_invoice_sent","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"payment.received":{"post":{"summary":"Se recibio un pago","description":"Se envia a cada endpoint suscrito a `payment.received`.\n\n**Cabeceras**: `X-Hapee-Event: payment.received`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_payment_received","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"product.archived":{"post":{"summary":"El producto se archivo","description":"Se envia a cada endpoint suscrito a `product.archived`.\n\n**Cabeceras**: `X-Hapee-Event: product.archived`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_product_archived","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"product.created":{"post":{"summary":"Se creo un producto","description":"Se envia a cada endpoint suscrito a `product.created`.\n\n**Cabeceras**: `X-Hapee-Event: product.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_product_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"product.updated":{"post":{"summary":"Cambio algun dato del producto","description":"Se envia a cada endpoint suscrito a `product.updated`.\n\n**Cabeceras**: `X-Hapee-Event: product.updated`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_product_updated","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"quote.accepted":{"post":{"summary":"La cotizacion fue aceptada","description":"Se envia a cada endpoint suscrito a `quote.accepted`.\n\n**Cabeceras**: `X-Hapee-Event: quote.accepted`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_quote_accepted","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"quote.created":{"post":{"summary":"Se creo una cotizacion","description":"Se envia a cada endpoint suscrito a `quote.created`.\n\n**Cabeceras**: `X-Hapee-Event: quote.created`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_quote_created","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"quote.rejected":{"post":{"summary":"La cotizacion fue rechazada","description":"Se envia a cada endpoint suscrito a `quote.rejected`.\n\n**Cabeceras**: `X-Hapee-Event: quote.rejected`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_quote_rejected","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"quote.sent":{"post":{"summary":"La cotizacion se emitio y envio","description":"Se envia a cada endpoint suscrito a `quote.sent`.\n\n**Cabeceras**: `X-Hapee-Event: quote.sent`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_quote_sent","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"quote.viewed":{"post":{"summary":"El destinatario abrio la cotizacion","description":"Se envia a cada endpoint suscrito a `quote.viewed`.\n\n**Cabeceras**: `X-Hapee-Event: quote.viewed`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_quote_viewed","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"refund.issued":{"post":{"summary":"Se emitio una devolucion","description":"Se envia a cada endpoint suscrito a `refund.issued`.\n\n**Cabeceras**: `X-Hapee-Event: refund.issued`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_refund_issued","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}},"webhook.test":{"post":{"summary":"Evento de prueba disparado desde el panel","description":"Se envia a cada endpoint suscrito a `webhook.test`.\n\n**Cabeceras**: `X-Hapee-Event: webhook.test`, `X-Hapee-Delivery` (id de la entrega) y `X-Hapee-Signature: t=<unix>,v1=<hmac>`.\n\n**Responde 2xx** para confirmar. Cualquier otra cosa se reintenta con espera creciente hasta ~24 h.\n\nEl **orden no esta garantizado** y una entrega puede repetirse: deduplica por el `id` del evento.","operationId":"webhook_webhook_test","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","api_version","created_at","subaccount_id","data"],"properties":{"id":{"type":"string","example":"evt_10432","description":"Unico y monotono. Usalo para deduplicar."},"type":{"type":"string","example":"contact.created"},"api_version":{"type":"string","example":"v1"},"created_at":{"type":"string","format":"date-time"},"subaccount_id":{"type":"integer","example":63},"data":{"type":"object","description":"El objeto completo, con la MISMA forma que devuelve el GET de ese recurso."},"previous":{"type":"object","description":"Solo en eventos de actualizacion: los campos que cambiaron."}}}}}},"responses":{"200":{"description":"Recibido. Cualquier 2xx sirve."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Credencial de la subcuenta. `hp_live_...` opera sobre datos reales; `hp_test_...` solo sobre una subcuenta marcada como sandbox. Se muestra UNA sola vez al emitirla."}},"schemas":{"Body_activar_cuenta_submit_cuenta_activar__token__post":{"properties":{"password":{"type":"string","title":"Password","default":""},"password2":{"type":"string","title":"Password2","default":""}},"type":"object","title":"Body_activar_cuenta_submit_cuenta_activar__token__post"},"Body_activar_submit_mfa_activar_post":{"properties":{"codigo":{"type":"string","title":"Codigo","default":""}},"type":"object","title":"Body_activar_submit_mfa_activar_post"},"Body_admin_calendar_connection_scope_usuarios__user_id__calendar_connections__conn_id__scope_post":{"properties":{"cliente_id":{"type":"string","title":"Cliente Id","default":""}},"type":"object","title":"Body_admin_calendar_connection_scope_usuarios__user_id__calendar_connections__conn_id__scope_post"},"Body_api_subir_archivo_claudio_api_archivo_post":{"properties":{"conversacion_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversacion Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_api_subir_archivo_claudio_api_archivo_post"},"Body_api_upload_chat_file_api_chat_rooms__room_id__upload_post":{"properties":{"archivo":{"type":"string","contentMediaType":"application/octet-stream","title":"Archivo"}},"type":"object","required":["archivo"],"title":"Body_api_upload_chat_file_api_chat_rooms__room_id__upload_post"},"Body_api_upload_logo_grillo_api_proyecto__project_id__logo_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_api_upload_logo_grillo_api_proyecto__project_id__logo_post"},"Body_api_upload_media_grillo_api_post__post_id__upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_api_upload_media_grillo_api_post__post_id__upload_post"},"Body_api_upload_multiple_media_grillo_api_post__post_id__upload_multiple_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_api_upload_multiple_media_grillo_api_post__post_id__upload_multiple_post"},"Body_archivar_usuario_usuarios__user_id__archivar_post":{"properties":{"fecha_salida":{"type":"string","title":"Fecha Salida","default":""}},"type":"object","title":"Body_archivar_usuario_usuarios__user_id__archivar_post"},"Body_conectar_configuracion_integraciones_zentru_conectar_post":{"properties":{"cliente_id":{"type":"integer","title":"Cliente Id"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"}},"type":"object","required":["cliente_id"],"title":"Body_conectar_configuracion_integraciones_zentru_conectar_post"},"Body_crear_equipo_usuarios_nuevo_equipo_post":{"properties":{"email":{"type":"string","title":"Email"},"nombre":{"type":"string","title":"Nombre"},"password":{"type":"string","title":"Password","default":""},"rol":{"type":"string","title":"Rol","default":"agency_staff"},"clientes_asignados":{"items":{"type":"integer"},"type":"array","title":"Clientes Asignados","default":[]},"department":{"type":"string","title":"Department","default":""},"position":{"type":"string","title":"Position","default":""},"weekly_hours":{"type":"string","title":"Weekly Hours","default":"40"},"cost_allocation_method":{"type":"string","title":"Cost Allocation Method","default":"time_logged"}},"type":"object","required":["email","nombre"],"title":"Body_crear_equipo_usuarios_nuevo_equipo_post"},"Body_crear_usuario_cliente_usuarios_nuevo_cliente_post":{"properties":{"email":{"type":"string","title":"Email"},"nombre":{"type":"string","title":"Nombre"},"password":{"type":"string","title":"Password","default":""},"rol":{"type":"string","title":"Rol","default":"client_admin"},"cliente_id":{"type":"string","title":"Cliente Id","default":""}},"type":"object","required":["email","nombre"],"title":"Body_crear_usuario_cliente_usuarios_nuevo_cliente_post"},"Body_crear_usuario_usuarios_nuevo_post":{"properties":{"email":{"type":"string","title":"Email"},"nombre":{"type":"string","title":"Nombre"},"password":{"type":"string","title":"Password","default":""},"rol":{"type":"string","title":"Rol","default":"usuario"},"cliente_id":{"type":"string","title":"Cliente Id","default":""},"clientes_asignados":{"items":{"type":"integer"},"type":"array","title":"Clientes Asignados","default":[]},"department":{"type":"string","title":"Department","default":""},"position":{"type":"string","title":"Position","default":""},"weekly_hours":{"type":"string","title":"Weekly Hours","default":"40"},"cost_allocation_method":{"type":"string","title":"Cost Allocation Method","default":"time_logged"},"fecha_incorporacion":{"type":"string","title":"Fecha Incorporacion","default":""}},"type":"object","required":["email","nombre"],"title":"Body_crear_usuario_usuarios_nuevo_post"},"Body_desactivar_mfa_desactivar_post":{"properties":{"codigo":{"type":"string","title":"Codigo","default":""}},"type":"object","title":"Body_desactivar_mfa_desactivar_post"},"Body_desconectar_clientes__cliente_id_num__integraciones_desconectar_post":{"properties":{"plataforma_key":{"type":"string","title":"Plataforma Key"}},"type":"object","required":["plataforma_key"],"title":"Body_desconectar_clientes__cliente_id_num__integraciones_desconectar_post"},"Body_desconectar_configuracion_integraciones_zentru_desconectar_post":{"properties":{"cliente_id":{"type":"integer","title":"Cliente Id"}},"type":"object","required":["cliente_id"],"title":"Body_desconectar_configuracion_integraciones_zentru_desconectar_post"},"Body_editar_usuario_usuarios__user_id__editar_post":{"properties":{"nombre":{"type":"string","title":"Nombre"},"rol":{"type":"string","title":"Rol","default":"usuario"},"activo":{"type":"string","title":"Activo","default":"off"},"password":{"type":"string","title":"Password","default":""},"cliente_id":{"type":"string","title":"Cliente Id","default":""},"clientes_asignados":{"items":{"type":"integer"},"type":"array","title":"Clientes Asignados","default":[]},"department":{"type":"string","title":"Department","default":""},"position":{"type":"string","title":"Position","default":""},"weekly_hours":{"type":"string","title":"Weekly Hours","default":"40"},"cost_allocation_method":{"type":"string","title":"Cost Allocation Method","default":"time_logged"},"fecha_incorporacion":{"type":"string","title":"Fecha Incorporacion","default":""},"fecha_salida":{"type":"string","title":"Fecha Salida","default":""}},"type":"object","required":["nombre"],"title":"Body_editar_usuario_usuarios__user_id__editar_post"},"Body_import_acuity_api_calendars__calendar_id__import_acuity_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_acuity_api_calendars__calendar_id__import_acuity_post"},"Body_import_calendly_api_calendars__calendar_id__import_calendly_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_calendly_api_calendars__calendar_id__import_calendly_post"},"Body_import_ical_endpoint_api_calendars__calendar_id__import_ical_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_ical_endpoint_api_calendars__calendar_id__import_ical_post"},"Body_login_submit_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"Body_login_submit_login_post"},"Body_media_upload_api_media_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"tipo":{"type":"string","title":"Tipo","default":""}},"type":"object","required":["file"],"title":"Body_media_upload_api_media_upload_post"},"Body_mfa_verificar_submit_login_verificar_post":{"properties":{"codigo":{"type":"string","title":"Codigo","default":""}},"type":"object","title":"Body_mfa_verificar_submit_login_verificar_post"},"Body_productos_import_analizar_api_productos_import_analizar_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_productos_import_analizar_api_productos_import_analizar_post"},"Body_productos_import_ejecutar_api_productos_import_ejecutar_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"mapping":{"type":"string","title":"Mapping"}},"type":"object","required":["file","mapping"],"title":"Body_productos_import_ejecutar_api_productos_import_ejecutar_post"},"Body_regenerar_mfa_respaldos_post":{"properties":{"codigo":{"type":"string","title":"Codigo","default":""}},"type":"object","title":"Body_regenerar_mfa_respaldos_post"},"Body_snapshots_import_snapshots_import_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"nombre":{"type":"string","title":"Nombre","default":""},"descripcion":{"type":"string","title":"Descripcion","default":""},"scope":{"type":"string","title":"Scope","default":"agencia"}},"type":"object","required":["file"],"title":"Body_snapshots_import_snapshots_import_post"},"Body_upload_attachment_api_conversations_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_attachment_api_conversations_upload_post"},"Body_upload_deal_document_api_deals__deal_id__documents_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"nombre":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nombre"},"tipo_doc":{"type":"string","title":"Tipo Doc","default":"file"}},"type":"object","required":["file"],"title":"Body_upload_deal_document_api_deals__deal_id__documents_upload_post"},"Body_upload_logo_estrategia_api_upload_logo_post":{"properties":{"strategy_id":{"type":"integer","title":"Strategy Id"},"logo":{"type":"string","contentMediaType":"application/octet-stream","title":"Logo"}},"type":"object","required":["strategy_id","logo"],"title":"Body_upload_logo_estrategia_api_upload_logo_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}