{"openapi":"3.1.0","info":{"title":"Hub Service API","description":"\nHub Service de Blueorange: automatiza el alta y la gestión del ciclo de\nvida de instancias Odoo (estilo odoo.sh) — proyectos, instancias por etapa,\nbuilds y aprovisionamiento en segundo plano.\n","contact":{"name":"Blueorange","url":"https://www.blueorange.com.ar/","email":"odoo@blueorange.com.ar"},"version":"0.1.0"},"paths":{"/metrics":{"get":{"tags":["metrics"],"summary":"Prometheus Metrics","description":"Métricas en formato Prometheus (scrapeadas por el Prometheus interno).","operationId":"prometheus_metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health","description":"Healthcheck liviano para docker-compose y monitoreo.\n\nSolo verifica la conectividad con la base (sin exponer datos). Responde 503\nsi la base no está disponible.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/instances":{"post":{"tags":["api"],"summary":"Create Instance","description":"Aprovisiona una nueva instancia y la encola para su despliegue.","operationId":"create_instance_api_v1_instances_post","security":[{"HTTPBasic":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api"],"summary":"List Instances","description":"Lista instancias (filtros opcionales por etapa y estado).","operationId":"list_instances_api_v1_instances_get","security":[{"HTTPBasic":[]}],"parameters":[{"name":"stage","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage"}},{"name":"status_filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InstanceOut"},"title":"Response List Instances Api V1 Instances Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/instances/{slug}":{"get":{"tags":["api"],"summary":"Get Instance","description":"Devuelve el detalle de una instancia por slug.","operationId":"get_instance_api_v1_instances__slug__get","security":[{"HTTPBasic":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/instances/{slug}/action":{"post":{"tags":["api"],"summary":"Instance Action","description":"Ejecuta una acción (start | restart | stop | rebuild | destroy) sobre la instancia.","operationId":"instance_action_api_v1_instances__slug__action_post","security":[{"HTTPBasic":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceAction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/shell":{"get":{"tags":["shell"],"summary":"Shell Page","description":"Página con la terminal web de la instancia.","operationId":"shell_page_instances__slug__shell_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/logs":{"get":{"tags":["logs"],"summary":"Logs Page","description":"Página del visor de logs.","operationId":"logs_page_instances__slug__logs_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/logs/download":{"get":{"tags":["logs"],"summary":"Logs Download","description":"Descarga los logs (odoo|db) como archivo de texto.","operationId":"logs_download_instances__slug__logs_download_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"odoo","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/git/{project_slug}/{token}":{"post":{"tags":["webhooks"],"summary":"Git Webhook","description":"Dispara auto-deploy ante un push (Bitbucket/GitHub), a nivel proyecto.\n\nEl webhook se configura una sola vez por proyecto. Se valida con el token\ndeterminístico del proyecto. En cada push se extrae la rama y se rebuildean\ntodas las instancias del proyecto cuya rama coincide; las demás se ignoran.","operationId":"git_webhook_webhooks_git__project_slug___token__post","parameters":[{"name":"project_slug","in":"path","required":true,"schema":{"type":"string","title":"Project Slug"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/editor/proxy/{path}":{"put":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["editor"],"summary":"Editor Http Proxy","description":"Proxya una request HTTP al JupyterLab interno, inyectando el token.","operationId":"editor_http_proxy_instances__slug__editor_proxy__path__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/grafana/{path}":{"put":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["infra"],"summary":"Grafana Http Proxy","description":"Proxya Grafana (cualquier usuario autenticado puede ver el monitoreo).","operationId":"grafana_http_proxy_grafana__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mails/{path}":{"put":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["infra"],"summary":"Mailpit Http Proxy","description":"Proxya Mailpit (cualquier usuario autenticado puede ver los mails).","operationId":"mailpit_http_proxy_mails__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"tags":["web"],"summary":"Login Form","operationId":"login_form_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["web"],"summary":"Login Submit","operationId":"login_submit_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_submit_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"get":{"tags":["web"],"summary":"Logout","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["web"],"summary":"Home","description":"La vista principal es el listado de proyectos.","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/projects":{"get":{"tags":["web"],"summary":"Projects List","operationId":"projects_list_projects_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["web"],"summary":"Projects Create","description":"Crea un proyecto. Solo pide el nombre; la config técnica (versión,\nedición, repo, módulos) se define en cada instancia.","operationId":"projects_create_projects_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_projects_create_projects_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{slug}":{"get":{"tags":["web"],"summary":"Project Detail","operationId":"project_detail_projects__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{slug}/delete":{"post":{"tags":["web"],"summary":"Project Delete","description":"Elimina un proyecto y todas sus instancias (con sus stacks y builds).\n\nRequiere que ``confirm_name`` coincida con el nombre del proyecto.","operationId":"project_delete_projects__slug__delete_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_project_delete_projects__slug__delete_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{slug}/repo":{"post":{"tags":["web"],"summary":"Project Set Repo","description":"Configura el repositorio Git del proyecto (lo heredan sus instancias).","operationId":"project_set_repo_projects__slug__repo_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_project_set_repo_projects__slug__repo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{slug}/deploy-key":{"post":{"tags":["web"],"summary":"Project Deploy Key","description":"Genera (o regenera) la deploy key SSH del proyecto.","operationId":"project_deploy_key_projects__slug__deploy_key_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_project_deploy_key_projects__slug__deploy_key_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/projects/{slug}/deploy-key/verify":{"post":{"tags":["web"],"summary":"Project Deploy Key Verify","description":"Verifica el acceso a un repo con la deploy key del proyecto.","operationId":"project_deploy_key_verify_projects__slug__deploy_key_verify_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_project_deploy_key_verify_projects__slug__deploy_key_verify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances":{"get":{"tags":["web"],"summary":"Instances List","operationId":"instances_list_instances_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"stage","in":"query","required":false,"schema":{"type":"string","default":"","title":"Stage"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"version","in":"query","required":false,"schema":{"type":"string","default":"","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["web"],"summary":"Instances Create","operationId":"instances_create_instances_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_instances_create_instances_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/purge":{"post":{"tags":["web"],"summary":"Instances Purge","description":"Purga (borra del todo) las instancias dadas de baja: registros + archivos.","operationId":"instances_purge_instances_purge_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/instances/new":{"get":{"tags":["web"],"summary":"Instance New","description":"Formulario de alta de una instancia.\n\nSoporta sembrar la base desde otra instancia (``clone_from``) o desde un\nbackup (``from_backup``); en esos casos precarga los datos de la fuente.","operationId":"instance_new_instances_new_get","parameters":[{"name":"project","in":"query","required":false,"schema":{"type":"string","default":"","title":"Project"}},{"name":"clone_from","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Clone From"}},{"name":"from_backup","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"From Backup"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/upload":{"get":{"tags":["web"],"summary":"Instance Upload Form","description":"Formulario para crear una instancia a partir de un backup externo subido.","operationId":"instance_upload_form_instances_upload_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["web"],"summary":"Instance Upload Create","description":"Crea una instancia sembrando la base desde el backup subido por el usuario.","operationId":"instance_upload_create_instances_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_instance_upload_create_instances_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}":{"get":{"tags":["web"],"summary":"Instance Detail","operationId":"instance_detail_instances__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/builds/{build_id}/log":{"get":{"tags":["web"],"summary":"Build Log","description":"Muestra la salida de consola de un build puntual.","operationId":"build_log_builds__build_id__log_get","parameters":[{"name":"build_id","in":"path","required":true,"schema":{"type":"integer","title":"Build Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/builds/{build_id}/log.json":{"get":{"tags":["web"],"summary":"Build Log Json","description":"Devuelve el log y el estado del build en JSON, para el tailing en vivo.","operationId":"build_log_json_builds__build_id__log_json_get","parameters":[{"name":"build_id","in":"path","required":true,"schema":{"type":"integer","title":"Build Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/backup":{"post":{"tags":["web"],"summary":"Backup Create","description":"Genera un backup (pg_dump, opcionalmente con filestore) de la instancia.","operationId":"backup_create_instances__slug__backup_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_backup_create_instances__slug__backup_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{instance_id}/backup-schedule":{"post":{"tags":["web"],"summary":"Backup Set Schedule","description":"Configura el backup programado de la instancia.","operationId":"backup_set_schedule_instances__instance_id__backup_schedule_post","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_backup_set_schedule_instances__instance_id__backup_schedule_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/odoo-conf":{"post":{"tags":["web"],"summary":"Instance Set Odoo Conf","description":"Guarda el odoo.conf editable de la instancia (aplica en el próximo rebuild).\n\nSi ``generate`` viene seteado, ignora el textarea y genera el conf por\ndefecto con los valores del cluster compartido.","operationId":"instance_set_odoo_conf_instances__slug__odoo_conf_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_instance_set_odoo_conf_instances__slug__odoo_conf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/backups/{backup_id}/restore":{"post":{"tags":["web"],"summary":"Backup Restore","description":"Restaura un backup en la MISMA instancia (destructivo).","operationId":"backup_restore_backups__backup_id__restore_post","parameters":[{"name":"backup_id","in":"path","required":true,"schema":{"type":"integer","title":"Backup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/backups/{backup_id}/download":{"get":{"tags":["web"],"summary":"Backup Download","description":"Descarga el archivo del backup.","operationId":"backup_download_backups__backup_id__download_get","parameters":[{"name":"backup_id","in":"path","required":true,"schema":{"type":"integer","title":"Backup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/backups/{backup_id}/delete":{"post":{"tags":["web"],"summary":"Backup Delete","description":"Borra un backup (archivo + registro).","operationId":"backup_delete_backups__backup_id__delete_post","parameters":[{"name":"backup_id","in":"path","required":true,"schema":{"type":"integer","title":"Backup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/editor":{"get":{"tags":["web"],"summary":"Instance Editor","description":"Levanta el editor (JupyterLab) de la instancia y muestra el acceso.","operationId":"instance_editor_instances__slug__editor_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/connect":{"get":{"tags":["web"],"summary":"Connect Page","description":"Página para elegir con qué usuario conectarse a la instancia.","operationId":"connect_page_instances__slug__connect_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["web"],"summary":"Connect Submit","description":"Mintea una sesión Odoo para el uid elegido y redirige ya logueado.","operationId":"connect_submit_instances__slug__connect_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_connect_submit_instances__slug__connect_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{instance_id}/action":{"post":{"tags":["web"],"summary":"Instance Action","operationId":"instance_action_instances__instance_id__action_post","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_instance_action_instances__instance_id__action_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{instance_id}/resync":{"post":{"tags":["web"],"summary":"Instance Resync","description":"Reconcilia el estado de la instancia con el contenedor real.","operationId":"instance_resync_instances__instance_id__resync_post","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{slug}/stats":{"get":{"tags":["web"],"summary":"Instance Stats","description":"Uso de recursos del contenedor (para refresco por AJAX).","operationId":"instance_stats_instances__slug__stats_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"}}}}}}},"/instances/{slug}/status.json":{"get":{"tags":["web"],"summary":"Instance Status Json","description":"Estado de la instancia (para refresco en vivo del detalle mientras aprovisiona).","operationId":"instance_status_json_instances__slug__status_json_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"}}}}}}},"/instances/{slug}/monitor":{"get":{"tags":["web"],"summary":"Instance Monitor","description":"Tab de monitoreo: Grafana embebido, filtrado por la instancia.","operationId":"instance_monitor_instances__slug__monitor_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instances/{instance_id}/delete":{"post":{"tags":["web"],"summary":"Instance Delete","description":"Elimina una instancia: baja su stack y borra el registro y sus builds.\n\nRequiere que ``confirm_name`` coincida exactamente con el nombre de la\ninstancia (confirmación tipo \"escribir el nombre para borrar\").","operationId":"instance_delete_instances__instance_id__delete_post","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"integer","title":"Instance Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_instance_delete_instances__instance_id__delete_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/activity":{"get":{"tags":["web"],"summary":"Activity List","operationId":"activity_list_activity_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/account":{"get":{"tags":["web"],"summary":"Account","operationId":"account_admin_account_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/account/password":{"post":{"tags":["web"],"summary":"Change Password","operationId":"change_password_admin_account_password_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_change_password_admin_account_password_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["web"],"summary":"Users List","operationId":"users_list_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["web"],"summary":"Users Create","operationId":"users_create_admin_users_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_users_create_admin_users_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/role":{"post":{"tags":["web"],"summary":"Users Set Role","operationId":"users_set_role_admin_users__user_id__role_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_users_set_role_admin_users__user_id__role_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"tags":["web"],"summary":"Settings View","operationId":"settings_view_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/settings/enterprise":{"post":{"tags":["web"],"summary":"Settings Save Enterprise","operationId":"settings_save_enterprise_admin_settings_enterprise_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_settings_save_enterprise_admin_settings_enterprise_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings/enterprise/test":{"post":{"tags":["web"],"summary":"Settings Test Enterprise","description":"Prueba el acceso (``git ls-remote``) a la fuente Enterprise configurada.","operationId":"settings_test_enterprise_admin_settings_enterprise_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api":{"get":{"tags":["web"],"summary":"Api Docs","operationId":"api_docs_api_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_backup_create_instances__slug__backup_post":{"properties":{"filestore":{"type":"string","title":"Filestore","default":""}},"type":"object","title":"Body_backup_create_instances__slug__backup_post"},"Body_backup_set_schedule_instances__instance_id__backup_schedule_post":{"properties":{"schedule":{"type":"string","title":"Schedule","default":"off"},"retention":{"type":"integer","title":"Retention","default":7},"hour":{"type":"integer","title":"Hour","default":3}},"type":"object","title":"Body_backup_set_schedule_instances__instance_id__backup_schedule_post"},"Body_change_password_admin_account_password_post":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"},"confirm_password":{"type":"string","title":"Confirm Password"}},"type":"object","required":["current_password","new_password","confirm_password"],"title":"Body_change_password_admin_account_password_post"},"Body_connect_submit_instances__slug__connect_post":{"properties":{"uid":{"type":"integer","title":"Uid"}},"type":"object","required":["uid"],"title":"Body_connect_submit_instances__slug__connect_post"},"Body_instance_action_instances__instance_id__action_post":{"properties":{"action":{"type":"string","title":"Action"}},"type":"object","required":["action"],"title":"Body_instance_action_instances__instance_id__action_post"},"Body_instance_delete_instances__instance_id__delete_post":{"properties":{"confirm_name":{"type":"string","title":"Confirm Name","default":""}},"type":"object","title":"Body_instance_delete_instances__instance_id__delete_post"},"Body_instance_set_odoo_conf_instances__slug__odoo_conf_post":{"properties":{"odoo_conf":{"type":"string","title":"Odoo Conf","default":""},"generate":{"type":"string","title":"Generate","default":""}},"type":"object","title":"Body_instance_set_odoo_conf_instances__slug__odoo_conf_post"},"Body_instance_upload_create_instances_upload_post":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"name":{"type":"string","title":"Name"},"stage":{"type":"string","title":"Stage","default":"staging"},"odoo_version":{"type":"string","title":"Odoo Version","default":""},"edition":{"type":"string","title":"Edition","default":""},"modules":{"type":"string","title":"Modules","default":""},"branch":{"type":"string","title":"Branch","default":""},"neutralize":{"type":"string","title":"Neutralize","default":""},"mailcatcher":{"type":"string","title":"Mailcatcher","default":""},"backup_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Backup File"}},"type":"object","required":["project_id","name","backup_file"],"title":"Body_instance_upload_create_instances_upload_post"},"Body_instances_create_instances_post":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"name":{"type":"string","title":"Name"},"stage":{"type":"string","title":"Stage","default":"development"},"odoo_version":{"type":"string","title":"Odoo Version","default":""},"edition":{"type":"string","title":"Edition","default":""},"modules":{"type":"string","title":"Modules","default":""},"branch":{"type":"string","title":"Branch","default":""},"clone_from":{"type":"integer","title":"Clone From","default":0},"from_backup":{"type":"integer","title":"From Backup","default":0},"neutralize":{"type":"string","title":"Neutralize","default":""},"clone_filestore":{"type":"string","title":"Clone Filestore","default":""},"mailcatcher":{"type":"string","title":"Mailcatcher","default":""}},"type":"object","required":["project_id","name"],"title":"Body_instances_create_instances_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_project_delete_projects__slug__delete_post":{"properties":{"confirm_name":{"type":"string","title":"Confirm Name","default":""}},"type":"object","title":"Body_project_delete_projects__slug__delete_post"},"Body_project_deploy_key_projects__slug__deploy_key_post":{"properties":{"writable":{"type":"string","title":"Writable","default":""}},"type":"object","title":"Body_project_deploy_key_projects__slug__deploy_key_post"},"Body_project_deploy_key_verify_projects__slug__deploy_key_verify_post":{"properties":{"repo_url":{"type":"string","title":"Repo Url"}},"type":"object","required":["repo_url"],"title":"Body_project_deploy_key_verify_projects__slug__deploy_key_verify_post"},"Body_project_set_repo_projects__slug__repo_post":{"properties":{"git_repo":{"type":"string","title":"Git Repo","default":""},"addons_subdir":{"type":"string","title":"Addons Subdir","default":""}},"type":"object","title":"Body_project_set_repo_projects__slug__repo_post"},"Body_projects_create_projects_post":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"Body_projects_create_projects_post"},"Body_settings_save_enterprise_admin_settings_enterprise_post":{"properties":{"repo":{"type":"string","title":"Repo","default":""},"ssh_key":{"type":"string","title":"Ssh Key","default":""}},"type":"object","title":"Body_settings_save_enterprise_admin_settings_enterprise_post"},"Body_users_create_admin_users_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"role":{"type":"string","title":"Role","default":"developer"}},"type":"object","required":["email","password"],"title":"Body_users_create_admin_users_post"},"Body_users_set_role_admin_users__user_id__role_post":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"Body_users_set_role_admin_users__user_id__role_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstanceAction":{"properties":{"action":{"type":"string","title":"Action","description":"start | restart | stop | rebuild | destroy."}},"type":"object","required":["action"],"title":"InstanceAction","description":"Cuerpo para ejecutar una acción sobre una instancia."},"InstanceCreate":{"properties":{"name":{"type":"string","maxLength":63,"minLength":2,"title":"Name","description":"Nombre de la instancia."},"project":{"type":"string","maxLength":63,"minLength":2,"title":"Project","description":"Nombre del proyecto/cliente."},"stage":{"type":"string","title":"Stage","description":"development | staging | production.","default":"development"},"odoo_version":{"type":"string","title":"Odoo Version","description":"Versión de Odoo.","default":"19.0"},"edition":{"type":"string","title":"Edition","description":"enterprise | community.","default":"enterprise"},"modules":{"items":{"type":"string"},"type":"array","title":"Modules","description":"Módulos a instalar al crear la base."},"git_repo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Repo","description":"URL del repositorio de addons custom."},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch","description":"Rama del repositorio a desplegar."}},"type":"object","required":["name","project"],"title":"InstanceCreate","description":"Cuerpo para aprovisionar una nueva instancia vía API."},"InstanceOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"project":{"type":"string","title":"Project"},"stage":{"type":"string","title":"Stage"},"status":{"type":"string","title":"Status"},"odoo_version":{"type":"string","title":"Odoo Version"},"edition":{"type":"string","title":"Edition"},"subdomain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subdomain"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"db_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Db Name"},"host_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Port"},"modules":{"items":{"type":"string"},"type":"array","title":"Modules"},"git_repo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Repo"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","slug","project","stage","status","odoo_version","edition","subdomain","url","db_name","host_port","modules","git_repo","branch","created_by","created_at","updated_at"],"title":"InstanceOut","description":"Representación de una instancia devuelta por la API."},"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"}},"securitySchemes":{"HTTPBasic":{"type":"http","scheme":"basic"}}}}