Arcade
O diretório, as páginas da loja e as chaves de identidade, e as rotas só para sessão por trás do portal e das Configurações.
Três tipos de rota moram aqui. Como o Arcade funciona, e como fazer um jogo para ele, está nos guias do Arcade.
- Públicas: o diretório, uma página da loja e as chaves de identidade respondem a qualquer um, sem chave e sem sessão.
- As do desenvolvedor, em
/api/v1/account/apps/{id}/arcade: a página da loja, os lançamentos e a URL de desenvolvimento de um jogo; e/api/v1/account/arcade/terms, que aceita de novo os termos de desenvolvedor depois que eles mudam. Só para sessão, e o banco não muda nada para uma sessão que não passou pela verificação em duas etapas (403comreasonmfa_required). Enviar um lançamento ou a página da loja, tornar um lançamento ao vivo e remover o jogo exigem também uma sessão que entrou nos últimos 15 minutos: uma mais antiga recebe403 forbiddencomreasonreauthentication_required, e o caminho é entrar de novo. - As do jogador, em
/api/v1/account/arcade/grants: os jogos que o jogador deixou saber quem ele é. Só para sessão.
Uma chave recebe 403 forbidden em toda rota só para sessão: nesta fase,
nenhum escopo abre a uma chave um jogo, ou os jogos de um jogador.
Toda resposta vem em data, como no resto da API. O diretório acrescenta
next, o cursor dele; o conjunto de chaves é a única exceção, um JSON Web Key
Set comum que qualquer verificador lê.
/api/ v1/ arcade/ appsO diretório do Arcade: os jogos listados, a aprovação mais recente primeiro, lidos só das páginas da loja aprovadas. Público: responde sem chave nem sessão. Responde { data, next }; next é o cursor da página seguinte, ou null na última.
Parâmetros
| Campo | Tipo | Observações |
|---|---|---|
q | string | Busca pelo nome. Até 80 caracteres. |
cursor | string | O next da página anterior. |
limit | integer | De 1 a 60. O padrão é 30. |
Exemplo
{
"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}A página da loja de um jogo, montada só da versão aprovada: o que o jogador lê antes de jogar, nunca o rascunho do desenvolvedor. Público. Além dos campos do diretório, traz description (o texto por idioma, com default_locale), cover_url, screenshots, orientation, privacy_url, terms_url, support_url, controller_country, privacy_contact, host (onde o jogo roda, em ASCII), scopes, capabilities e reviewed_at. Sem jogo listado com esse slug, 404 not_found com reason app_not_found.
Exemplo
{
"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/ jwksAs chaves públicas que verificam os tokens de identidade e de eventos de dados: um JSON Web Key Set, { keys }, sem data em volta, com cada chave que assina ou está para assinar ou sair. Pública, com Cache-Control: public, max-age=300, stale-while-revalidate=60; guarde por no máximo 10 minutos. Sem chaves configuradas, 503 com reason identity_unavailable, nunca um conjunto vazio. Busque sempre em https://uloggd.com, nunca num endereço *.squareweb.app.
Exemplo
{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "...",
"kid": "arc-2026-10",
"alg": "ES256",
"use": "sig"
}
]
}/api/ v1/ account/ arcade/ grantsOs jogos do Arcade que a conta deixou saber quem ela é, para Configurações > Arcade: app_id, slug, name, icon_url, scopes, nickname, granted_at e revoked_at (preenchido depois de Revogar). Apenas sessão: uma chave recebe 403 forbidden.
Exemplo
{
"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}Troca o apelido que um jogo conhece. Responde { data: { grant } }, e o servidor do jogo recebe um evento de dados nickname_changed. Até 10 trocas por dia por conta. Apenas sessão: uma chave recebe 403 forbidden.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
nicknameobrigatório | string | De 2 a 32 caracteres, sem espaço nas pontas nem caracteres de controle, bidirecionais ou de largura zero. Fora disso, 400 com reason nickname_invalid. |
/api/ v1/ account/ arcade/ grants/ {appId}Revogar: o jogo deixa de receber tokens na hora, um jogo aberto fica sabendo pelo evento GRANT_UPDATE, e o servidor dele recebe um evento de dados grant_revoked. O id do jogador nesse jogo continua o mesmo se ele aceitar de novo. Com ?forget=true é Esquecer este jogo: o evento é grant_forgotten, e na próxima vez o jogo recebe um id novo. Responde { data: null }. Apenas sessão: uma chave recebe 403 forbidden.
Parâmetros
| Campo | Tipo | Observações |
|---|---|---|
forget | boolean | true para esquecer em vez de revogar. |
/api/ v1/ account/ apps/ {id}/ arcadeO lugar de um aplicativo no Arcade: { data: { eligibility, app } }. eligibility diz o que falta para publicar (allowlisted, two_factor, mfa_session, email_verified, account_age_days, adult, terms com current e accepted, banned, open_publishing, blocked, arcade_apps, e eligible quando nada falta). open_publishing diz se uma conta que não foi convidada pode publicar; blocked, se a moderação bloqueou a conta de publicar; arcade_apps traz used, os jogos da conta no Arcade que não foram removidos, e limit, quantos uma conta não convidada pode ter (null numa conta convidada). Quando terms.accepted é anterior a terms.current, a conta aceita de novo em POST /api/v1/account/arcade/terms. app vem null até o Arcade ser ativado; depois traz slug, status (draft, listed, hidden, suspended ou removed), a página da loja (listing com approved, pending, draft e rejected: a revisão recusada mais nova, quando é mais nova que a aprovada, com os motivos e a nota de quem revisou em review, ou null), releases, data_events (pending, todos os eventos ainda não entregues nem falhos; failed; oldest_pending_at; e held, quantos desses pendentes esperam um lançamento com URL de eventos), events, a linha do tempo do jogo, sem quem agiu, e notice: null, ou o que o desenvolvedor precisa saber agora, com kind (suspended, flagged ou hidden), reason e at. Numa suspensão ou num bloqueio, reason é o motivo que a moderação escreveu para o desenvolvedor (null se não escreveu); num jogo ocultado, invariant (duas verificações falharam), provider_change ou reports (denúncias o tiraram do ar até a moderação decidir). Um jogo bloqueado continua com status listed, mas ninguém consegue abri-lo: é notice que diz se ele está no ar. Apenas sessão: uma chave recebe 403 forbidden.
/api/ v1/ account/ apps/ {id}/ arcadeAtiva o Arcade no aplicativo: reserva o slug e registra os termos aceitos. 201 com { data: { app } }. O banco confere cada condição e diz qual faltou: 403 com reason not_allowlisted (só enquanto a publicação aberta está desligada), two_factor_required, mfa_required, email_unverified, account_too_new, adult_required, terms_required (field terms_version), banned ou publisher_blocked; 400 com slug_invalid ou slug_reserved; 409 com slug_taken, already_enabled ou arcade_app_limit (uma conta não convidada já tem tantos jogos quanto eligibility.arcade_apps.limit). Até 5 por dia por conta. Apenas sessão: uma chave recebe 403 forbidden.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
slugobrigatório | string | De 3 a 40 caracteres entre a-z, 0-9 e hífen, sem hífen nas pontas. É o endereço da página da loja, e nunca é reaproveitado. |
terms_versionobrigatório | string | A versão dos termos de desenvolvedor do Arcade que a pessoa leu e aceitou: a de eligibility.terms.current. O servidor a registra com o hash do texto que ele mostra, então uma versão diferente da dele recebe 403 terms_required com field terms_version antes de chegar ao banco, mesmo quando o banco já a considera atual (enquanto o uloggd é atualizado); tente de novo em instantes. |
/api/ v1/ account/ arcade/ termsAceita de novo os termos de desenvolvedor do Arcade, depois que eles mudaram: sem isso, enviar páginas da loja e lançamentos e tornar um lançamento ao vivo recebem 403 com reason terms_required. O servidor registra a versão aceita com o hash do texto que ele mostra; o corpo só diz a versão. Responde { data: { terms } }, com current e accepted, como eligibility.terms. Pede uma sessão que passou pela verificação em duas etapas. As recusas: 403 com terms_required (field terms_version) quando a versão não é a atual, mfa_required ou banned; 400 com fields_invalid para um corpo com outro campo. Até 10 por dia por conta, depois 429 rate_limited com retry_after. Apenas sessão: uma chave recebe 403 forbidden.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
terms_versionobrigatório | string | A versão que a pessoa leu e aceitou: a de eligibility.terms.current. |
Exemplo
{
"data": {
"terms": {
"current": "2026-10-13",
"accepted": "2026-10-13"
}
}
}/api/ v1/ account/ apps/ {id}/ arcade/ listingCria ou atualiza o único rascunho da página da loja, com todos os campos. Responde { data: { listing } }. Os jogadores continuam vendo a versão aprovada até um moderador aprovar a próxima. Um rascunho enviado não muda mais: 409 com reason listing_locked. Um campo recusado é 400 com reason fields_invalid e field, o nome do primeiro campo recusado; uma palavra reservada no nome ou na frase de efeito vem como field name_reserved ou tagline_reserved. Apenas sessão: uma chave recebe 403 forbidden. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
nameobrigatório | string | De 2 a 40 caracteres, sem palavras reservadas como uloggd, oficial ou suporte. |
taglineobrigatório | string | Até 80 caracteres. |
descriptionobrigatório | object | default_locale (pt-BR, en ou es) e o texto em pt-BR, en e es, até 2000 caracteres cada; o idioma padrão não pode ficar vazio. |
tagsobrigatório | array | Até 5, desta lista fixa: 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_ratingobrigatório | string | A autoclassificação ClassInd: L, 10, 12, 14 ou 16. Uma mais alta vale já no envio; uma mais baixa espera a revisão. |
orientationobrigatório | string | any, landscape ou portrait. |
platformsobrigatório | array | desktop, mobile ou os dois; pelo menos um. |
privacy_urlobrigatório | string | Uma URL https. |
terms_urlobrigatório | string | Uma URL https, ou null. |
support_urlobrigatório | string | Uma URL https. |
controller_nameobrigatório | string | Quem responde pelos dados dos jogadores, de 2 a 120 caracteres. |
controller_countryobrigatório | string | Um código ISO 3166-1 alfa-2, como BR. Fora do Brasil, o consentimento diz que os dados serão tratados fora do país. |
privacy_contactobrigatório | string | Um e-mail ou uma URL https, até 254 caracteres. |
/api/ v1/ account/ apps/ {id}/ arcade/ listing/ submitEnviar para revisão o rascunho da página da loja. Responde { data: { listing } } e manda um e-mail ao desenvolvedor. Até 5 envios por dia por aplicativo. Apenas sessão: uma chave recebe 403 forbidden. Exige também uma sessão que entrou nos últimos 15 minutos: uma mais antiga recebe 403 forbidden com reason reauthentication_required, e o caminho é entrar de novo. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked. Pede também a versão atual dos termos de desenvolvedor aceita: depois que eles mudam, 403 com reason terms_required até a conta aceitar de novo em POST /api/v1/account/arcade/terms.
/api/ v1/ account/ apps/ {id}/ arcade/ mediaPõe uma imagem num lugar do rascunho da página da loja, em multipart/form-data com kind, position e file (JPEG, PNG, WebP, GIF ou AVIF, até 15 MB). icon e tile são tratados como avatares, quadrados e com animação permitida; cover e screenshot como imagens de layout, só paradas. Toda imagem passa pela verificação de conteúdo. 201 com { data: { kind, position, image_url } }; uma imagem recusada é 400 com reason media_invalid e detail. Até 30 envios por dia por aplicativo. Apenas sessão: uma chave recebe 403 forbidden. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
kindobrigatório | string | icon, tile, cover ou screenshot. |
positionobrigatório | integer | 0 para icon, tile e cover; de 0 a 5 para screenshot. |
fileobrigatório | file | A imagem. |
/api/ v1/ account/ apps/ {id}/ arcade/ mediaEsvazia um lugar do rascunho da página da loja. Responde { data: { kind, position, image_url: null } }. Apenas sessão: uma chave recebe 403 forbidden. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked.
Parâmetros
| Campo | Tipo | Observações |
|---|---|---|
kindobrigatório | string | icon, tile, cover ou screenshot. |
positionobrigatório | integer | 0 para icon, tile e cover; de 0 a 5 para screenshot. |
/api/ v1/ account/ apps/ {id}/ arcade/ releasesOs lançamentos do aplicativo, em { data }. Cada um traz os campos do POST, number, status (draft, submitted, in_review, approved, rejected, withdrawn ou revoked), entry_origin, as datas, review (a decisão, os motivos e a nota de quem revisou, sem o nome), last_check, a última verificação, e live, previous_live, can_make_live e can_test. Apenas sessão: uma chave recebe 403 forbidden.
/api/ v1/ account/ apps/ {id}/ arcade/ releasesCria um lançamento em rascunho. 201 com { data: { release } }. Um campo recusado é 400 com reason fields_invalid e field, o nome do primeiro campo recusado; pedir identify sem data_events_url é 400 com data_events_url_required. Apenas sessão: uma chave recebe 403 forbidden. Um url_denied sobre um nome internacionalizado traz detail, o porquê (idn enquanto o Arcade não aceita esses nomes; idn_invalid, idn_script ou idn_confusable quando as regras recusam o nome), e field, a URL de que se trata: entry_url, data_events_url ou third_parties.N.origin. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
entry_urlobrigatório | string | Uma URL https que cumpre as regras de URL do Arcade (até 512 caracteres, porta 443, sem query nem fragmento); fora delas, 400 com reason url_invalid ou url_denied. |
capabilitiesobrigatório | array | pointer-lock, background-audio, os dois ou nenhum. |
scopesobrigatório | array | identify, ou vazio. |
orientationobrigatório | string | any, landscape ou portrait. |
platformsobrigatório | array | desktop, mobile ou os dois; pelo menos um. |
third_partiesobrigatório | array | Todo terceiro que o jogo carrega: até 20 { origin, purpose }, com purpose de até 200 caracteres. |
data_events_urlobrigatório | string | Para onde vão os eventos de dados, ou null. Obrigatória com identify, e sob as mesmas regras de URL, exceto que a origem e o caminho podem ser outros. |
notesobrigatório | string | Notas para quem revisa, até 2000 caracteres. |
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}Substitui um lançamento em rascunho, com os mesmos campos do POST. Responde { data: { release } }. Um lançamento enviado nunca muda: 409 com reason release_locked, e uma URL nova é um lançamento novo. Apenas sessão: uma chave recebe 403 forbidden. Um url_denied sobre um nome internacionalizado traz detail, o porquê (idn enquanto o Arcade não aceita esses nomes; idn_invalid, idn_script ou idn_confusable quando as regras recusam o nome), e field, a URL de que se trata: entry_url, data_events_url ou third_parties.N.origin. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ checkVerificar URL: busca agora, dos servidores do uloggd, o arquivo de prova e a URL de entrada, e responde { data: { check } } com o que viu: passed, proof_ok, redirect_ok, framing_ok, status_code, location, content_type, entry_sha256, changed_since_approval, provider, network, signals e error. Até 20 verificações por dia por aplicativo, contando as do envio e as de tornar ao vivo. Apenas sessão: uma chave recebe 403 forbidden. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ submitEnviar para revisão: roda uma verificação nova e, se ela passa, envia o lançamento e reserva a origem para o aplicativo. Responde { data: { release, check } } e manda um e-mail ao desenvolvedor. Uma verificação reprovada é 409 com reason check_failed; uma origem que outro aplicativo já tem, 409 com origin_in_use. Até 5 envios por dia por aplicativo. Apenas sessão: uma chave recebe 403 forbidden. Exige também uma sessão que entrou nos últimos 15 minutos: uma mais antiga recebe 403 forbidden com reason reauthentication_required, e o caminho é entrar de novo. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked. Pede também a versão atual dos termos de desenvolvedor aceita: depois que eles mudam, 403 com reason terms_required até a conta aceitar de novo em POST /api/v1/account/arcade/terms. Um url_denied sobre um nome internacionalizado traz detail, o porquê (idn enquanto o Arcade não aceita esses nomes; idn_invalid, idn_script ou idn_confusable quando as regras recusam o nome), e field, a URL de que se trata: entry_url, data_events_url ou third_parties.N.origin. O host passa também pelo que a moderação decidiu sobre redes e domínios: 400 com reason url_denied, detail network e field entry_url quando a rede ou o registrador do host está bloqueado, e 409 com domain_too_new quando o domínio foi registrado há pouco tempo para o Arcade.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ withdrawRetirar: tira da fila de revisão um lançamento enviado. Responde { data: { release } }. Apenas sessão: uma chave recebe 403 forbidden.
/api/ v1/ account/ apps/ {id}/ arcade/ releases/ {rid}/ liveTornar ao vivo: põe um lançamento aprovado na frente dos jogadores, ou traz de volta o que estava ao vivo antes. Roda uma verificação nova antes, e responde { data: { app, check } } com um e-mail ao desenvolvedor. As recusas, em 409: release_not_approved, check_failed, approval_too_old (a aprovação tem mais de 90 dias), provider_changed (o provedor de hospedagem não é o da aprovação) e rollback_too_far (só o lançamento imediatamente anterior pode voltar; um mais antigo é reenviado como lançamento novo). Apenas sessão: uma chave recebe 403 forbidden. Exige também uma sessão que entrou nos últimos 15 minutos: uma mais antiga recebe 403 forbidden com reason reauthentication_required, e o caminho é entrar de novo. Uma conta que a moderação bloqueou de publicar recebe 403 com reason publisher_blocked. Pede também a versão atual dos termos de desenvolvedor aceita: depois que eles mudam, 403 com reason terms_required até a conta aceitar de novo em POST /api/v1/account/arcade/terms. Um url_denied sobre um nome internacionalizado traz detail, o porquê (idn enquanto o Arcade não aceita esses nomes; idn_invalid, idn_script ou idn_confusable quando as regras recusam o nome), e field, a URL de que se trata: entry_url, data_events_url ou third_parties.N.origin. O host passa também pelo que a moderação decidiu sobre redes e domínios: 400 com reason url_denied, detail network e field entry_url quando a rede ou o registrador do host está bloqueado, e 409 com domain_too_new quando o domínio foi registrado há pouco tempo para o Arcade.
/api/ v1/ account/ apps/ {id}/ arcade/ overrideA URL de desenvolvimento do aplicativo: { data: { override } }, null quando nenhuma foi salva. override traz url, origin, host (a origem sem o esquema, com a porta), loopback (se é a máquina do próprio dono), release_id e release_number (o lançamento de base, de onde vêm as capacidades, os escopos, a orientação e as plataformas), set_at, expires_at, expired, ready (abre agora: não expirou e nada a bloqueia), blocked_reason (o que bloqueia, no vocabulário das recusas: override_expired, not_playable, release_not_found, listing_not_found, origin_in_use ou url_denied; null quando nada bloqueia) e changes_left (o que resta dos 20 salvamentos do dia). Só o dono lê, numa sessão que passou pelo segundo fator (a URL costuma ser um túnel público para a máquina do dono): 403 com reason not_owner para outra conta, 403 com mfa_required para uma sessão que ainda deve o código, 404 com app_not_found para um aplicativo sem Arcade. Apenas sessão: uma chave recebe 403 forbidden.
Exemplo
{
"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/ overrideSalva a URL de desenvolvimento por 24 horas, que só o dono abre no player, com o que o lançamento de base pede; salvar de novo, com a mesma URL ou outra, renova as 24 horas. Responde { data: { override } }. Pede uma sessão que passou pela verificação em duas etapas. Nada é buscado na URL; um host público precisa resolver só para endereços públicos. As recusas: 400 com reason url_invalid ou url_denied (field url) ou fields_invalid (com field); 403 com not_owner, mfa_required, banned, publisher_blocked ou not_playable; 404 com app_not_found ou release_not_found; 409 com origin_in_use (a origem é de um jogo de outra conta). Até 20 salvamentos por dia por aplicativo, depois 429 rate_limited com retry_after; só conta um salvamento que fica, e uma recusa, inclusive a do host que não resolve para endereços públicos, não gasta nenhum. Já a consulta do host público tem um limite próprio: até 60 por hora por conta, contadas antes de consultar, mesmo quando a consulta ou o salvamento são recusados, depois 429 rate_limited com retry_after; a máquina do próprio dono não é consultada e não conta. Um jogo aberto na URL anterior fecha em até 30 segundos quando a nova está em outra origem; na mesma origem, ele mantém o caminho e o lançamento de base com que abriu até ser aberto de novo. Apenas sessão: uma chave recebe 403 forbidden.
Corpo
| Campo | Tipo | Observações |
|---|---|---|
urlobrigatório | string | Até 512 caracteres, sem query nem fragmento. http ou https na máquina do dono (localhost, um nome em .localhost ou 127.0.0.1, em qualquer porta), ou https num host público, em qualquer porta. Nunca um endereço IP que não seja 127.0.0.1, nem o host em que o uloggd foi aberto. |
release_idobrigatório | uuid | O lançamento de base, do mesmo aplicativo: em rascunho, enviado, em revisão ou aprovado. |
/api/ v1/ account/ apps/ {id}/ arcade/ overrideApaga a URL de desenvolvimento: um jogo aberto nela é fechado em até 30 segundos. Responde { data: { override: null } }, também quando não havia nada para apagar. Não conta no limite do dia. 403 com not_owner, mfa_required ou banned; 404 com app_not_found. Apenas sessão: uma chave recebe 403 forbidden.
/api/ v1/ account/ apps/ {id}/ arcade/ removeRemover do Arcade: o jogo sai para sempre, o slug e a origem nunca são reaproveitados, e as evidências ficam guardadas por 180 dias. Responde { data: { app } } e manda um e-mail ao desenvolvedor. Apenas sessão: uma chave recebe 403 forbidden. Exige também uma sessão que entrou nos últimos 15 minutos: uma mais antiga recebe 403 forbidden com reason reauthentication_required, e o caminho é entrar de novo.
A URL de desenvolvimento
GET, PUT e DELETE /api/v1/account/apps/{id}/arcade/override leem, salvam
e apagam a
URL de desenvolvimento de um
aplicativo, o endereço que o dono abre no player do uloggd enquanto o jogo
roda na própria máquina ou atrás de um túnel. São só para sessão, e as três
pedem uma sessão verificada com a verificação em duas etapas, até para ler: a
URL costuma ser um túnel até a máquina do desenvolvedor.
Abri-la é uma abertura do tipo override, só para o dono do aplicativo, em
mode test, em /developers/applications/{id}/arcade/override/play. Essa
abertura é recusada com override_not_found quando nenhuma URL está salva, e
com override_expired depois das 24 horas dela. Salvar de novo as renova.
Recusas
Uma recusa do Arcade traz um reason, uma palavra para agir, ao lado do
code de sempre (os outros membros que uma recusa pode trazer estão em
Erros):
{
"error": {
"code": "conflict",
"message": "Another app already uses that origin.",
"reason": "origin_in_use"
}
}| Status | code | reason nestas rotas |
|---|---|---|
| 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 (com field e detail quando diz o porquê, como num nome internacionalizado), data_events_url_required, nickname_invalid, fields_invalid (com field, o nome de um campo, também nos de URL), media_invalid (com 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, com retry_after em segundos |
| 503 | unavailable | identity_unavailable, do conjunto de chaves enquanto nenhuma chave está configurada |
Motivos novos podem aparecer. Um cliente que encontra um que não conhece deve
agir pelo code.
Limites
| O quê | Limite |
|---|---|
| Ativar o Arcade | 5 por conta por dia |
| Verificações de URL | 20 por aplicativo por dia, contando as do envio e as de tornar ao vivo |
| Envios de lançamento, envios da página da loja | 5 de cada por aplicativo por dia |
| Envios de imagem | 30 por aplicativo por dia |
| Trocas de apelido | 10 por conta por dia |
| Salvamentos da URL de desenvolvimento | 20 por aplicativo por dia; apagá-la não conta |
| Aceitar de novo os termos de desenvolvedor | 10 por conta por dia |
| Consultas do host público da URL de desenvolvimento | 60 por conta por hora, contando as recusadas |