Cuenta
La cuenta misma, y solo con sesión.
Nada aquí acepta una llave. Una llave que pudiera crear otra llave se daría todos los permisos de una vez, y una que pudiera pedir la exportación estaría a una filtración de la cuenta entera. No hay permiso que lo haga seguro, así que no hay ninguno: solo sesión.
Una llave que lo intente responde 403 forbidden.
/api/ v1/ account/ usernameDice si un nombre está libre, antes de que alguien intente tomarlo.
Parámetros
| Campo | Tipo | Notas |
|---|---|---|
qobligatorio | string | El nombre a verificar. Uno que ni siquiera tiene forma de nombre responde available: false, en vez de error. |
/api/ v1/ account/ usernameToma un nombre por primera vez. Está separado del PATCH porque son actos distintos con reglas distintas: quien aún no tiene nombre está terminando de registrarse, y quien ya tiene se está renombrando.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
usernameobligatorio | string | De 3 a 24 caracteres entre a-z, 0-9 y _, sin empezar ni terminar con _. |
/api/ v1/ account/ usernameRenombra. Hay un periodo de espera entre un cambio y el siguiente, y la respuesta trae next_change_at para decir cuándo termina.
/api/ v1/ indexContenido público reciente para indexadores. Hasta 1000 elementos por tipo: reviews, entries, lists y screenshots. RLS define la visibilidad.
/api/ v1/ account/ bootstrapPrepara el perfil tras iniciar sesión. Solo sesión. adopt_twitch=true adopta la identidad Twitch existente.
/api/ v1/ account/ stateSuspensión activa, motivo y número de infracciones de la propia cuenta, e infraction_history: cada registro detrás de ese número, del más nuevo al más antiguo, con id, reason (el tipo, guardado en portugués: Aviso, Suspensão o Banimento permanente), details (las palabras de moderación, o null), expires_at y created_at. Solo sesión.
Ejemplo
{
"data": {
"suspended": false,
"state": null,
"infractions": 1,
"infraction_history": [
{
"id": "5c1d…",
"reason": "Aviso",
"details": "Spoilers sem aviso numa avaliação.",
"expires_at": null,
"created_at": "2026-09-14T18:02:11.204+00:00"
}
],
"username": "ada"
}
}/api/ v1/ account/ birth-dateDevuelve la fecha de nacimiento guardada y cómo se confirmó la edad. Solo para la sesión: las columnas están revocadas para todos, y la función definidora responde por quien pregunta y por nadie más.
/api/ v1/ account/ birth-dateGuarda la fecha de nacimiento. La regla de edad es de la base, que rechaza en vez de guardar una fecha demasiado reciente.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
birth_dateobligatorio | string | Una fecha como YYYY-MM-DD. |
/api/ v1/ account/ sessionsDónde está iniciada la cuenta, y en qué.
/api/ v1/ account/ sessions/ {id}Cierra una sesión. Incluida la que hace la petición, que es como se sale de todos lados a la vez.
/api/ v1/ account/ identitiesLos proveedores con los que esta cuenta puede entrar.
/api/ v1/ account/ exportTodo lo que la cuenta ha escrito, en un solo documento. Una sesión que aún debe el segundo factor recibe 403 con reason mfa_required.
/api/ v1/ account/ dataTira un tipo de cosa, por su nombre. La categoría es obligatoria y nunca tiene valor por defecto: un borrado que adivina qué se le pidió quitar es un borrado que nadie deshace. Pide, en el cuerpo JSON, la prueba de que quien lo pide ahora es la persona dueña de la cuenta (ver password y code): una sesión olvidada abierta bastaba para vaciar la cuenta. Antes de cualquier prueba, una sesión que todavía debe el segundo factor recibe 403 forbidden con reason mfa_required. Responde cuántos registros salieron, y no un "listo": decir que los datos ya no están cuando no había ninguno es una afirmación, no una confirmación.
Parámetros
| Campo | Tipo | Notas |
|---|---|---|
categoryobligatorio | string | library, reviews, sessions, journeys, lists, screenshots, comments, views o everything. |
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
password | string | La contraseña actual. Obligatoria, siempre, para una cuenta que la tiene. Sin ella, 403 forbidden con reason password_required; incorrecta, reason password_incorrect. |
code | string | Para una cuenta sin contraseña y con verificación en dos pasos: seis dígitos de la app autenticadora o un código de recuperación, en lugar de iniciar sesión de nuevo. Sin contraseña, una sesión iniciada en los últimos 15 minutos basta por sí sola; después, 403 forbidden con reason reauthentication_required y second_factor diciendo si un code sirve. Intentos de contraseña o code: 10 cada 15 minutos por cuenta, luego 429 rate_limited con retry_after. |
/api/ v1/ account/ keysLas llaves de la cuenta. Nunca el token: solo se guarda su hash, en una columna que ningún rol que habla con esta API recibe.
/api/ v1/ account/ keysCrea una llave en una de tus aplicaciones, con sus permisos. El token viene una vez, en esta respuesta, y nunca más: después nadie puede leerlo, ni nosotros.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
app_idobligatorio | uuid | La aplicación de la llave. Toda llave pertenece a una, hecha en el portal de desarrolladores. |
nameobligatorio | string | Hasta 60 caracteres. |
expires_in_days | integer | En cuántos días expira. null para nunca. |
/api/ v1/ account/ connections/ {service}Olvida una cuenta enlazada: twitch o steam. Solo el deshacer vive aquí. Enlazar una es una ida y vuelta de OAuth que debe volver a una página, así que empieza y termina en el navegador; olvidar es una sola escritura, y las escrituras son aquí.
/api/ v1/ account/ keys/ {id}Revoca una llave. Vale desde la petición siguiente.
/api/ v1/ account/ appsLas aplicaciones de la cuenta, las cambiadas por último primero, con cuántas llaves vivas tiene cada una y cuándo se usó una por última vez. arcade resume, en una línea, dónde está el juego de la aplicación en Arcade, o viene null para una aplicación sin Arcade: slug, status, hidden_reason, notice (suspended, flagged, hidden o null), live_release_number, listing (approved, pending, draft y rejected), releases (draft, pending, ready y rejected_latest) y data_events (pending, held, que es parte de pending, y failed). Es el mismo miembro en todas las respuestas de aplicación, y Arcade tiene los detalles en /api/v1/account/apps/{id}/arcade.
Ejemplo
{
"data": [
{
"id": "...",
"name": "Orbit Runner",
"description": "",
"icon_url": null,
"scopes": [],
"created_at": "2026-10-14T18:00:00.000Z",
"updated_at": "2026-10-14T18:00:00.000Z",
"active_keys": 0,
"last_used_at": null,
"arcade": {
"slug": "orbit-runner",
"status": "listed",
"hidden_reason": null,
"notice": null,
"live_release_number": 3,
"listing": {
"approved": true,
"pending": null,
"draft": false,
"rejected": false
},
"releases": {
"draft": 1,
"pending": 0,
"ready": 0,
"rejected_latest": false
},
"data_events": { "pending": 0, "held": 0, "failed": 0 }
}
}
]
}/api/ v1/ account/ appsCrea una aplicación, sin permisos. Hasta 10 por cuenta.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
nameobligatorio | string | Hasta 60 caracteres. |
description | string | Hasta 400 caracteres. |
/api/ v1/ account/ apps/ {id}Una aplicación y sus llaves, las vivas primero, con el mismo arcade de la lista (null sin Arcade).
/api/ v1/ account/ apps/ {id}Cambia el nombre, la descripción o los permisos. Los permisos valen también para todas las llaves vivas de la aplicación, desde la petición siguiente.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
name | string | Hasta 60 caracteres. |
description | string | Hasta 400 caracteres. |
scopes | array | Los permisos de la aplicación, completos: los que queden fuera se quitan. |
/api/ v1/ account/ apps/ {id}Elimina la aplicación y todas sus llaves, que dejan de funcionar desde la petición siguiente. Una aplicación con un juego en Arcade no se elimina hasta quitar el juego de Arcade: 409 conflict con reason remove_from_arcade_first.
/api/ v1/ account/ apps/ {id}/ keysLas llaves de una aplicación. Nunca el token.
/api/ v1/ account/ apps/ {id}/ keysCrea una llave para la aplicación, con sus permisos. El token viene una vez, en esta respuesta.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
nameobligatorio | string | Hasta 60 caracteres. |
expires_in_days | integer | En cuántos días expira, de 1 a 3650. null para nunca. |
/api/ v1/ account/ apps/ {id}/ iconCambia el ícono: la imagen en multipart/form-data, en el campo image (JPEG, PNG, WebP, GIF o AVIF, hasta 15 MB). Se trata como un avatar: se reduce para caber en 512x512 (el portal la muestra recortada en cuadrado), con como máximo 500 KB fija o 4 MB y 15 segundos animada, y pasa por la misma revisión de contenido. Responde id e icon_url. Un archivo de otro tipo o de más de 15 MB, o una imagen que la revisión de contenido rechaza, es 400 invalid_request; también una imagen que no se pudo procesar, y entonces con reason: invalid_image (no se pudo leer), invalid_format (el contenido no es del tipo enviado), too_many_frames (más de 300 fotogramas), too_many_pixels (más de 40 millones de píxeles, sumando los fotogramas), animation_too_long (más de 15 segundos), unsupported_animation (un PNG o AVIF animado, o una animación sin la duración de cada fotograma) o too_heavy (sigue por encima de 500 KB, o de 4 MB animada, incluso después de optimizarla). 404 cuando la aplicación no es tuya.
/api/ v1/ account/ apps/ {id}/ iconQuita el ícono; la aplicación vuelve a mostrar sus iniciales.
Probar que eres tú
Limpiar datos (DELETE /api/v1/account/data) no tiene vuelta atrás, así que
una sesión sola no basta: quien encuentra un portátil olvidado con la cuenta
abierta tiene una sesión. La petición lleva un cuerpo JSON con la prueba de
que quien lo pide ahora es la persona dueña de la cuenta:
- Una cuenta con contraseña la envía en
password, siempre. - Una cuenta sin contraseña (entra con Google, Discord, Twitch o una llave de
acceso) no necesita nada más si su sesión empezó en los últimos 15 minutos.
Después, inicia sesión de nuevo o, con la verificación en dos pasos
activada, envía
code: seis dígitos de la app autenticadora o un código de recuperación.
Un rechazo es 403 forbidden con un reason para actuar:
{
"error": {
"code": "forbidden",
"message": "Sign in again to do this: the session has to have started in the last 15 minutes.",
"reason": "reauthentication_required",
"second_factor": true
}
}reason es uno de password_required, password_incorrect,
reauthentication_required (con second_factor, si un code serviría) y
code_incorrect. Cada cuenta tiene 10 intentos de contraseña o código cada 15
minutos; pasado eso, la respuesta es 429 rate_limited con reason
too_many_attempts y retry_after en segundos.
Antes de todo eso, una sesión que todavía debe el segundo factor (la cuenta
tiene la verificación en dos pasos activada y el código no se escribió al
iniciar sesión) recibe 403 forbidden con reason mfa_required, lleve lo
que lleve el cuerpo. El camino es terminar la verificación en dos pasos del
inicio de sesión; un code en el cuerpo no la reemplaza.
Una sesión antigua tampoco puede renovarse para pasar por aquí. En una cuenta
sin contraseña, los endpoints de inicio de sesión que le darían una sesión
nueva, un segundo factor o una llave de acceso (activar o desactivar la
verificación en dos pasos, terminar de configurarla, leer el secreto de la app
autenticadora, generar códigos de recuperación, registrar una llave de acceso)
la rechazan cuando la sesión pasó de esos 15 minutos, y el camino es el mismo:
iniciar sesión de nuevo. Están en /api/auth, el servicio de inicio de sesión
del sitio, y responden 403 en su formato:
{
"code": "RECENT_SIGN_IN_REQUIRED",
"message": "Sign in again to do this: the session has to have started in the last 15 minutes."
}Crear la primera contraseña (POST /api/account/password, la ruta del sitio
para eso) sigue la misma regla, porque una contraseña también es una prueba
que dura más que la sesión: pasados esos 15 minutos, la respuesta es 403 con
{ "error": "reauthentication_required", "second_factor": false }.
Una cuenta con contraseña no cambia: su prueba es la contraseña, y ninguna sesión nueva ocupa su lugar.