{"openapi":"3.1.0","info":{"title":"Teddy API","version":"1.0.0","summary":"Publica artifacts HTML y funciones como endpoints, desde tu agente o desde código.","description":"Autenticación con clave de agente `tdy_…` (créala en /app/keys) en `Authorization: Bearer`. Las respuestas de error son `{ error, code? }`. Las funciones publicadas se invocan en `/f/{id}` (fuera de esta API) con la autenticación que elija su dueño: pública, clave de consumo `tfk_…` o solo el dueño."},"servers":[{"url":"https://teddyagent.app"}],"security":[{"bearer":[]}],"tags":[{"name":"Cuenta"},{"name":"Artifacts"},{"name":"Carpetas"},{"name":"Claves de agente"},{"name":"Funciones"},{"name":"Acceso a funciones"},{"name":"Secretos"},{"name":"Programaciones"},{"name":"Memoria (KV)"},{"name":"Ejecución"},{"name":"Datos (colecciones)"},{"name":"Canales (tiempo real)"},{"name":"Canales: API pública"},{"name":"Usuarios finales"},{"name":"Usuarios finales: API de sesión"},{"name":"Datos: API pública"}],"paths":{"/api/health":{"get":{"tags":["Cuenta"],"summary":"Estado del servicio","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"publicUrl":{"type":"string"},"db":{"type":"string"}}}}}}},"security":[],"operationId":"getApiHealth"}},"/api/plans":{"get":{"tags":["Cuenta"],"summary":"Planes y límites","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[],"operationId":"getApiPlans"}},"/api/me":{"get":{"tags":["Cuenta"],"summary":"Quién soy: email, plan, límites y uso","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiMe"}},"/api/billing":{"get":{"tags":["Cuenta"],"summary":"Plan, suscripción e historial de pagos","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"enum":["free","pro"]},"enabled":{"type":"boolean"},"price":{"type":"object","properties":{"amount":{"type":"integer","description":"céntimos"},"currency":{"type":"string"},"interval":{"type":"string"}}},"subscription":{"type":["object","null"],"properties":{"id":{"type":"string"},"status":{"enum":["active","past_due"]},"cancelAtPeriodEnd":{"type":"boolean"},"currentPeriodEnd":{"type":"string","format":"date-time"}}},"history":{"type":"array","items":{"type":"object"}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiBilling"}},"/api/me/export":{"get":{"tags":["Cuenta"],"summary":"Descargar todos tus datos (ZIP)","description":"HTML de artifacts y versiones, código y KV de funciones, y datos.json. Sin valores de secretos. No disponible para apps conectadas por OAuth.","responses":{"200":{"description":"ZIP","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiMeExport"}},"/api/me/onboarding":{"get":{"tags":["Cuenta"],"summary":"Estado de «Primeros pasos»","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiMeOnboarding"}},"/api/artifacts":{"get":{"tags":["Artifacts"],"summary":"Listar mis artifacts","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":1000}},{"name":"folder","in":"query","schema":{"type":"string"},"description":"ID de carpeta, o `none` para los que no tienen"},{"name":"status","in":"query","schema":{"enum":["live","paused","hidden"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Artifact"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiArtifacts"},"post":{"tags":["Artifacts"],"summary":"Publicar un artifact","description":"Cuerpo `text/html` crudo (cabeceras opcionales `X-Teddy-Title`, `X-Teddy-Expires-In`, `X-Teddy-Folder`, `X-Teddy-Visibility`), `application/zip` (un .zip con index.html y sus archivos) o JSON. El filtro anti-phishing puede rechazarlo (422) u ocultarlo para revisión.","operationId":"publishArtifact","requestBody":{"required":true,"content":{"text/html":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactInput"}},"application/zip":{"schema":{"type":"string","format":"binary"}}}},"responses":{"201":{"description":"Publicado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Artifact"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/artifacts/{id}":{"get":{"tags":["Artifacts"],"summary":"Ver un artifact (metadatos)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Artifact"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getApiArtifactsId"},"put":{"tags":["Artifacts"],"summary":"Sustituir el HTML","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"requestBody":{"required":true,"content":{"text/html":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Artifact"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putApiArtifactsId"},"patch":{"tags":["Artifacts"],"summary":"Cambiar título, estado (live/paused), carpeta, caducidad, visibilidad (public/private) o contraseña","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"status":{"enum":["live","paused"]},"folder_id":{"type":["integer","null"]},"expires_in":{"type":["string","null"],"examples":["7d"]},"visibility":{"enum":["public","private"]},"password":{"type":["string","null"],"minLength":6,"maxLength":200,"description":"null la quita"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Artifact"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiArtifactsId"},"delete":{"tags":["Artifacts"],"summary":"Borrar","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"responses":{"204":{"description":"Borrado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiArtifactsId"}},"/api/artifacts/{id}/files":{"get":{"tags":["Artifacts"],"summary":"Archivos del artifact además del HTML (versión actual)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"bytes":{"type":"integer"},"contentType":{"type":"string"}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiArtifactsIdFiles"}},"/api/artifacts/{id}/links":{"get":{"tags":["Compartir"],"summary":"Enlaces secretos del artifact","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ShareLink"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiArtifactsIdLinks"},"post":{"tags":["Compartir"],"summary":"Crear un enlace secreto (la URL solo se devuelve aquí)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","maxLength":80},"expires_in":{"type":["string","null"],"examples":["7d"]}}}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ShareLink"},{"type":"object","properties":{"url":{"type":"string","format":"uri"}}}]}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiArtifactsIdLinks"}},"/api/artifacts/{id}/links/{linkId}":{"delete":{"tags":["Compartir"],"summary":"Revocar un enlace secreto","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"},{"name":"linkId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"204":{"description":"Revocado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiArtifactsIdLinksLinkId"}},"/api/artifacts/{id}/versions":{"get":{"tags":["Artifacts"],"summary":"Historial de versiones (cada HTML publicado)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ArtifactVersion"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiArtifactsIdVersions"}},"/api/artifacts/{id}/versions/{n}":{"get":{"tags":["Artifacts"],"summary":"Contenido de una versión (JSON con html, o ?format=html para descargarlo)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"},{"name":"n","in":"path","required":true,"schema":{"type":"integer"}},{"name":"format","in":"query","schema":{"enum":["json","html"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ArtifactVersion"},{"type":"object","properties":{"html":{"type":"string"}}}]}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiArtifactsIdVersionsN"}},"/api/artifacts/{id}/versions/{n}/restore":{"post":{"tags":["Artifacts"],"summary":"Restaurar una versión (se publica como versión nueva)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"},{"name":"n","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Artifact"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiArtifactsIdVersionsNRestore"}},"/api/artifacts/{id}/diff":{"get":{"tags":["Artifacts"],"summary":"Diferencias línea a línea entre dos versiones","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"},{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"integer"},"to":{"type":"integer"},"added":{"type":"integer"},"removed":{"type":"integer"},"tooLarge":{"type":"boolean"},"hunks":{"type":"array","items":{"type":"array","items":{"type":"object","properties":{"t":{"enum":[" ","+","-"]},"s":{"type":"string"},"a":{"type":["integer","null"]},"b":{"type":["integer","null"]}}}}}}}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiArtifactsIdDiff"}},"/api/artifacts/{id}/report":{"post":{"tags":["Artifacts"],"summary":"Reportar un artifact (abuso, phishing…)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del artifact (lo que va tras /a/)"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","default":"other"},"detail":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"postApiArtifactsIdReport"}},"/api/usage":{"get":{"tags":["Cuenta"],"summary":"Uso del plan: artefactos, espacio y funciones frente a los límites (level ok, warn al 80 %, full al 100 %)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string"},"level":{"type":"string","enum":["ok","warn","full"]},"items":{"type":"array","items":{"type":"object"}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiUsage"}},"/api/templates":{"get":{"tags":["Plantillas"],"summary":"Listar plantillas (apuntes, test, tarjetas, plan, guía, acta)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object"}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getApiTemplates"}},"/api/templates/{id}":{"get":{"tags":["Plantillas"],"summary":"Una plantilla con su HTML de ejemplo","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getApiTemplatesId"}},"/api/folders":{"get":{"tags":["Carpetas"],"summary":"Listar carpetas","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Folder"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFolders"},"post":{"tags":["Carpetas"],"summary":"Crear carpeta","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFolders"}},"/api/folders/{id}":{"patch":{"tags":["Carpetas"],"summary":"Renombrar","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Folder"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiFoldersId"},"delete":{"tags":["Carpetas"],"summary":"Borrar (los artifacts pasan a «sin carpeta»)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"204":{"description":"Borrada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFoldersId"}},"/api/folders/{id}/index":{"post":{"tags":["Carpetas"],"summary":"Crear (o actualizar) la página «Índice · carpeta» con enlaces a todo lo de la carpeta","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Índice actualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Artifact"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFoldersIdIndex"}},"/api/collections":{"get":{"tags":["Datos (colecciones)"],"summary":"Listar tus colecciones","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Collection"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiCollections"},"post":{"tags":["Datos (colecciones)"],"summary":"Crear una colección de datos","description":"Devuelve su `id` y la URL de su API pública `/d/{id}`. `read_access` y `write_access`: `public`, `key` (clave de consumo tfk_ de toda la cuenta) u `owner` (por defecto).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionInput"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiCollections"}},"/api/data-usage":{"get":{"tags":["Datos (colecciones)"],"summary":"Uso de datos: colecciones, registros y bytes frente al plan","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiDataUsage"}},"/api/collections/{id}":{"get":{"tags":["Datos (colecciones)"],"summary":"Ver una colección","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiCollectionsId"},"patch":{"tags":["Datos (colecciones)"],"summary":"Cambiar nombre, acceso o esquema","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionInput"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiCollectionsId"},"delete":{"tags":["Datos (colecciones)"],"summary":"Borrar la colección y todos sus registros","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"responses":{"204":{"description":"Borrada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiCollectionsId"}},"/api/collections/{id}/records":{"get":{"tags":["Datos (colecciones)"],"summary":"Registros de la colección (vista del dueño; mismos filtros que la API pública)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPage"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiCollectionsIdRecords"},"post":{"tags":["Datos (colecciones)"],"summary":"Crear un registro (el cuerpo es el propio objeto JSON)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiCollectionsIdRecords"},"delete":{"tags":["Datos (colecciones)"],"summary":"Vaciar la colección","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"integer"}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiCollectionsIdRecords"}},"/api/collections/{id}/records/{rid}":{"get":{"tags":["Datos (colecciones)"],"summary":"Leer un registro","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiCollectionsIdRecordsRid"},"put":{"tags":["Datos (colecciones)"],"summary":"Reemplazar (o crear con ese id) un registro; cabecera `If-Match` con la versión","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putApiCollectionsIdRecordsRid"},"patch":{"tags":["Datos (colecciones)"],"summary":"Fusionar campos en un registro (null elimina un campo)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiCollectionsIdRecordsRid"},"delete":{"tags":["Datos (colecciones)"],"summary":"Borrar un registro","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"responses":{"204":{"description":"Borrado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiCollectionsIdRecordsRid"}},"/api/collections/{id}/import":{"post":{"tags":["Datos (colecciones)"],"summary":"Importar hasta 1000 registros de una vez (todo o nada)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["data"],"properties":{"id":{"type":"string"},"data":{"type":"object"}}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"integer"},"updated":{"type":"integer"}}}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiCollectionsIdImport"}},"/api/collections/{id}/export":{"get":{"tags":["Datos (colecciones)"],"summary":"Exportar todos los registros (`format`: json, ndjson o csv)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"format","in":"query","schema":{"enum":["json","ndjson","csv"]}}],"responses":{"200":{"description":"Archivo"},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiCollectionsIdExport"}},"/d/{id}":{"get":{"tags":["Datos: API pública"],"summary":"Listar registros con filtros","description":"Sin clave si la lectura es `public`; si no, `Authorization: Bearer tfk_…` (clave de toda la cuenta) o la clave de gestión del dueño. Filtros: `?campo=valor`, `campo__gt|gte|lt|lte|ne`, `_order=-campo`, `_limit` (máx. 100), `_offset` (máx. 10000), `_count=1`. CORS abierto.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPage"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getDId"},"post":{"tags":["Datos: API pública"],"summary":"Crear un registro","description":"Cuerpo: un objeto JSON. Responde 201 con el registro y `ETag` con su versión.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"postDId"}},"/d/{id}/{rid}":{"get":{"tags":["Datos: API pública"],"summary":"Leer un registro","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getDIdRid"},"put":{"tags":["Datos: API pública"],"summary":"Reemplazar o crear con id elegido (`If-Match`: versión)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"putDIdRid"},"patch":{"tags":["Datos: API pública"],"summary":"Fusionar campos (null elimina; `If-Match`: versión)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataRecord"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Rechazado por el filtro anti-phishing (code: moderation_rejected)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"patchDIdRid"},"delete":{"tags":["Datos: API pública"],"summary":"Borrar (`If-Match`: versión)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"},"description":"ID del registro"}],"responses":{"204":{"description":"Borrado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"deleteDIdRid"}},"/api/end-users":{"get":{"tags":["Usuarios finales"],"summary":"Listar los clientes que han iniciado sesión en tus apps","description":"Cada persona es de un solo dueño. Devuelve `items` (id `eu_…`, proveedor, email, nombre, último acceso, sesiones), `total`, `limit` (cupo del plan) y `providers` disponibles.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer"}},{"name":"offset","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiEndUsers"}},"/api/end-users/{id}":{"delete":{"tags":["Usuarios finales"],"summary":"Borrar a un cliente y cerrar sus sesiones","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del cliente (eu_…)"}],"responses":{"204":{"description":"Borrado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiEndUsersId"}},"/eu/api/me":{"get":{"tags":["Usuarios finales: API de sesión"],"summary":"Quién es el cliente de esta sesión (`Authorization: Bearer tus_…`)","description":"Lo usa el SDK `/sdk/teddy.js`. CORS abierto: las páginas publicadas tienen origen opaco.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"provider":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getEuApiMe"}},"/eu/api/logout":{"post":{"tags":["Usuarios finales: API de sesión"],"summary":"Cerrar la sesión del cliente","responses":{"204":{"description":"Sesión cerrada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"postEuApiLogout"}},"/api/channels":{"get":{"tags":["Canales (tiempo real)"],"summary":"Listar tus canales","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Channel"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiChannels"},"post":{"tags":["Canales (tiempo real)"],"summary":"Crear un canal de tiempo real","description":"Devuelve su `id` y la URL pública `/c/{id}`. `publish_access` y `subscribe_access`: `public`, `key` (clave `tfk_` de toda la cuenta) u `owner` (por defecto).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelInput"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiChannels"}},"/api/channel-usage":{"get":{"tags":["Canales (tiempo real)"],"summary":"Uso de canales y conexiones abiertas frente al plan","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiChannelUsage"}},"/api/channels/{id}":{"get":{"tags":["Canales (tiempo real)"],"summary":"Ver un canal","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiChannelsId"},"patch":{"tags":["Canales (tiempo real)"],"summary":"Cambiar nombre o acceso (cierra las conexiones abiertas)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelInput"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiChannelsId"},"delete":{"tags":["Canales (tiempo real)"],"summary":"Borrar el canal y cortar a sus oyentes","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"}],"responses":{"204":{"description":"Borrado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiChannelsId"}},"/api/channels/{id}/publish":{"post":{"tags":["Canales (tiempo real)"],"summary":"Publicar un mensaje como dueño","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{},"event":{"type":"string"}}}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"}}}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiChannelsIdPublish"}},"/api/channels/{id}/messages":{"get":{"tags":["Canales (tiempo real)"],"summary":"Últimos mensajes (anillo en memoria; `after` = último id visto)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"},{"name":"after","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiChannelsIdMessages"}},"/c/{id}":{"get":{"tags":["Canales: API pública"],"summary":"Escuchar: SSE (`Accept: text/event-stream`), WebSocket (`Upgrade: websocket`) o, sin ellos, los últimos mensajes en JSON","description":"SSE: eventos `id:`/`event:`/`data:` con latido `: ping` cada 25 s; al reconectar, `Last-Event-ID` (o `?after=`) recupera lo perdido si sigue entre los últimos 100. WebSocket: marcos de texto; lo que llega es `{id,event,data}` y lo que escribas (JSON) se publica si tienes permiso. La clave va en `Authorization: Bearer tfk_…`, `X-API-Key` o `?api_key=` (los navegadores no pueden poner cabeceras en WebSocket/EventSource). Nunca se usan cookies.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"},{"name":"after","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"Flujo de eventos, o JSON con `items` y `last`","content":{"text/event-stream":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getCId"},"post":{"tags":["Canales: API pública"],"summary":"Publicar un mensaje (cuerpo: cualquier JSON; `?event=nombre`)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID del canal (lo que va tras /c/)"},{"name":"event","in":"query","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"}}}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"postCId"}},"/d/{id}/_events":{"get":{"tags":["Datos: API pública"],"summary":"Cambios de la colección en directo (SSE): `created`, `updated`, `deleted`","description":"Misma regla de acceso que la lectura. Cada evento lleva `{type, record}`. `Last-Event-ID`/`?after=` recupera lo reciente.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la colección (lo que va tras /d/)"},{"name":"after","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"Flujo SSE","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[],"operationId":"getDId_events"}},"/api/keys":{"get":{"tags":["Claves de agente"],"summary":"Listar mis claves tdy_","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiKeys"},"post":{"tags":["Claves de agente"],"summary":"Crear una clave tdy_ (solo se muestra una vez)","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer"},"key":{"type":"string"}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiKeys"}},"/api/keys/{id}":{"delete":{"tags":["Claves de agente"],"summary":"Revocar","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"204":{"description":"Revocada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiKeysId"}},"/api/functions":{"get":{"tags":["Funciones"],"summary":"Listar mis funciones","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Function"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctions"},"post":{"tags":["Funciones"],"summary":"Publicar una función como endpoint /f/{id}","operationId":"publishFunction","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionCreate"}}}},"responses":{"201":{"description":"Publicada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Function"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/functions/{id}":{"get":{"tags":["Funciones"],"summary":"Ver una función (con código)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Function"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsId"},"put":{"tags":["Funciones"],"summary":"Publicar nueva versión del código","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Function"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putApiFunctionsId"},"patch":{"tags":["Funciones"],"summary":"Cambiar nombre, estado (live/paused), acceso, red o carpeta","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"status":{"enum":["live","paused"]},"access":{"enum":["public","key","owner","user"]},"allow_net":{"type":"array","items":{"type":"string"}},"folder_id":{"type":["integer","null"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Function"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiFunctionsId"},"delete":{"tags":["Funciones"],"summary":"Borrar (con sus claves, secretos y memoria)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"204":{"description":"Borrada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFunctionsId"}},"/api/functions/{id}/logs":{"get":{"tags":["Funciones"],"summary":"Últimas invocaciones (incluye rechazadas, con motivo)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Invocation"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdLogs"}},"/api/functions/{id}/usage":{"get":{"tags":["Acceso a funciones"],"summary":"Uso de los últimos 7 días por clave","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdUsage"}},"/api/functions/{id}/rejections":{"get":{"tags":["Acceso a funciones"],"summary":"Intentos rechazados (7 días) por motivo","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"reason":{"type":"string"},"status":{"type":"integer"},"n":{"type":"integer"},"ips":{"type":"integer"},"last":{"type":"string","format":"date-time"}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdRejections"}},"/api/functions/{id}/keys":{"get":{"tags":["Acceso a funciones"],"summary":"Claves de consumo válidas para esta función","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FunctionKey"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdKeys"},"post":{"tags":["Acceso a funciones"],"summary":"Crear clave de consumo tfk_ solo para esta función","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionKeyInput"}}}},"responses":{"201":{"description":"Creada (el campo key solo aparece ahora)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionKey"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFunctionsIdKeys"}},"/api/function-keys":{"get":{"tags":["Acceso a funciones"],"summary":"Todas mis claves de consumo","parameters":[{"name":"function_id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FunctionKey"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionKeys"},"post":{"tags":["Acceso a funciones"],"summary":"Crear clave de consumo (de una función o de todas)","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionKeyInput"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionKey"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFunctionKeys"}},"/api/function-keys/{id}":{"patch":{"tags":["Acceso a funciones"],"summary":"Cambiar nombre y límites","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"rate_per_min":{"type":["integer","null"]},"quota_per_day":{"type":["integer","null"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionKey"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiFunctionKeysId"},"delete":{"tags":["Acceso a funciones"],"summary":"Revocar al instante","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"204":{"description":"Revocada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFunctionKeysId"}},"/api/schedules":{"get":{"tags":["Programaciones"],"summary":"Todas mis funciones programadas","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Schedule"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiSchedules"}},"/api/functions/{id}/schedules":{"get":{"tags":["Programaciones"],"summary":"Programaciones de esta función","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Schedule"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdSchedules"},"post":{"tags":["Programaciones"],"summary":"Programar la función (cron de 5 campos, en UTC)","description":"La función recibe un POST en `path` con `body`, y las cabeceras x-teddy-cron, x-teddy-schedule-id y x-teddy-scheduled-for (un cliente externo nunca puede ponerlas). Cuenta contra las invocaciones diarias del plan. Free: 2 programaciones, como mucho cada hora; Pro: 50, cada 5 minutos. Tras 10 fallos seguidos se desactiva sola.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleInput"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFunctionsIdSchedules"}},"/api/functions/{id}/schedules/{sid}":{"get":{"tags":["Programaciones"],"summary":"Ver una programación","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"sid","in":"path","required":true,"schema":{"type":"integer"},"description":"ID numérico de la programación"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdSchedulesSid"},"patch":{"tags":["Programaciones"],"summary":"Cambiar cron, ruta, cuerpo, nombre o activarla/desactivarla","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"sid","in":"path","required":true,"schema":{"type":"integer"},"description":"ID numérico de la programación"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleInput"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schedule"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchApiFunctionsIdSchedulesSid"},"delete":{"tags":["Programaciones"],"summary":"Borrar la programación (y su registro)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"sid","in":"path","required":true,"schema":{"type":"integer"},"description":"ID numérico de la programación"}],"responses":{"204":{"description":"Borrada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFunctionsIdSchedulesSid"}},"/api/functions/{id}/schedules/{sid}/runs":{"get":{"tags":["Programaciones"],"summary":"Registro de ejecuciones (14 días)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"sid","in":"path","required":true,"schema":{"type":"integer"},"description":"ID numérico de la programación"},{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string"},"scheduledFor":{"type":["string","null"]},"trigger":{"type":"string","enum":["cron","manual"]},"status":{"type":"integer","description":"HTTP de la función; 0 = omitida"},"ms":{"type":["integer","null"]},"error":{"type":["string","null"]}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdSchedulesSidRuns"}},"/api/functions/{id}/schedules/{sid}/run":{"post":{"tags":["Programaciones"],"summary":"Ejecutarla ahora (máx. 20 por hora)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"sid","in":"path","required":true,"schema":{"type":"integer"},"description":"ID numérico de la programación"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"integer"},"ms":{"type":["integer","null"]},"error":{"type":["string","null"]}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFunctionsIdSchedulesSidRun"}},"/api/functions/{id}/secrets":{"get":{"tags":["Secretos"],"summary":"Listar nombres de secretos (nunca valores)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Secret"}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdSecrets"},"post":{"tags":["Secretos"],"summary":"Crear o reemplazar un secreto","description":"Nombres reservados: KV, FN_*, TEDDY_*. 201 si se crea, 200 si se reemplaza.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","value"],"properties":{"name":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,63}$"},"value":{"type":"string","minLength":4,"maxLength":4096}}}}}},"responses":{"201":{"description":"Creado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"No disponible en este servidor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postApiFunctionsIdSecrets"}},"/api/functions/{id}/secrets/{name}":{"put":{"tags":["Secretos"],"summary":"Crear o reemplazar un secreto por nombre","description":"200 si se reemplaza, 201 si se crea.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"name","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{0,63}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["value"],"properties":{"value":{"type":"string","minLength":4,"maxLength":4096}}}}}},"responses":{"200":{"description":"Reemplazado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Demasiado grande para tu plan (code: too_large)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"No disponible en este servidor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putApiFunctionsIdSecretsName"},"delete":{"tags":["Secretos"],"summary":"Borrar un secreto","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Borrado"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFunctionsIdSecretsName"}},"/api/functions/{id}/kv":{"get":{"tags":["Memoria (KV)"],"summary":"Listar claves del KV de la función","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"prefix","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":500}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"integer"},"bytes":{"type":"integer"},"items":{"type":"array","items":{"type":"object"}}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdKv"},"delete":{"tags":["Memoria (KV)"],"summary":"Vaciar el KV","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"integer"}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFunctionsIdKv"}},"/api/functions/{id}/kv/{key}":{"get":{"tags":["Memoria (KV)"],"summary":"Leer una clave","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}}}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiFunctionsIdKvKey"},"delete":{"tags":["Memoria (KV)"],"summary":"Borrar una clave","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$"},"description":"ID de la función (lo que va tras /f/)"},{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Borrada"},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"No es tuyo o lo impide el plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteApiFunctionsIdKvKey"}},"/api/run":{"post":{"tags":["Ejecución"],"summary":"Ejecutar código una vez, sin publicar","operationId":"runCode","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"input":{"type":"object","properties":{"method":{"type":"string"},"path":{"type":"string"},"query":{"type":"object"},"headers":{"type":"object"},"body":{}}},"allow_net":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"integer"},"headers":{"type":"object"},"body":{},"logs":{"type":"array"},"ms":{"type":"integer"},"timedOut":{"type":"boolean"}}}}}},"400":{"description":"Petición inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave de API o es inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Límite superado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Clave de agente tdy_… (o la cookie de sesión del panel)"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"code":{"type":"string"}}},"Me":{"type":"object","properties":{"email":{"type":"string"},"plan":{"enum":["free","pro"]},"isAdmin":{"type":"boolean"},"limits":{"type":"object"},"usage":{"type":"object"}}},"Artifact":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"title":{"type":"string"},"bytes":{"type":"integer"},"status":{"enum":["live","paused","hidden"]},"version":{"type":"integer"},"visibility":{"enum":["public","private"]},"hasPassword":{"type":"boolean"},"files":{"type":"integer","description":"archivos además del HTML"},"folderId":{"type":["integer","null"]},"views":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ShareLink":{"type":"object","properties":{"id":{"type":"integer"},"label":{"type":"string"},"views":{"type":"integer"},"expiresAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"lastUsed":{"type":["string","null"],"format":"date-time"}}},"ArtifactVersion":{"type":"object","properties":{"version":{"type":"integer"},"title":{"type":"string"},"bytes":{"type":"integer"},"source":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"current":{"type":"boolean"}}},"ArtifactUpdate":{"type":"object","properties":{"html":{"type":"string"},"title":{"type":"string"},"expires_in":{"type":["string","null"],"examples":["30m","12h","7d","2w","never"]},"folder_id":{"type":["integer","null"]},"visibility":{"enum":["public","private"]},"password":{"type":["string","null"],"minLength":6,"maxLength":200,"description":"null la quita"},"files":{"type":"array","maxItems":500,"description":"Archivos además del HTML (CSS, JS, imágenes…), enlazados con rutas relativas. Si incluye index.html, ese es el HTML principal. En PUT sustituye todos los archivos","items":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","examples":["img/logo.png"]},"content":{"type":"string"},"encoding":{"enum":["utf8","base64"]}}}}}},"ArtifactInput":{"type":"object","description":"html, o files con index.html","properties":{"html":{"type":"string"},"title":{"type":"string"},"expires_in":{"type":"string","description":"Unidades m (minutos), h, d, w; o never","examples":["30m","12h","7d","2w"]},"folder":{"type":"string","description":"Nombre de carpeta (se crea si no existe)"},"folder_id":{"type":"integer"},"visibility":{"enum":["public","private"]},"password":{"type":"string","minLength":6,"maxLength":200},"files":{"type":"array","maxItems":500,"description":"Archivos además del HTML (CSS, JS, imágenes…), enlazados con rutas relativas. Si incluye index.html, ese es el HTML principal. En PUT sustituye todos los archivos","items":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","examples":["img/logo.png"]},"content":{"type":"string"},"encoding":{"enum":["utf8","base64"]}}}}}},"Collection":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"readAccess":{"enum":["public","key","owner"]},"writeAccess":{"enum":["public","key","owner"]},"schema":{"type":["object","null"]},"records":{"type":"integer"},"bytes":{"type":"integer"},"url":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CollectionInput":{"type":"object","properties":{"name":{"type":"string"},"read_access":{"enum":["public","key","owner"]},"write_access":{"enum":["public","key","owner"]},"schema":{"type":["object","null"],"description":"Subconjunto de JSON Schema: required, properties (type, enum, minimum, maximum, minLength, maxLength, items), additionalProperties"}}},"Channel":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"publishAccess":{"enum":["public","key","owner"]},"subscribeAccess":{"enum":["public","key","owner"]},"url":{"type":"string","format":"uri"},"subscribers":{"type":"integer"},"lastEventId":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"}}},"ChannelInput":{"type":"object","properties":{"name":{"type":"string"},"publish_access":{"enum":["public","key","owner"]},"subscribe_access":{"enum":["public","key","owner"]}}},"DataRecord":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"data":{"type":"object"}}},"RecordPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DataRecord"}},"nextOffset":{"type":["integer","null"]},"total":{"type":"integer"}}},"Folder":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"count":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"}}},"Function":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"name":{"type":"string"},"version":{"type":"integer"},"status":{"enum":["live","paused","suspended","blocked"]},"access":{"enum":["public","key","owner","user"]},"allowNet":{"type":"array","items":{"type":"string"}},"bytes":{"type":"integer"},"invocations":{"type":"integer"},"strikes":{"type":"integer"},"flags":{"type":"array","items":{"type":"string"}},"folderId":{"type":["integer","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"code":{"type":"string","description":"Solo en GET /api/functions/{id}"}}},"FunctionCreate":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"export default { async fetch(request, env) { … } }"},"name":{"type":"string"},"access":{"enum":["public","key","owner","user"],"default":"public"},"allow_net":{"type":"array","items":{"type":"string"}},"folder":{"type":"string","description":"Nombre de carpeta"}}},"FunctionUpdate":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"name":{"type":"string"},"allow_net":{"type":"array","items":{"type":"string"}}}},"FunctionKey":{"type":"object","properties":{"id":{"type":"integer"},"key":{"type":"string","description":"Solo al crearla"},"prefix":{"type":"string"},"name":{"type":"string"},"functionId":{"type":["string","null"]},"ratePerMin":{"type":["integer","null"]},"quotaPerDay":{"type":["integer","null"]},"expiresAt":{"type":["string","null"]},"revokedAt":{"type":["string","null"]},"lastUsed":{"type":["string","null"]},"uses":{"type":"integer"},"functionName":{"type":["string","null"]},"createdAt":{"type":"string"},"usage":{"type":"object","properties":{"today":{"type":"integer"},"week":{"type":"integer"},"rejectedWeek":{"type":"integer"}}}}},"Schedule":{"type":"object","properties":{"id":{"type":"integer"},"functionId":{"type":"string"},"name":{"type":"string"},"cron":{"type":"string","example":"0 9 * * mon-fri"},"path":{"type":"string"},"body":{"type":"string"},"enabled":{"type":"boolean"},"nextRunAt":{"type":["string","null"]},"runs":{"type":"integer"},"failures":{"type":"integer"},"consecutiveFailures":{"type":"integer"},"last":{"type":["object","null"],"properties":{"at":{"type":"string"},"status":{"type":"integer"},"ms":{"type":["integer","null"]},"error":{"type":["string","null"]}}},"disabledReason":{"type":"string"},"createdAt":{"type":"string"}}},"ScheduleInput":{"type":"object","properties":{"cron":{"type":"string","description":"minuto hora día-del-mes mes día-de-la-semana (UTC); admite listas, rangos, pasos, nombres y @hourly/@daily/@weekly/@monthly"},"name":{"type":"string","maxLength":80},"path":{"type":"string","description":"Ruta (y query) que se llama; por defecto /"},"body":{"description":"Cuerpo del POST: texto o JSON (máx. 4 KB)"},"enabled":{"type":"boolean"}}},"FunctionKeyInput":{"type":"object","properties":{"name":{"type":"string"},"function_id":{"type":"string"},"rate_per_min":{"type":"integer"},"quota_per_day":{"type":"integer"},"expires_in":{"type":"string","examples":["24h","30d","1y"]}}},"Invocation":{"type":"object","properties":{"id":{"type":"integer"},"method":{"type":"string"},"path":{"type":"string"},"status":{"type":"integer"},"ms":{"type":"integer"},"error":{"type":["string","null"]},"logs":{"type":"array"},"rejected":{"type":"boolean"},"reason":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}},"Secret":{"type":"object","properties":{"name":{"type":"string"},"bytes":{"type":"integer"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}}}}}