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 (403conreasonmfa_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 recibe403 forbiddenconreasonreauthentication_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.
/api/ v1/ arcade/ appsEl 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.
Parámetros
| Campo | Tipo | Notas |
|---|---|---|
q | string | Busca por nombre. Hasta 80 caracteres. |
cursor | string | El next de la página anterior. |
limit | integer | De 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
}/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.
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"
}
}/api/ v1/ arcade/ jwksLas 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.
Ejemplo
{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "...",
"kid": "arc-2026-10",
"alg": "ES256",
"use": "sig"
}
]
}/api/ v1/ account/ arcade/ grantsLos 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.
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
}
]
}/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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
nicknameobligatorio | string | De 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. |
/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.
Parámetros
| Campo | Tipo | Notas |
|---|---|---|
forget | boolean | true para olvidar en vez de revocar. |
/api/ v1/ account/ apps/ {id}/ arcadeEl 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.
/api/ v1/ account/ apps/ {id}/ arcadeActiva 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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
slugobligatorio | string | De 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_versionobligatorio | string | La 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. |
/api/ v1/ account/ arcade/ termsAcepta 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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
terms_versionobligatorio | string | La versión que la persona leyó y aceptó: la de eligibility.terms.current. |
Ejemplo
{
"data": {
"terms": {
"current": "2026-10-13",
"accepted": "2026-10-13"
}
}
}/api/ v1/ account/ apps/ {id}/ arcade/ listingCrea 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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
nameobligatorio | string | De 2 a 40 caracteres, sin palabras reservadas como uloggd, official o support. |
taglineobligatorio | string | Hasta 80 caracteres. |
descriptionobligatorio | object | default_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. |
tagsobligatorio | array | Hasta 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_ratingobligatorio | string | La 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. |
orientationobligatorio | string | any, landscape o portrait. |
platformsobligatorio | array | desktop, mobile o los dos; al menos uno. |
privacy_urlobligatorio | string | Una URL https. |
terms_urlobligatorio | string | Una URL https, o null. |
support_urlobligatorio | string | Una URL https. |
controller_nameobligatorio | string | Quién responde por los datos de los jugadores, de 2 a 120 caracteres. |
controller_countryobligatorio | string | Un 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_contactobligatorio | string | Un correo o una URL https, hasta 254 caracteres. |
/api/ v1/ account/ apps/ {id}/ arcade/ listing/ submitEnví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.
/api/ v1/ account/ apps/ {id}/ arcade/ mediaPone 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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
kindobligatorio | string | icon, tile, cover o screenshot. |
positionobligatorio | integer | 0 para icon, tile y cover; de 0 a 5 para screenshot. |
fileobligatorio | file | La imagen. |
/api/ v1/ account/ apps/ {id}/ arcade/ mediaVací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.
Parámetros
| Campo | Tipo | Notas |
|---|---|---|
kindobligatorio | string | icon, tile, cover o screenshot. |
positionobligatorio | integer | 0 para icon, tile y cover; de 0 a 5 para screenshot. |
/api/ v1/ account/ apps/ {id}/ arcade/ releasesLos 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.
/api/ v1/ account/ apps/ {id}/ arcade/ releasesCrea 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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
entry_urlobligatorio | string | Una 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. |
capabilitiesobligatorio | array | pointer-lock, background-audio, los dos o ninguno. |
scopesobligatorio | array | identify, o vacío. |
orientationobligatorio | string | any, landscape o portrait. |
platformsobligatorio | array | desktop, mobile o los dos; al menos uno. |
third_partiesobligatorio | array | Cada tercero que carga el juego: hasta 20 { origin, purpose }, con purpose de hasta 200 caracteres. |
data_events_urlobligatorio | string | Adó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. |
notesobligatorio | string | Notas para quien revisa, hasta 2000 caracteres. |
/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.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ checkVerificar 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.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ submitEnviar 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.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ withdrawRetirar: saca de la cola de revisión un lanzamiento enviado. Responde { data: { release } }. Solo sesión: una llave recibe 403 forbidden.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ livePoner 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.
/api/ v1/ account/ apps/ {id}/ arcade/ overrideLa 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.
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
}
}
}/api/ v1/ account/ apps/ {id}/ arcade/ overrideGuarda 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.
Cuerpo
| Campo | Tipo | Notas |
|---|---|---|
urlobligatorio | string | Hasta 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_idobligatorio | uuid | El lanzamiento base, de la misma aplicación: en borrador, enviado, en revisión o aprobado. |
/api/ v1/ account/ apps/ {id}/ arcade/ overrideBorra 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.
/api/ v1/ account/ apps/ {id}/ arcade/ removeQuitar 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.
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"
}
}| Estado | code | reason en estas rutas |
|---|---|---|
| 403 | forbidden | not_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 |
| 404 | not_found | app_not_found, release_not_found, listing_not_found, check_not_found, override_not_found |
| 400 | invalid_request | slug_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) |
| 409 | conflict | slug_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 |
| 429 | rate_limited | rate_limited, con retry_after en segundos |
| 503 | unavailable | identity_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 Arcade | 5 por cuenta al día |
| Verificaciones de URL | 20 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 tienda | 5 de cada uno por aplicación al día |
| Subidas de imagen | 30 por aplicación al día |
| Cambios de apodo | 10 por cuenta al día |
| Guardados de la URL de desarrollo | 20 por aplicación al día; borrarla no cuenta |
| Aceptar de nuevo los términos de desarrollador | 10 por cuenta al día |
| Consultas del host público de la URL de desarrollo | 60 por cuenta por hora, contando las rechazadas |