uloggdDesarrolladores
Portal de desarrolladoresuloggd
EmpezarRecursosArcade
Portal de desarrolladoresuloggdIdentidadCatálogoPerfilBibliotecaReseñasDiarioListasPremiosCapturasSocialCuentaNotificacionesComentariosMe gustaHistorialPersonasMineralesArcade

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.

GET/api/v1/account/username

Dice si un nombre está libre, antes de que alguien intente tomarlo.

No exige permiso · Cuenta en la cuota read

Parámetros

CampoTipoNotas
qobligatoriostringEl nombre a verificar. Uno que ni siquiera tiene forma de nombre responde available: false, en vez de error.
PUT/api/v1/account/username

Toma 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.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
usernameobligatoriostringDe 3 a 24 caracteres entre a-z, 0-9 y _, sin empezar ni terminar con _.
PATCH/api/v1/account/username

Renombra. Hay un periodo de espera entre un cambio y el siguiente, y la respuesta trae next_change_at para decir cuándo termina.

No exige permiso · Cuenta en la cuota write

GET/api/v1/index

Contenido público reciente para indexadores. Hasta 1000 elementos por tipo: reviews, entries, lists y screenshots. RLS define la visibilidad.

Permiso profile.read · Cuenta en la cuota read

POST/api/v1/account/bootstrap

Prepara el perfil tras iniciar sesión. Solo sesión. adopt_twitch=true adopta la identidad Twitch existente.

No exige permiso · Cuenta en la cuota write

GET/api/v1/account/state

Suspensió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.

No exige permiso · Cuenta en la cuota read

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"
  }
}
GET/api/v1/account/birth-date

Devuelve 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.

No exige permiso · Cuenta en la cuota read

PUT/api/v1/account/birth-date

Guarda la fecha de nacimiento. La regla de edad es de la base, que rechaza en vez de guardar una fecha demasiado reciente.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
birth_dateobligatoriostringUna fecha como YYYY-MM-DD.
GET/api/v1/account/sessions

Dónde está iniciada la cuenta, y en qué.

No exige permiso · Cuenta en la cuota read

DELETE/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.

No exige permiso · Cuenta en la cuota write

GET/api/v1/account/identities

Los proveedores con los que esta cuenta puede entrar.

No exige permiso · Cuenta en la cuota read

GET/api/v1/account/export

Todo 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.

No exige permiso · Cuenta en la cuota read

DELETE/api/v1/account/data

Tira 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.

No exige permiso · Cuenta en la cuota write

Parámetros

CampoTipoNotas
categoryobligatoriostringlibrary, reviews, sessions, journeys, lists, screenshots, comments, views o everything.

Cuerpo

CampoTipoNotas
passwordstringLa contraseña actual. Obligatoria, siempre, para una cuenta que la tiene. Sin ella, 403 forbidden con reason password_required; incorrecta, reason password_incorrect.
codestringPara 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.
GET/api/v1/account/keys

Las 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.

No exige permiso · Cuenta en la cuota read

POST/api/v1/account/keys

Crea 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.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
app_idobligatoriouuidLa aplicación de la llave. Toda llave pertenece a una, hecha en el portal de desarrolladores.
nameobligatoriostringHasta 60 caracteres.
expires_in_daysintegerEn cuántos días expira. null para nunca.
DELETE/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í.

No exige permiso · Cuenta en la cuota write

DELETE/api/v1/account/keys/{id}

Revoca una llave. Vale desde la petición siguiente.

No exige permiso · Cuenta en la cuota write

GET/api/v1/account/apps

Las 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.

No exige permiso · Cuenta en la cuota read

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 }
      }
    }
  ]
}
POST/api/v1/account/apps

Crea una aplicación, sin permisos. Hasta 10 por cuenta.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
nameobligatoriostringHasta 60 caracteres.
descriptionstringHasta 400 caracteres.
GET/api/v1/account/apps/{id}

Una aplicación y sus llaves, las vivas primero, con el mismo arcade de la lista (null sin Arcade).

No exige permiso · Cuenta en la cuota read

PATCH/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.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
namestringHasta 60 caracteres.
descriptionstringHasta 400 caracteres.
scopesarrayLos permisos de la aplicación, completos: los que queden fuera se quitan.
DELETE/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.

No exige permiso · Cuenta en la cuota write

GET/api/v1/account/apps/{id}/keys

Las llaves de una aplicación. Nunca el token.

No exige permiso · Cuenta en la cuota read

POST/api/v1/account/apps/{id}/keys

Crea una llave para la aplicación, con sus permisos. El token viene una vez, en esta respuesta.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
nameobligatoriostringHasta 60 caracteres.
expires_in_daysintegerEn cuántos días expira, de 1 a 3650. null para nunca.
POST/api/v1/account/apps/{id}/icon

Cambia 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.

No exige permiso · Cuenta en la cuota write

DELETE/api/v1/account/apps/{id}/icon

Quita el ícono; la aplicación vuelve a mostrar sus iniciales.

No exige permiso · Cuenta en la cuota write

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.

Social

Con quién está conectado el dueño.

Notificaciones

La bandeja, ya resuelta.