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

Arcade

El directorio, las páginas de la tienda y las llaves de identidad, y las rutas solo para sesión detrás del portal y de Ajustes.

Aquí viven tres tipos de ruta. Cómo funciona Arcade, y cómo hacer un juego para él, está en las guías de Arcade.

  • Públicas: el directorio, una página de la tienda y las llaves de identidad responden a cualquiera, sin llave y sin sesión.
  • Las del desarrollador, en /api/v1/account/apps/{id}/arcade: la página de la tienda, los lanzamientos y la URL de desarrollo de un juego; y /api/v1/account/arcade/terms, que acepta de nuevo los términos de desarrollador después de que cambian. Solo para sesión, y la base de datos no cambia nada para una sesión que no pasó por la verificación en dos pasos (403 con reason mfa_required). Enviar un lanzamiento o la página de la tienda, poner un lanzamiento en vivo y quitar el juego exigen además una sesión iniciada en los últimos 15 minutos: una más antigua recibe 403 forbidden con reason reauthentication_required, y la salida es volver a iniciar sesión.
  • Las del jugador, en /api/v1/account/arcade/grants: los juegos a los que el jugador dejó saber quién es. Solo para sesión.

Una llave recibe 403 forbidden en toda ruta solo para sesión: en esta fase, ningún permiso le abre a una llave un juego, ni los juegos de un jugador.

Toda respuesta viene en data, como en el resto de la API. El directorio añade next, su cursor; el conjunto de llaves es la única excepción, un JSON Web Key Set corriente que cualquier verificador lee.

GET/api/v1/arcade/apps

El directorio de Arcade: los juegos listados, la aprobación más reciente primero, leídos solo de las páginas de la tienda aprobadas. Público: responde sin llave ni sesión. Responde { data, next }; next es el cursor de la página siguiente, o null en la última.

No exige permiso · Cuenta en la cuota read

Parámetros

CampoTipoNotas
qstringBusca por nombre. Hasta 80 caracteres.
cursorstringEl next de la página anterior.
limitintegerDe 1 a 60. Por defecto 30.

Ejemplo

{
  "data": [
    {
      "slug": "orbit-runner",
      "name": "Orbit Runner",
      "tagline": "Dodge asteroids for as long as you can.",
      "icon_url": "...",
      "tile_url": null,
      "tags": [],
      "age_rating": "L",
      "controller_name": "Orbit Studio",
      "platforms": ["desktop", "mobile"]
    }
  ],
  "next": null
}
GET/api/v1/arcade/apps/{slug}

La página de la tienda de un juego, hecha solo con la versión aprobada: lo que el jugador lee antes de jugar, nunca el borrador del desarrollador. Público. Además de los campos del directorio, trae description (el texto por idioma, con default_locale), cover_url, screenshots, orientation, privacy_url, terms_url, support_url, controller_country, privacy_contact, host (dónde se ejecuta el juego, en ASCII), scopes, capabilities y reviewed_at. Sin un juego listado con ese slug, 404 not_found con reason app_not_found.

No exige permiso · Cuenta en la cuota read

Ejemplo

{
  "data": {
    "slug": "orbit-runner",
    "name": "Orbit Runner",
    "tagline": "Dodge asteroids for as long as you can.",
    "icon_url": "...",
    "tile_url": null,
    "tags": [],
    "age_rating": "L",
    "controller_name": "Orbit Studio",
    "platforms": ["desktop", "mobile"],
    "description": { "default_locale": "en", "en": "..." },
    "cover_url": null,
    "screenshots": [],
    "orientation": "landscape",
    "privacy_url": "https://orbit.example.com/privacy",
    "terms_url": null,
    "support_url": "https://orbit.example.com/support",
    "controller_country": "BR",
    "privacy_contact": "[email protected]",
    "host": "orbit.example.com",
    "scopes": ["identify"],
    "capabilities": [],
    "reviewed_at": "2026-10-20T15:00:00.000Z"
  }
}
GET/api/v1/arcade/jwks

Las llaves públicas que verifican los tokens de identidad y de eventos de datos: un JSON Web Key Set, { keys }, sin data alrededor, con cada llave que firma o está por firmar o salir. Pública, con Cache-Control: public, max-age=300, stale-while-revalidate=60; guárdalo 10 minutos como máximo. Sin llaves configuradas, 503 con reason identity_unavailable, nunca un conjunto vacío. Descárgalo siempre de https://uloggd.com, nunca de una dirección *.squareweb.app.

No exige permiso · Cuenta en la cuota read

Ejemplo

{
  "keys": [
    {
      "kty": "EC",
      "crv": "P-256",
      "x": "...",
      "y": "...",
      "kid": "arc-2026-10",
      "alg": "ES256",
      "use": "sig"
    }
  ]
}
GET/api/v1/account/arcade/grants

Los juegos de Arcade a los que la cuenta dejó saber quién es, para Ajustes > Arcade: app_id, slug, name, icon_url, scopes, nickname, granted_at y revoked_at (con valor tras Revocar). Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota read

Ejemplo

{
  "data": [
    {
      "app_id": "...",
      "slug": "orbit-runner",
      "name": "Orbit Runner",
      "icon_url": "...",
      "scopes": ["identify"],
      "nickname": "Brave Comet 42",
      "granted_at": "2026-10-21T18:00:00.000Z",
      "revoked_at": null
    }
  ]
}
PATCH/api/v1/account/arcade/grants/{appId}

Cambia el apodo que conoce un juego. Responde { data: { grant } }, y el servidor del juego recibe un evento de datos nickname_changed. Hasta 10 cambios al día por cuenta. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
nicknameobligatoriostringDe 2 a 32 caracteres, sin espacio en los extremos ni caracteres de control, bidireccionales o de ancho cero. Si no, 400 con reason nickname_invalid.
DELETE/api/v1/account/arcade/grants/{appId}

Revocar: el juego deja de recibir tokens al instante, un juego abierto se entera con el evento GRANT_UPDATE, y su servidor recibe un evento de datos grant_revoked. El id del jugador en ese juego sigue siendo el mismo si vuelve a aceptar. Con ?forget=true es Olvidar este juego: el evento es grant_forgotten, y la próxima vez el juego recibe un id nuevo. Responde { data: null }. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

Parámetros

CampoTipoNotas
forgetbooleantrue para olvidar en vez de revocar.
GET/api/v1/account/apps/{id}/arcade

El lugar de una aplicación en Arcade: { data: { eligibility, app } }. eligibility dice lo que falta para publicar (allowlisted, two_factor, mfa_session, email_verified, account_age_days, adult, terms con current y accepted, banned, open_publishing, blocked, arcade_apps, y eligible cuando no falta nada). open_publishing dice si una cuenta que no fue invitada puede publicar; blocked, si moderación bloqueó la cuenta para publicar; arcade_apps trae used, los juegos de la cuenta en Arcade que no se quitaron, y limit, cuántos puede tener una cuenta no invitada (null en una cuenta invitada). Cuando terms.accepted es anterior a terms.current, la cuenta acepta de nuevo en POST /api/v1/account/arcade/terms. app es null hasta que se activa Arcade; después trae slug, status (draft, listed, hidden, suspended o removed), la página de la tienda (listing con approved, pending, draft y rejected: la revisión rechazada más reciente, cuando es más reciente que la aprobada, con los motivos y la nota de quien revisó en review, o null), releases, data_events (pending, todos los eventos aún no entregados ni fallidos; failed; oldest_pending_at; y held, cuántos de esos pendientes esperan un lanzamiento con URL de eventos), events, la línea de tiempo del juego, sin quién actuó, y notice: null, o lo que el desarrollador necesita saber ahora, con kind (suspended, flagged o hidden), reason y at. En una suspensión o un bloqueo, reason es el motivo que la moderación escribió para el desarrollador (null si no escribió nada); en un juego ocultado, invariant (fallaron dos verificaciones), provider_change o reports (denuncias lo retiraron hasta que moderación decida). Un juego bloqueado sigue con status listed, pero nadie puede abrirlo: es notice lo que dice si está en el aire. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota read

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

Activa Arcade en la aplicación: reserva el slug y registra los términos aceptados. 201 con { data: { app } }. La base de datos comprueba cada condición y dice cuál faltó: 403 con reason not_allowlisted (solo mientras la publicación abierta está apagada), two_factor_required, mfa_required, email_unverified, account_too_new, adult_required, terms_required (field terms_version), banned o publisher_blocked; 400 con slug_invalid o slug_reserved; 409 con slug_taken, already_enabled o arcade_app_limit (una cuenta no invitada ya tiene tantos juegos como eligibility.arcade_apps.limit). Hasta 5 al día por cuenta. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
slugobligatoriostringDe 3 a 40 caracteres entre a-z, 0-9 y guion, sin guion en los extremos. Es la dirección de la página de la tienda, y nunca se reutiliza.
terms_versionobligatoriostringLa versión de los términos de desarrollador de Arcade que la persona leyó y aceptó: la de eligibility.terms.current. El servidor la registra con el hash del texto que muestra, así que una versión distinta de la suya recibe 403 terms_required con field terms_version antes de llegar a la base de datos, aunque la base de datos ya la considere vigente (mientras uloggd se actualiza); inténtalo de nuevo en unos instantes.
POST/api/v1/account/arcade/terms

Acepta de nuevo los términos de desarrollador de Arcade, después de que cambiaron: sin eso, enviar páginas de la tienda y lanzamientos y poner un lanzamiento en vivo reciben 403 con reason terms_required. El servidor registra la versión aceptada con el hash del texto que muestra; el cuerpo solo dice la versión. Responde { data: { terms } }, con current y accepted, como eligibility.terms. Pide una sesión que pasó la verificación en dos pasos. Los rechazos: 403 con terms_required (field terms_version) cuando la versión no es la actual, mfa_required o banned; 400 con fields_invalid para un cuerpo con otro campo. Hasta 10 al día por cuenta, luego 429 rate_limited con retry_after. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
terms_versionobligatoriostringLa versión que la persona leyó y aceptó: la de eligibility.terms.current.

Ejemplo

{
  "data": {
    "terms": {
      "current": "2026-10-13",
      "accepted": "2026-10-13"
    }
  }
}
PUT/api/v1/account/apps/{id}/arcade/listing

Crea o actualiza el único borrador de la página de la tienda, con todos los campos. Responde { data: { listing } }. Los jugadores siguen viendo la versión aprobada hasta que un moderador aprueba la siguiente. Un borrador enviado ya no cambia: 409 con reason listing_locked. Un campo rechazado es 400 con reason fields_invalid y field, el nombre del primer campo rechazado; una palabra reservada en el nombre o en el eslogan llega como field name_reserved o tagline_reserved. Solo sesión: una llave recibe 403 forbidden. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
nameobligatoriostringDe 2 a 40 caracteres, sin palabras reservadas como uloggd, official o support.
taglineobligatoriostringHasta 80 caracteres.
descriptionobligatorioobjectdefault_locale (pt-BR, en o es) y el texto en pt-BR, en y es, hasta 2000 caracteres cada uno; el idioma por defecto no puede quedar vacío.
tagsobligatorioarrayHasta 5, de esta lista fija: action, adventure, arcade, board, card, casual, educational, fighting, horror, idle, music, platformer, puzzle, racing, retro, rhythm, roguelike, rpg, sandbox, shooter, simulation, sports, strategy, tower-defense, trivia, visual-novel, word.
age_ratingobligatoriostringLa autoclasificación ClassInd: L, 10, 12, 14 o 16. Una más alta vale al enviar; una más baja espera a la revisión.
orientationobligatoriostringany, landscape o portrait.
platformsobligatorioarraydesktop, mobile o los dos; al menos uno.
privacy_urlobligatoriostringUna URL https.
terms_urlobligatoriostringUna URL https, o null.
support_urlobligatoriostringUna URL https.
controller_nameobligatoriostringQuién responde por los datos de los jugadores, de 2 a 120 caracteres.
controller_countryobligatoriostringUn código ISO 3166-1 alfa-2, como BR. Fuera de Brasil, el consentimiento dice que los datos se tratarán fuera del país.
privacy_contactobligatoriostringUn correo o una URL https, hasta 254 caracteres.
POST/api/v1/account/apps/{id}/arcade/listing/submit

Envía a revisión el borrador de la página de la tienda. Responde { data: { listing } } y envía un correo al desarrollador. Hasta 5 envíos al día por aplicación. Solo sesión: una llave recibe 403 forbidden. Exige además una sesión iniciada en los últimos 15 minutos: una más antigua recibe 403 forbidden con reason reauthentication_required, y la salida es volver a iniciar sesión. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked. Pide además la versión actual de los términos de desarrollador aceptada: después de que cambian, 403 con reason terms_required hasta que la cuenta acepte de nuevo en POST /api/v1/account/arcade/terms.

No exige permiso · Cuenta en la cuota write

POST/api/v1/account/apps/{id}/arcade/media

Pone una imagen en un lugar del borrador de la página de la tienda, en multipart/form-data con kind, position y file (JPEG, PNG, WebP, GIF o AVIF, hasta 15 MB). icon y tile se tratan como avatares, cuadrados y con animación permitida; cover y screenshot como imágenes de diseño, solo fijas. Toda imagen pasa por la revisión de contenido. 201 con { data: { kind, position, image_url } }; una imagen rechazada es 400 con reason media_invalid y detail. Hasta 30 subidas al día por aplicación. Solo sesión: una llave recibe 403 forbidden. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
kindobligatoriostringicon, tile, cover o screenshot.
positionobligatoriointeger0 para icon, tile y cover; de 0 a 5 para screenshot.
fileobligatoriofileLa imagen.
DELETE/api/v1/account/apps/{id}/arcade/media

Vacía un lugar del borrador de la página de la tienda. Responde { data: { kind, position, image_url: null } }. Solo sesión: una llave recibe 403 forbidden. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked.

No exige permiso · Cuenta en la cuota write

Parámetros

CampoTipoNotas
kindobligatoriostringicon, tile, cover o screenshot.
positionobligatoriointeger0 para icon, tile y cover; de 0 a 5 para screenshot.
GET/api/v1/account/apps/{id}/arcade/releases

Los lanzamientos de la aplicación, en { data }. Cada uno trae los campos del POST, number, status (draft, submitted, in_review, approved, rejected, withdrawn o revoked), entry_origin, las fechas, review (la decisión, los motivos y la nota de quien revisó, sin el nombre), last_check, la última verificación, y live, previous_live, can_make_live y can_test. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota read

POST/api/v1/account/apps/{id}/arcade/releases

Crea un lanzamiento en borrador. 201 con { data: { release } }. Un campo rechazado es 400 con reason fields_invalid y field, el nombre del primer campo rechazado; pedir identify sin data_events_url es 400 con data_events_url_required. Solo sesión: una llave recibe 403 forbidden. Un url_denied sobre un nombre internacionalizado trae detail, el porqué (idn mientras Arcade no acepta esos nombres; idn_invalid, idn_script o idn_confusable cuando las reglas rechazan el nombre), y field, la URL de la que se trata: entry_url, data_events_url o third_parties.N.origin. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
entry_urlobligatoriostringUna URL https que cumple las reglas de URL de Arcade (hasta 512 caracteres, puerto 443, sin query ni fragmento); si no, 400 con reason url_invalid o url_denied.
capabilitiesobligatorioarraypointer-lock, background-audio, los dos o ninguno.
scopesobligatorioarrayidentify, o vacío.
orientationobligatoriostringany, landscape o portrait.
platformsobligatorioarraydesktop, mobile o los dos; al menos uno.
third_partiesobligatorioarrayCada tercero que carga el juego: hasta 20 { origin, purpose }, con purpose de hasta 200 caracteres.
data_events_urlobligatoriostringAdónde van los eventos de datos, o null. Obligatoria con identify, y con las mismas reglas de URL, salvo que el origen y la ruta pueden ser otros.
notesobligatoriostringNotas para quien revisa, hasta 2000 caracteres.
PUT/api/v1/account/apps/{id}/arcade/releases/{rid}

Sustituye un lanzamiento en borrador, con los campos del POST. Responde { data: { release } }. Un lanzamiento enviado nunca cambia: 409 con reason release_locked, y una URL nueva es un lanzamiento nuevo. Solo sesión: una llave recibe 403 forbidden. Un url_denied sobre un nombre internacionalizado trae detail, el porqué (idn mientras Arcade no acepta esos nombres; idn_invalid, idn_script o idn_confusable cuando las reglas rechazan el nombre), y field, la URL de la que se trata: entry_url, data_events_url o third_parties.N.origin. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked.

No exige permiso · Cuenta en la cuota write

POST/api/v1/account/apps/{id}/arcade/releases/{rid}/check

Verificar URL: descarga ahora, desde los servidores de uloggd, el archivo de prueba y la URL de entrada, y responde { data: { check } } con lo que vio: passed, proof_ok, redirect_ok, framing_ok, status_code, location, content_type, entry_sha256, changed_since_approval, provider, network, signals y error. Hasta 20 verificaciones al día por aplicación, contando las de enviar y poner en vivo. Solo sesión: una llave recibe 403 forbidden. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked.

No exige permiso · Cuenta en la cuota write

POST/api/v1/account/apps/{id}/arcade/releases/{rid}/submit

Enviar a revisión: hace una verificación nueva y, si pasa, envía el lanzamiento y reserva el origen para la aplicación. Responde { data: { release, check } } y envía un correo al desarrollador. Una verificación fallida es 409 con reason check_failed; un origen que ya tiene otra aplicación, 409 con origin_in_use. Hasta 5 envíos al día por aplicación. Solo sesión: una llave recibe 403 forbidden. Exige además una sesión iniciada en los últimos 15 minutos: una más antigua recibe 403 forbidden con reason reauthentication_required, y la salida es volver a iniciar sesión. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked. Pide además la versión actual de los términos de desarrollador aceptada: después de que cambian, 403 con reason terms_required hasta que la cuenta acepte de nuevo en POST /api/v1/account/arcade/terms. Un url_denied sobre un nombre internacionalizado trae detail, el porqué (idn mientras Arcade no acepta esos nombres; idn_invalid, idn_script o idn_confusable cuando las reglas rechazan el nombre), y field, la URL de la que se trata: entry_url, data_events_url o third_parties.N.origin. El host pasa también por lo que moderación decidió sobre redes y dominios: 400 con reason url_denied, detail network y field entry_url cuando la red o el registrador del host está bloqueado, y 409 con domain_too_new cuando el dominio se registró hace muy poco para Arcade.

No exige permiso · Cuenta en la cuota write

POST/api/v1/account/apps/{id}/arcade/releases/{rid}/withdraw

Retirar: saca de la cola de revisión un lanzamiento enviado. Responde { data: { release } }. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

POST/api/v1/account/apps/{id}/arcade/releases/{rid}/live

Poner en vivo: pone un lanzamiento aprobado delante de los jugadores, o trae de vuelta el que estaba en vivo antes. Antes hace una verificación nueva, y responde { data: { app, check } } con un correo al desarrollador. Los rechazos, en 409: release_not_approved, check_failed, approval_too_old (la aprobación tiene más de 90 días), provider_changed (el proveedor de alojamiento no es el de la aprobación) y rollback_too_far (solo puede volver el lanzamiento en vivo justo antes; uno más antiguo se reenvía como lanzamiento nuevo). Solo sesión: una llave recibe 403 forbidden. Exige además una sesión iniciada en los últimos 15 minutos: una más antigua recibe 403 forbidden con reason reauthentication_required, y la salida es volver a iniciar sesión. Una cuenta que moderación bloqueó para publicar recibe 403 con reason publisher_blocked. Pide además la versión actual de los términos de desarrollador aceptada: después de que cambian, 403 con reason terms_required hasta que la cuenta acepte de nuevo en POST /api/v1/account/arcade/terms. Un url_denied sobre un nombre internacionalizado trae detail, el porqué (idn mientras Arcade no acepta esos nombres; idn_invalid, idn_script o idn_confusable cuando las reglas rechazan el nombre), y field, la URL de la que se trata: entry_url, data_events_url o third_parties.N.origin. El host pasa también por lo que moderación decidió sobre redes y dominios: 400 con reason url_denied, detail network y field entry_url cuando la red o el registrador del host está bloqueado, y 409 con domain_too_new cuando el dominio se registró hace muy poco para Arcade.

No exige permiso · Cuenta en la cuota write

GET/api/v1/account/apps/{id}/arcade/override

La URL de desarrollo de la aplicación: { data: { override } }, null cuando no se guardó ninguna. override trae url, origin, host (el origen sin el esquema, con el puerto), loopback (si es la máquina del propio dueño), release_id y release_number (el lanzamiento base, del que vienen las capacidades, los permisos, la orientación y las plataformas), set_at, expires_at, expired, ready (se abre ahora: no caducó y nada la bloquea), blocked_reason (lo que la bloquea, en el vocabulario de los rechazos: override_expired, not_playable, release_not_found, listing_not_found, origin_in_use o url_denied; null cuando nada la bloquea) y changes_left (lo que queda de los 20 guardados del día). Solo su dueño, en una sesión que pasó el segundo factor (la URL suele ser un túnel público a la máquina del dueño): 403 con reason not_owner para otra cuenta, 403 con mfa_required para una sesión que aún debe el código, 404 con app_not_found para una aplicación sin Arcade. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota read

Ejemplo

{
  "data": {
    "override": {
      "url": "http://localhost:5173/",
      "origin": "http://localhost:5173",
      "host": "localhost:5173",
      "loopback": true,
      "release_id": "...",
      "release_number": 2,
      "set_at": "2026-10-14T18:00:00.000Z",
      "expires_at": "2026-10-15T18:00:00.000Z",
      "expired": false,
      "ready": true,
      "blocked_reason": null,
      "changes_left": 19
    }
  }
}
PUT/api/v1/account/apps/{id}/arcade/override

Guarda la URL de desarrollo durante 24 horas, que solo su dueño abre en el reproductor, con lo que pide el lanzamiento base; guardarla de nuevo, con la misma URL u otra, renueva las 24 horas. Responde { data: { override } }. Pide una sesión que pasó la verificación en dos pasos. No se descarga nada de la URL; un host público tiene que resolver solo a direcciones públicas. Los rechazos: 400 con reason url_invalid o url_denied (field url) o fields_invalid (con field); 403 con not_owner, mfa_required, banned, publisher_blocked o not_playable; 404 con app_not_found o release_not_found; 409 con origin_in_use (el origen es de un juego de otra cuenta). Hasta 20 guardados al día por aplicación, luego 429 rate_limited con retry_after; solo cuenta un guardado que se queda, y un rechazo, incluido el de un host que no resuelve a direcciones públicas, no gasta ninguno. La consulta del host público tiene un límite propio: hasta 60 por hora por cuenta, contadas antes de consultar, aunque la consulta o el guardado se rechacen, luego 429 rate_limited con retry_after; la máquina del propio dueño no se consulta y no cuenta. Un juego abierto en la URL anterior se cierra en 30 segundos como mucho cuando la nueva está en otro origen; en el mismo origen conserva la ruta y el lanzamiento base con los que se abrió hasta que se vuelve a abrir. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

Cuerpo

CampoTipoNotas
urlobligatoriostringHasta 512 caracteres, sin query ni fragmento. http o https en la máquina del dueño (localhost, un nombre bajo .localhost o 127.0.0.1, en cualquier puerto), o https en un host público, en cualquier puerto. Nunca una dirección IP que no sea 127.0.0.1, ni el host en el que se abrió uloggd.
release_idobligatoriouuidEl lanzamiento base, de la misma aplicación: en borrador, enviado, en revisión o aprobado.
DELETE/api/v1/account/apps/{id}/arcade/override

Borra la URL de desarrollo: un juego abierto en ella se cierra en 30 segundos como mucho. Responde { data: { override: null } }, también cuando no había nada que borrar. No cuenta en el límite del día. 403 con not_owner, mfa_required o banned; 404 con app_not_found. Solo sesión: una llave recibe 403 forbidden.

No exige permiso · Cuenta en la cuota write

POST/api/v1/account/apps/{id}/arcade/remove

Quitar de Arcade: el juego sale para siempre, el slug y el origen nunca se reutilizan, y las pruebas se guardan durante 180 días. Responde { data: { app } } y envía un correo al desarrollador. Solo sesión: una llave recibe 403 forbidden. Exige además una sesión iniciada en los últimos 15 minutos: una más antigua recibe 403 forbidden con reason reauthentication_required, y la salida es volver a iniciar sesión.

No exige permiso · Cuenta en la cuota write

La URL de desarrollo

GET, PUT y DELETE /api/v1/account/apps/{id}/arcade/override leen, guardan y borran la URL de desarrollo de una aplicación, la dirección que su dueño abre en el reproductor de uloggd mientras el juego corre en su propia máquina o detrás de un túnel. Son solo para sesión, y las tres piden una sesión verificada con la verificación en dos pasos, incluso para leer: la URL suele ser un túnel hasta la máquina del desarrollador.

Abrirla es una apertura de tipo override, solo para el dueño de la aplicación, en mode test, en /developers/applications/{id}/arcade/override/play. Esa apertura se rechaza con override_not_found cuando no hay ninguna URL guardada, y con override_expired cuando pasaron sus 24 horas. Guardarla de nuevo las renueva.

Rechazos

Un rechazo de Arcade trae un reason, una palabra para actuar, junto al code de siempre (los otros miembros que puede traer un rechazo están en Errores):

{
  "error": {
    "code": "conflict",
    "message": "Another app already uses that origin.",
    "reason": "origin_in_use"
  }
}
Estadocodereason en estas rutas
403forbiddennot_owner, not_allowlisted, two_factor_required, mfa_required, email_unverified, account_too_new, adult_required, terms_required, banned, publisher_blocked, grant_required, reauthentication_required, not_playable
404not_foundapp_not_found, release_not_found, listing_not_found, check_not_found, override_not_found
400invalid_requestslug_invalid, slug_reserved, url_invalid, url_denied (con field y detail cuando dice el porqué, como en un nombre internacionalizado), data_events_url_required, nickname_invalid, fields_invalid (con field, el nombre de un campo, como en los de URL), media_invalid (con detail)
409conflictslug_taken, already_enabled, origin_in_use, release_locked, listing_locked, release_not_approved, check_required, check_failed, check_stale, approval_too_old, provider_changed, rollback_too_far, remove_from_arcade_first, override_expired, arcade_app_limit, domain_too_new
429rate_limitedrate_limited, con retry_after en segundos
503unavailableidentity_unavailable, del conjunto de llaves mientras no hay ninguna llave configurada

Pueden aparecer motivos nuevos. Un cliente que encuentra uno que no conoce debe actuar según el code.

Límites

QuéLímite
Activar Arcade5 por cuenta al día
Verificaciones de URL20 por aplicación al día, contando las de enviar y poner en vivo
Envíos de lanzamiento, envíos de la página de la tienda5 de cada uno por aplicación al día
Subidas de imagen30 por aplicación al día
Cambios de apodo10 por cuenta al día
Guardados de la URL de desarrollo20 por aplicación al día; borrarla no cuenta
Aceptar de nuevo los términos de desarrollador10 por cuenta al día
Consultas del host público de la URL de desarrollo60 por cuenta por hora, contando las rechazadas

Minerales

La cartera y lo que pasa por ella.