{"openapi":"3.1.0","info":{"title":"Meu Agente API","version":"1.0.0","description":"API de Meu Agente (mascota virtual + asistente). Autenticación: entra por /api/auth/sign-in/email (o Google) y usa el token del encabezado de respuesta `set-auth-token` en `Authorization: Bearer <token>`. Indica la app en `X-Client` (web, extensao, celular) y el idioma en `X-Locale` (pt-BR, en, es). Errores: `{ error: { code, message, field? } }`."},"servers":[{"url":"https://evobit.app"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"responses":{"Error":{"description":"Error con un código estable (unauthorized, not_found, invalid, game_rule, focus_early, agent_daily_limit...).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":"string"}}}}}}}}}},"tags":[{"name":"Cuenta","description":"Crear cuenta, entrar y salir. El token vuelve en el encabezado `set-auth-token`: úsalo en Authorize."},{"name":"Perfil","description":"Datos de la persona, zona horaria y avisos."},{"name":"Mascota y tienda","description":"Estado de la mascota, especie, accesorios y compras con monedas."},{"name":"Misiones del día","description":"3 por día (vienen en `pet.missions`). ¿Cumplida? Cobra las monedas; cobrar las 3 da un bono."},{"name":"Juegos","description":"Minijuegos: el servidor abre la partida, revisa tiempo y puntuación y paga (hasta 5 partidas premiadas por día)."},{"name":"Tareas","description":"Terminar una tarea da monedas y XP (una vez por tarea)."},{"name":"Enfoque","description":"Pomodoro: el servidor revisa el tiempo antes de pagar."},{"name":"Agente","description":"Conversación con la IA, que crea y termina tareas sola."},{"name":"Claves de IA","description":"Cada persona usa su propia clave (Gemini o Claude), guardada cifrada."},{"name":"Compartir","description":"Enlace público de la mascota para las redes sociales (solo la mascota, nunca los datos de la persona)."},{"name":"Notificaciones","description":"Web Push en este dispositivo."}],"paths":{"/api/auth/sign-up/email":{"post":{"summary":"Crea una cuenta con correo y contraseña","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","password"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8}}}}}},"responses":{"200":{"description":"{ token, user } y el encabezado set-auth-token"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Cuenta"]}},"/api/auth/sign-in/email":{"post":{"summary":"Entra con correo y contraseña","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8}}}}}},"responses":{"200":{"description":"{ token, user } y el encabezado set-auth-token"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Cuenta"]}},"/api/auth/sign-out":{"post":{"summary":"Sale (invalida el token)","responses":{"200":{"description":"{ success }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Cuenta"]}},"/api/v1/me":{"get":{"summary":"Persona conectada","responses":{"200":{"description":"Perfil"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Perfil"]},"patch":{"summary":"Cambia nombre, zona horaria, idioma y avisos","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"timezone":{"type":"string"},"locale":{"type":"string","enum":["pt-BR","en","es"]},"morningHour":{"type":"integer","minimum":0,"maximum":23},"nudges":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Perfil"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Perfil"]}},"/api/v1/pet":{"get":{"summary":"La mascota ahora (humor, hambre, energía, monedas, nivel, racha)","responses":{"200":{"description":"Mascota"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Mascota y tienda"]},"patch":{"summary":"Nombre, especie o accesorios en uso","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":24},"species":{"type":"string","enum":["bit","lumi","pip","nebula","fofo","brasa"]},"equip":{"type":"object","propertyNames":{"type":"string","enum":["cabeca","rosto","pescoco"]},"additionalProperties":{"type":["string","null"]}}}}}}},"responses":{"200":{"description":"Mascota"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Mascota y tienda"]}},"/api/v1/shop":{"get":{"summary":"Artículos de la tienda","responses":{"200":{"description":"{ items }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Mascota y tienda"]}},"/api/v1/shop/buy":{"post":{"summary":"Compra un artículo (la comida se usa al momento; el accesorio se queda y se usa enseguida)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"item":{"type":"string","enum":["cafe","energetico","pizza","salada","protetor","chapeu","laco","bone","fones","coroa","oculos","oculos-sol","cachecol","gravata","estrela","aureola","oculos-coracao","monoculo","faixa","medalha"]}},"required":["item"]}}}},"responses":{"200":{"description":"Mascota"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Mascota y tienda"]}},"/api/v1/missions/{id}/claim":{"post":{"summary":"Cobra la recompensa de una misión cumplida: { coins, bonus, pet }","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ coins, bonus, pet }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Misiones del día"]}},"/api/v1/games":{"post":{"summary":"Abre una partida: { id, game, startedAt }","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game":{"type":"string","enum":["pega-comida","memoria"]}},"required":["game"]}}}},"responses":{"200":{"description":"Partida"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Juegos"]}},"/api/v1/games/{id}/finish":{"post":{"summary":"Cierra la partida con la puntuación: { coins, capped, score, record, pet }","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":1000}},"required":["score"]}}}},"responses":{"200":{"description":"Resultado"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Juegos"]}},"/api/v1/tasks":{"get":{"summary":"Lista tareas","parameters":[{"name":"status","in":"query","schema":{"enum":["abertas","concluidas","todas"]}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}}],"responses":{"200":{"description":"{ tasks }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Tareas"]},"post":{"summary":"Crea una tarea","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"notes":{"type":"string","maxLength":2000},"dueDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"remindAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["title"]}}}},"responses":{"201":{"description":"Tarea"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Tareas"]}},"/api/v1/tasks/{id}":{"patch":{"summary":"Edita (done: true la termina)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"notes":{"type":"string","maxLength":2000},"dueDate":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"remindAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"done":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tarea"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Tareas"]},"delete":{"summary":"Borra","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ ok }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Tareas"]}},"/api/v1/tasks/{id}/complete":{"post":{"summary":"Termina: { task, reward, pet }","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Terminación"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Tareas"]}},"/api/v1/focus":{"get":{"summary":"Enfoque en curso","responses":{"200":{"description":"{ focus }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Enfoque"]},"post":{"summary":"Empieza un enfoque","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"minutes":{"default":25,"type":"integer","minimum":5,"maximum":90},"taskId":{"type":"string"}}}}}},"responses":{"201":{"description":"Enfoque"}},"tags":["Enfoque"]}},"/api/v1/focus/{id}/finish":{"post":{"summary":"Termina el enfoque (el servidor revisa el tiempo)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ focus, reward, pet }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Enfoque"]}},"/api/v1/focus/{id}/cancel":{"post":{"summary":"Cancela el enfoque","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{ ok }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Enfoque"]}},"/api/v1/agent":{"get":{"summary":"Historial de la conversación","responses":{"200":{"description":"{ messages }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Agente"]},"post":{"summary":"Habla con el agente (ejecuta acciones)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","maxLength":2000},"client":{"type":"string","description":"voz, cuando vino del habla"}}}}}},"responses":{"200":{"description":"{ reply, actions, pet, simulated }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Agente"]},"delete":{"summary":"Borra el historial","responses":{"200":{"description":"{ ok }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Agente"]}},"/api/v1/agent/page":{"post":{"summary":"Resume la página abierta o extrae sus tareas (las crea)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"action":{"type":"string","enum":["resumir","tarefas"]},"url":{"type":"string","maxLength":2000},"title":{"type":"string","maxLength":300},"text":{"type":"string","minLength":40,"maxLength":60000}},"required":["action","text"]}}}},"responses":{"200":{"description":"{ reply, actions, pet, simulated }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Agente"]}},"/api/v1/ai-keys":{"get":{"summary":"Claves de IA de la persona (solo los 4 últimos caracteres) y gasto estimado del mes","responses":{"200":{"description":"{ keys, monthEstimateUsd }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Claves de IA"]},"post":{"summary":"Registra/cambia la clave de un proveedor (probada antes de guardar; guardada cifrada)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"provider":{"type":"string","enum":["anthropic","gemini"]},"apiKey":{"type":"string","minLength":20,"maxLength":400},"model":{"type":"string","maxLength":80}},"required":["provider","apiKey"]}}}},"responses":{"200":{"description":"{ keys, monthEstimateUsd }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Claves de IA"]}},"/api/v1/ai-keys/{provider}":{"patch":{"summary":"{ primary: true } la vuelve la principal","parameters":[{"name":"provider","in":"path","required":true,"schema":{"enum":["gemini","anthropic"]}}],"responses":{"200":{"description":"{ keys }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Claves de IA"]},"delete":{"summary":"Quita la clave","parameters":[{"name":"provider","in":"path","required":true,"schema":{"enum":["gemini","anthropic"]}}],"responses":{"200":{"description":"{ keys }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Claves de IA"]}},"/api/v1/push/test":{"post":{"summary":"Envía una notificación de prueba a los dispositivos de la persona: { devices, sent }","responses":{"200":{"description":"{ devices, sent }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Notificaciones"]}},"/api/v1/share":{"get":{"summary":"Si el enlace público está activado: { enabled, url?, imageUrl?, text? }","responses":{"200":{"description":"Estado"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Compartir"]},"post":{"summary":"Activa el enlace público de la mascota (o devuelve el actual): { url, imageUrl, text }","responses":{"200":{"description":"Enlaces"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Compartir"]},"delete":{"summary":"Desactiva el enlace público","responses":{"200":{"description":"{ ok }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Compartir"]}},"/api/v1/push":{"get":{"summary":"Clave pública VAPID","security":[],"responses":{"200":{"description":"{ publicKey }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Notificaciones"]},"post":{"summary":"Activa las notificaciones en este dispositivo","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"endpoint":{"type":"string","format":"uri"},"keys":{"type":"object","properties":{"p256dh":{"type":"string","minLength":10},"auth":{"type":"string","minLength":5}},"required":["p256dh","auth"]},"label":{"type":"string","maxLength":60}},"required":["endpoint","keys"]}}}},"responses":{"200":{"description":"{ ok }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Notificaciones"]},"delete":{"summary":"Desactiva las notificaciones en este dispositivo","responses":{"200":{"description":"{ ok }"},"default":{"$ref":"#/components/responses/Error"}},"tags":["Notificaciones"]}}}}