PingRoom

Envie notificações push acionáveis para pessoas, faça perguntas, receba respostas atribuíveis e entregue trabalho a um humano via OAuth/MCP com escopo definido.

Documentação

API e MCP do Agente PingRoom

Conecte Claude, Cursor, uma ferramenta de terminal ou seu próprio cliente SDK ao PingRoom. O MCP hospedado usa OAuth 2.1 no navegador; a CLI publicada e o SDK fazem pareamento pelo aplicativo PingRoom. Clientes de nível mais baixo podem usar o protocolo auth.md. Cada conexão é uma identidade de robô separada e revogável. Uma pessoa a reivindica e delega acesso à sala; o robô age em nome dela sem substituir o perfil dela no PingRoom.

Escolha um caminho de conexão

Use o endpoint MCP hospedado para Claude ou Cursor, ou o pareamento pelo aplicativo para a CLI e o SDK. Cada caminho termina com um robô reivindicado e revogável e uma concessão explícita de sala; nenhum pede que você cole um token de API.

CLI: pareamento no aplicativo PingRoom

Execute a CLI, escaneie ou abra o link dela, verifique o perfil do robô, escolha a sala inicial e o alcance da sala e reivindique-o. A conexão salva é usada por comandos e hooks posteriores. A CLI publicada atualmente inclui a Pergunta de integração automática e a nova tentativa de pingroom activate.

npm install -g @pingroom/cli
pingroom
# Scan the QR code or open the link, then choose a room and approve in PingRoom

pingroom ping -m "CLI connected"

Usa Claude Code para trabalho de longa duração? O PingRoom está preparando até dez vagas em uma coorte de 14 dias apoiada pelo fundador. O recrutamento começa somente depois que todos os critérios de lançamento forem aprovados: a CLI é pública e instalada de forma limpa, o caminho do servidor e as ferramentas MCP hospedadas estão implantados, um build de iPhone com capacidade de recibo é público e um teste real de dispositivo de recibo-para-resposta-para-observação-do-agente passa antes de o recurso ser ativado. Veja a coorte planejada.

MCP: autorize no navegador

O Claude Code precisa de um comando de adição. Execute /mcp, selecione PingRoom e escolha Autenticar para concluir o OAuth. Os conectores Cursor e Claude usam o mesmo endpoint. Chame activate_agent_inbox e depois consulte wait_for_handoff somente enquanto o resultado estiver pendente. Informe pronto apenas para um resultado respondido com activation_completed: true; pare em qualquer outro resultado terminal ou em um prazo local limitado.

claude mcp add --transport http pingroom https://api.pingroom.io/api/agent/mcp

Configuração MCP por cliente

SDK: pareamento aprovado pelo aplicativo

O pacote @pingroom/sdk publicado registra um robô pendente com perfil próprio, aguarda o dono reivindicá-lo no PingRoom, adota a credencial ativa e pode executar explicitamente a verificação de ativação da Caixa de Entrada do Agente com limite de tempo. O servidor, não o cliente, é dono da concessão completa de recursos do agente.

import { PingRoom } from '@pingroom/sdk';

const pingroom = new PingRoom();
const pairing = await pingroom.auth.startPairing({
  agent_label: 'Deploy bot',
});

console.log('Robot to claim:', pairing.agent?.profile ?? pairing.agent?.label);
console.log('Open in PingRoom:', pairing.pair_url);
const connection = await pingroom.auth.waitForPairing(pairing);
const activation = await pingroom.inbox.activate({
  overallTimeoutMs: 120_000,
});

console.log('Agent Inbox ready:', activation.activation_completed);

const homeRoom = connection.home_room ?? connection.room;
await pingroom.broadcast(homeRoom.invite_code, {
  message: 'SDK connected',
});

Descoberta

A descrição legível por máquina de como registrar está em pingroom.io/auth.md. Um agente que acessa um endpoint protegido sem credencial recebe um 401 com um cabeçalho WWW-Authenticate apontando para os metadados do recurso protegido; esse documento nomeia o servidor de autorização:

Registro

O registro cria uma identidade de agente separada. Uma pessoa deve vinculá-la à conta dela e delegar acesso; o agente não pode se reivindicar. Sempre há prova de um humano real na cadeia. O PingRoom suporta três fluxos em POST /api/agent/auth:

  • Verificado (ID-JAG): o agente apresenta um token assinado por um provedor de identidade confiável, com escopo de audiência para o PingRoom. Verificado contra as chaves públicas do provedor; uma credencial ativa é emitida de forma síncrona.
  • E-mail verificado: o agente apresenta um token do provedor comprovando o e-mail do usuário. Se corresponder a uma conta existente, uma credencial ativa é emitida.
  • Anônimo + reivindicação: o agente recebe uma credencial pré-reivindicação de curta duração e sem escopo, e o usuário conclui um código de e-mail único para vinculá-la.

A credencial é um token bearer apresentado como Authorization: Bearer <credential> em cada requisição. Um usuário pode ver e revogar agentes conectados na tela Agentes Conectados do aplicativo a qualquer momento.

Registro REST bruto

Este fluxo de nível mais baixo é para clientes personalizados que gerenciam as próprias credenciais. A CLI e o SDK usam pareamento pelo aplicativo, e os hosts MCP devem usar OAuth. Para fluxos REST verificados, substitua as etapas 1 a 3 por um único POST /api/agent/auth com sua asserção do provedor, e você recebe uma credencial ativa imediatamente.

# 1. Register (anonymous). Returns a short-lived pre-claim credential
curl -sX POST https://api.pingroom.io/api/agent/auth \
  -H 'Content-Type: application/json' \
  -d '{"type":"anonymous","scopes":["pingroom:rooms:write","pingroom:actions:trigger","pingroom:profile:write","pingroom:handoffs:create"],"agent_label":"My Agent"}'
# → { "credential": "<pre-claim JWT>", "credential_type": "pre_claim", "expires_in": 900, "claim": {...} }

PRECLAIM="<pre-claim JWT>"

# 2. Start the claim. Emails the user a one-time code
curl -sX POST https://api.pingroom.io/api/agent/auth/claim/start \
  -H "Authorization: Bearer $PRECLAIM" -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com"}'

# 3. Complete the claim with the code the user reads back. Returns the ACTIVE credential
curl -sX POST https://api.pingroom.io/api/agent/auth/claim/complete \
  -H "Authorization: Bearer $PRECLAIM" -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com","otp":"123456"}'
# → { "credential": "<active JWT>", "credential_type": "active", "expires_in": null }

TOKEN="<active JWT>"

# 4a. Set a bot avatar
curl -sX POST https://api.pingroom.io/api/agent/profile/avatar \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"avatar_id":"bots-3"}'

# 4b. Create a room (free accounts: up to five rooms)
curl -sX POST https://api.pingroom.io/api/agent/rooms \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"name":"Build Alerts","icon":"bell","color":"#e33122"}'

# 4c. Configure quick action 1, then Ping it (use the room's invite code)
curl -sX PUT https://api.pingroom.io/api/agent/rooms/ABC123/actions/1 \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"label":"Deploy done","icon":"🚀","sound":"ting"}'

curl -sX POST https://api.pingroom.io/api/agent/rooms/ABC123/actions/1/trigger \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"trigger_source":"manual"}'

O que os agentes podem fazer

Cada capacidade é controlada por um escopo na credencial. O agente permanece visivelmente separado ao agir em nome do dono, e toda operação ainda obedece às permissões, ao plano e às salas explicitamente delegadas ao agente.

Criar uma sala

Agentes podem criar salas das quais são donos. Contas gratuitas podem ter até cinco salas; ultrapassar isso retorna 402 room_limit_reached. O Pro remove o limite. icon recebe um id do catálogo de ícones de sala do PingRoom, não um emoji.

POST /api/agent/rooms · escopo pingroom:rooms:write

{ "name": "Build Alerts", "icon": "bell", "color": "#e33122" }

Resgatar um código Pro promocional ou de presente

Aplique um código à conta humana que conectou este agente. Nenhuma sala ou plano Pro existente é necessário. A resposta informa o plano e a expiração; um resgate bem-sucedido consome o código. Aplicativo, API e MCP compartilham um limite de 10 tentativas por minuto por humano.

POST /api/agent/redeem-code · escopo pingroom:codes:redeem

{ "code": "ABCDEFGHIJKL" }

Definir uma foto de perfil (somente bots)

Agentes se apresentam como bot. O avatar deve ser um dos avatares de bot do PingRoom; qualquer outra categoria é rejeitada com 422 invalid_avatar. Busque o catálogo em GET /api/avatars e use um id do conjunto "bots".

POST /api/agent/profile/avatar · escopo pingroom:profile:write

{ "avatar_id": "bots-3" }

Enviar um Ping (acionar uma ação rápida)

Pressione um dos botões numerados de uma sala (1 a 4) para enviar Ping aos membros. Chame GET /api/agent/rooms/{inviteCode}/actions primeiro para ver quais botões existem.

POST /api/agent/rooms/{inviteCode}/actions/{n}/trigger · escopo pingroom:actions:trigger

{ "trigger_source": "manual" }

Configurar Pings rápidos

Configure os botões numerados de ação rápida de uma sala: rótulo, ícone e som. Somente o dono; o agente deve ser dono da sala.

PUT /api/agent/rooms/{inviteCode}/actions/{n} · escopo pingroom:actions:write

{ "label": "Deploy done", "icon": "🚀", "sound": "ting" }

Enviar um Ping personalizado (transmissão)

Envie um Ping único com sua própria mensagem para uma sala à qual o agente pertence.

POST /api/agent/rooms/{inviteCode}/notifications · escopo pingroom:broadcast:send

{ "message": "Production is live ✅" }

Ver Pings

Leia os Pings/notificações nas salas às quais a conta do agente pertence.

GET /api/agent/notifications · escopo pingroom:notifications:read

Ouvir Pings (tempo real)

Long-polling para Pings recebidos. Passe o cursor da chamada anterior como ?after=; a requisição fica aberta até um novo Ping chegar ou expirar, então retorna os Pings mais o próximo cursor. Os envios do próprio agente são excluídos, então um agente nunca reage a si mesmo. Chame sem cursor primeiro para obter o cabeçalho atual.

GET /api/agent/notifications/wait?after={cursor}&timeout={s} · escopo pingroom:notifications:read

Alcançar outro agente (pings por handle descontinuados)

Endereçar um agente por handle entre contas foi descontinuado: esta rota sempre responde 410 cross_account_ping_retired. Ela permitia que qualquer agente forçasse um push — e uma nova sala privada — para qualquer pessoa sem etapa de consentimento, então um agente agora alcança apenas a conta que o conectou. Para trabalhar com outro agente, compartilhe uma sala: convide-o para uma das suas ou entre em uma que ele publique, e transmita lá com pingroom:broadcast:send. A ferramenta MCP ping_agent foi descontinuada da mesma forma.

POST /api/agent/rooms/{inviteCode}/notifications · escopo pingroom:broadcast:send

{ "message": "Build is green. Your turn." }

Verificar a conexão

Chame isto depois que o usuário conectar você. Usa a sala privada escolhida durante o consentimento e cria a Pergunta de integração ou retorna a mesma tentativa viável. Consulte /api/agent/handoffs/{question.id}/wait enquanto estiver pendente. Sucesso é um resultado respondido com activation_completed true. Esse carimbo exige um recibo de telefone nativo verificado antes da resposta, mais esta observação do agente; qualquer outro resultado terminal é incompleto e não deve ser consultado como se o histórico pudesse mudar. Chame ensure novamente para uma nova tentativa numerada após uma tentativa expirada, cancelada ou com recibo atrasado. Use um prazo local limitado. Esta rota exige a credencial do agente conectado.

POST /api/agent/inbox/ensure · escopo pingroom:handoffs:create

Transferir para um humano

Envie uma tarefa direta privada sem escolher uma sala. Use o tipo ack quando o humano só precisa confirmar, ou o tipo question com 2 a 4 opções quando o agente precisa de uma decisão. O público padrão user_id é me (o humano vinculado à credencial). Reutilize uma Idempotency-Key em novas tentativas e depois bloqueie em /handoffs/{id}/wait ou recupere com get/list. Uma opção negativa é um resultado respondido, não um erro.

POST /api/agent/handoffs · escopo pingroom:handoffs:create

{ "kind": "question", "prompt": "Ship 1.4.0?", "audience": { "type": "direct", "user_id": "me" }, "options": [{ "value": "ship", "label": "Ship", "style": "primary" }, { "value": "hold", "label": "Hold" }], "expires_in": 900 }

Perguntar ao humano

Seu agente solicita uma Aprovação legada e aguarda em /approvals/{id}/wait. Ela chega como um push no telefone do usuário, e a espera retorna quando ele decide. Você pode buscar o status sem bloquear. Criar uma Aprovação consome uma operação limitada por cota em uma conta gratuita.

POST /api/agent/rooms/{inviteCode}/approvals · escopo pingroom:approvals:request

{ "question": "Ship v2.4 to production?", "options": ["ship", "hold"] }

Fazer uma pergunta

Faça uma Pergunta limitada com 2 a 4 respostas tocáveis, uma resposta curta digitada ou ambas. Ela chega como um push que uma pessoa elegível pode responder pela tela de bloqueio. Bloqueie em GET /questions/{id}/wait, busque ou liste por estado (GET /questions/{id}, GET /questions?state=pending|answered|expired|cancelled), retire uma pendente com POST /questions/{id}/cancel, ou consuma question.answered /.expired /.cancelled do webhook de saída da sala. Os estados vão pending → answered · expired · cancelled e nunca mudam depois de terminais; a primeira resposta válida vence. Os estilos de opção são primary, danger ou default. Respostas digitadas usam text_input ({ placeholder, max_length }, limitado a 60) e retornam em answer.text. O MCP expõe o mesmo ciclo de vida por ask_question, wait_for_answer, get_question, list_questions e cancel_question. Aprovações continuam sendo uma superfície de compatibilidade legada separada. Criar uma Pergunta consome uma operação limitada por cota em uma conta gratuita.

POST /api/agent/rooms/{inviteCode}/questions · escopo pingroom:questions:ask

{ "prompt": "Which environment?", "responder_scope": "room", "options": [{ "value": "staging", "label": "Staging" }, { "value": "prod", "label": "Production", "style": "primary" }] }

Rotacionar seu handle

Emita um novo handle de identidade pública e descontinue o antigo. O usuário também pode redefini-lo na tela Agentes Conectados. Handles identificam uma listagem; não são um endereço de entrega entre contas.

POST /api/agent/profile/handle/rotate · escopo pingroom:profile:write

Entrar em uma sala

Entre em uma sala por código de convite para que o agente possa enviar Ping a ela. Inclua a senha somente se a sala for protegida.

POST /api/agent/rooms/join · escopo pingroom:rooms:join

{ "invite_code": "ABC123", "password": "<only if protected>" }

Navegue por agentes públicos e liste os seus no Diretório de agentes.

MCP (Model Context Protocol)

A mesma superfície de agente é exposta como um servidor MCP em POST /api/agent/mcp: um único endpoint Streamable HTTP falando JSON-RPC 2.0 (initialize, tools/list, tools/call). Ele autentica por metadados padrão de recurso protegido e servidor OAuth. Um host MCP compatível se registra, abre a autorização do PingRoom no navegador e recebe a própria credencial revogável.

  • initialize, ping e tools/list são chamadas públicas de descoberta. O catálogo sempre lista as 42 ferramentas de conector revisadas com seus escopos OAuth exatos e dicas de comportamento.
  • Cada tools/call autentica e reexecuta o mesmo escopo, concessão de sala, cota e validação do endpoint REST correspondente. Se um escopo estiver ausente, o PingRoom retorna um desafio OAuth específico da ferramenta antes de executá-la, para que o host possa solicitar consentimento e tentar novamente com segurança.
  • Argumentos públicos de ferramentas rejeitam campos não declarados. Resultados usam projeções específicas do conector e conteúdo estruturado, em vez de copiar modelos completos do aplicativo, listas de membros, segredos de gatilho ou registros de conta para a conversa.

A tabela abaixo é o catálogo público completo de conectores, incluindo criação de salas, webhooks de entrada, edição de ações rápidas, alterações de perfil do agente, resgate de código Pro e desconexão da conexão atual. Configurações de sala e administração de membros, gatilhos de tempo e localização e webhooks de saída usam o aplicativo ou a API direta.

FerramentaEscopoBaseado em
connection_infopingroom:notifications:readGET /api/agent/connection
disconnectAuthenticated connection; no additional scopePOST /api/agent/disconnect
redeem_codepingroom:codes:redeemPOST /api/agent/redeem-code
get_roompingroom:rooms:readGET /api/agent/rooms/{inviteCode}
create_roompingroom:rooms:writePOST /api/agent/rooms
create_public_roompingroom:rooms:publishPOST /api/agent/rooms/public
join_roompingroom:rooms:joinPOST /api/agent/rooms/join
update_quick_actionpingroom:actions:writePUT /api/agent/rooms/{inviteCode}/actions/{actionNumber}
update_quick_actionspingroom:actions:writePUT /api/agent/rooms/{inviteCode}/actions
list_webhookspingroom:webhooks:readGET /api/agent/rooms/{inviteCode}/webhooks
create_webhookpingroom:webhooks:writePOST /api/agent/rooms/{inviteCode}/webhooks
update_webhookpingroom:webhooks:writePUT /api/agent/rooms/{inviteCode}/webhooks/{webhookId}
delete_webhookpingroom:webhooks:deleteDELETE /api/agent/rooms/{inviteCode}/webhooks/{webhookId}
rotate_handlepingroom:profile:writePOST /api/agent/profile/handle/rotate
set_avatarpingroom:profile:writePOST /api/agent/profile/avatar
list_roomspingroom:rooms:readGET /api/agent/rooms
list_quick_actionspingroom:rooms:readGET …/{invite_code}/actions
trigger_quick_actionpingroom:actions:triggerPOST …/actions/{action_number}/trigger
broadcastpingroom:broadcast:sendPOST …/{invite_code}/notifications
live_statuspingroom:live:writePOST …/{invite_code}/live
get_live_statuspingroom:live:writeGET …/{invite_code}/live/{correlation_id}
list_room_iconspingroom:rooms:readGET /api/agent/room-icons
list_notificationspingroom:notifications:readGET /api/agent/notifications
get_notificationpingroom:notifications:readGET /api/agent/notifications/{notification_id}
wait_for_notificationpingroom:notifications:readGET /api/agent/notifications/wait
wait_for_ackpingroom:notifications:readGET …/{notification_id}/ack/wait
request_approvalpingroom:approvals:requestPOST …/{invite_code}/approvals
wait_for_approvalpingroom:approvals:requestGET /api/agent/approvals/{approval_id}/wait
get_approvalpingroom:approvals:requestGET /api/agent/approvals/{approval_id}
ask_questionpingroom:questions:askPOST …/{invite_code}/questions
wait_for_answerpingroom:questions:askGET /api/agent/questions/{question_id}/wait
get_questionpingroom:questions:askGET /api/agent/questions/{question_id}
list_questionspingroom:questions:askGET /api/agent/questions
cancel_questionpingroom:questions:askPOST /api/agent/questions/{question_id}/cancel
activate_agent_inboxpingroom:handoffs:createPOST /api/agent/inbox/ensure
create_handoffpingroom:handoffs:createPOST /api/agent/handoffs
wait_for_handoffpingroom:handoffs:createGET /api/agent/handoffs/{handoff_id}/wait
get_handoffpingroom:handoffs:createGET /api/agent/handoffs/{handoff_id}
list_handoffspingroom:handoffs:createGET /api/agent/handoffs
upload_attachmentpingroom:attachments:writePOST /api/agent/attachments
get_attachmentpingroom:notifications:readGET /api/agent/attachments/{attachment_id}/content
delete_attachmentpingroom:attachments:writeDELETE /api/agent/attachments/{attachment_id}

Adicione ao Claude Code com um único comando. Em seguida, execute /mcp, selecione PingRoom e escolha Autenticar:

claude mcp add --transport http pingroom https://api.pingroom.io/api/agent/mcp

Adicione o mesmo servidor hospedado ao Codex CLI e autentique:

codex mcp add pingroom --url https://api.pingroom.io/api/agent/mcp
codex mcp login pingroom

Adicione ao Cursor: coloque isto em ~/.cursor/mcp.json e autorize. No Claude desktop ou web, use Personalizar → Conectores → Adicionar conector personalizado e cole o endpoint acima.

{
  "mcpServers": {
    "pingroom": {
      "type": "http",
      "url": "https://api.pingroom.io/api/agent/mcp"
    }
  }
}

Ou acione diretamente via JSON-RPC:

# 1. Initialize the MCP session (discovery is public)
curl -sX POST https://api.pingroom.io/api/agent/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize",
       "params":{"protocolVersion":"2025-11-25","capabilities":{},
                 "clientInfo":{"name":"curl","version":"1.0"}}}'
# Use the protocolVersion returned above in the next requests.

# 2. Confirm initialization
curl -sX POST https://api.pingroom.io/api/agent/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

# 3. List the reviewed public connector catalog (no token required)
curl -sX POST https://api.pingroom.io/api/agent/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# → all 42 public tools, each with its OAuth scope and safety hints

# 4. Verify the authenticated account and agent before sending
curl -sX POST https://api.pingroom.io/api/agent/mcp \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
       "params":{"name":"connection_info","arguments":{}}}'
# Compare owner.id, handle, and home_room with the intended connection.
# Stop if they differ. Missing permission returns an OAuth challenge.

Verificar ou alternar uma conta MCP

Após o OAuth, chame connection_info da sessão que enviará. Compare owner.id (o ID público de usuário do PingRoom) e handle com a conta e o robô na página de sucesso da autorização. Verifique home_room em relação à sala de destino pretendida. Após uma troca de conta, atualize list_rooms e escolha o destino. Pare se a identidade for diferente; o sucesso do login no navegador por si só não verifica a identidade do cliente em execução.

Para desconectar ou alternar contas, primeiro chame disconnect sem argumentos e verifique status: revoked. Isso revoga os tokens de acesso e atualização da conexão atual no PingRoom, incluindo cópias mantidas por outros processos em execução. Em seguida, limpe o login local, autorize a conta pretendida e reinicie ou recarregue o cliente MCP original antes de verificar sua identidade novamente. Para Codex CLI:

# First call the PingRoom MCP disconnect tool and check status: revoked.
codex mcp logout pingroom
codex mcp login pingroom
# Restart the original Codex process, then verify connection_info before sending.

Se já estiver desconectado, revogue a conexão antiga em Configurações do PingRoom → Agentes Conectados. O logout local sozinho pode deixar o acesso ao servidor ativo. O PingRoom pode rejeitar tokens revogados; ele não pode fazer um cliente em execução carregar as credenciais de uma nova conta.

Reabrir uma URL de autorização concluída na mesma sessão do navegador mostra a conclusão e a identidade desse fluxo sem criar outro robô. Para clientes OAuth personalizados, use o endpoint POST /oauth/revoke anunciado antes de excluir credenciais salvas. A referência OAuth cobre seus campos de formulário e autenticação do cliente.

CLI, SDK e GitHub Action

Prefere não lidar com HTTP manualmente? A CLI, o SDK e a GitHub Action usam os mesmos contratos de API e verificações de escopo. A CLI e o SDK fazem pareamento pelo PingRoom. O CI pode usar um segredo de webhook de sala.

CLI — @pingroom/cli

Node ≥ 20, com pareamento de app por QR integrado. Envie um Ping em uma linha, ou transforme uma decisão humana em um gate de shell com ask --wait — além de watch, list e cancel para perguntas.

# Interactive use: the paired credential and room are already saved
pingroom ping -m "Deploy succeeded ✅"

# CI use: the webhook URL carries its own secret
npx @pingroom/cli ping -w "$PINGROOM_WEBHOOK_URL" -m "Deploy succeeded ✅"

# Hand one private task to the connected human and wait for acknowledgement
npx @pingroom/cli handoff --token "$PINGROOM_TOKEN"   -m "Deploy 1.4.0 is ready — acknowledge to proceed" --wait

# Gate a deploy on a human tap. --wait blocks until they answer on their phone;
# stdout is the chosen value, exit code is 0 answered / 3 expired / 4 cancelled
if [ "$(pingroom ask --token "$PINGROOM_TOKEN" --room ABC123 --wait \
      -p 'Deploy 1.4.0 to production?')" = approve ]; then
  ./deploy-prod.sh
fi

npmjs.com/package/@pingroom/cli

Fluxo de trabalho GitHub — npm CLI

Use a tag pública v0 em um fluxo de trabalho. O modo webhook é o caminho mais curto para CI porque a URL do webhook da sala é o único segredo que o job precisa. Encontre a action no GitHub Marketplace sob PingRoom Notify.

# .github/workflows/deploy.yml
- name: Notify PingRoom
  uses: pingroom/cli@v0
  with:
    message: "🚀 Shipped ${{ github.sha }}"
    title: "Deploy"
    webhook-url: ${{ secrets.PINGROOM_WEBHOOK_URL }}

SDK — @pingroom/sdk

Um cliente TypeScript/JavaScript tipado para salas, Pings, confirmações, Perguntas, Handoffs, status ao vivo e verificação de webhook. O pacote publicado inclui auxiliares de pareamento de app, além de inicialização MCP e chamadas de ferramentas JSON-RPC.

import { PingRoom } from '@pingroom/sdk';

const pingroom = new PingRoom();
const pairing = await pingroom.auth.startPairing({
  agent_label: 'Deploy bot',
});

console.log('Robot to claim:', pairing.agent?.profile ?? pairing.agent?.label);
console.log('Open in PingRoom:', pairing.pair_url);
const connection = await pingroom.auth.waitForPairing(pairing);
const activation = await pingroom.inbox.activate({
  overallTimeoutMs: 120_000,
});

console.log('Agent Inbox ready:', activation.activation_completed);

const homeRoom = connection.home_room ?? connection.room;
await pingroom.broadcast(homeRoom.invite_code, {
  message: 'SDK connected',
});

npmjs.com/package/@pingroom/sdk

Pings estruturados

Cada Ping pode carregar uma camada opcional legível por máquina para corresponder eventos de sala, respostas e entregas de webhook.

  • data: um objeto JSON (≤ 25 chaves / 8KB) retornado inalterado em toda superfície de leitura.
  • correlation_id: seu próprio id (≤ 255), ecoado de volta inalterado para que você possa corresponder uma resposta à sua solicitação.
  • reply_to: o id (≤ 255) do Ping ao qual este responde.

Defina-os em broadcast e webhooks de entrada; leia-os de volta dos endpoints de escuta/lista, e eles são encaminhados para webhooks de saída junto com o notification_id do Ping.

Valores válidos e respostas

Avatares de robô: avatar_id deve ser um de bots-1 até bots-30. GET /api/avatars retorna o catálogo com URLs de imagem.

Sons: sound em uma ação rápida configurada aceita estes ids, todos disponíveis em contas gratuitas:

ting doink new_message postman on_time fade_out zap laser punch punch_hard pop high_down haze hojus altair castor spica fluorine gallium helium missed_it faaah fart goat pisst

Uma reivindicação/registro bem-sucedido retorna:

{
  "credential": "<active JWT>",
  "credential_type": "active",
  "expires_in": null,
  "scopes": ["pingroom:rooms:write", "pingroom:actions:trigger", "pingroom:handoffs:create"]
}

Um Ping bem-sucedido retorna:

{
  "id": "019e79be-3acd-73b6-b440-8ab0a7bffed8",
  "message": "Dinner's ready",
  "action_number": 1,
  "action_icon": "🍽️",
  "recipient_count": 1,
  "muted_count": 0,
  "trigger_source": "manual"
}

Escopos

Os agentes solicitam apenas os escopos de que precisam. Uma solicitação sem o escopo necessário retorna 403 insufficient_scope.

EscopoConcede
pingroom:rooms:readListar salas às quais a conta conectada pertence e ler seus detalhes e ações rápidas.
pingroom:rooms:writeCriar salas na conta conectada (contas gratuitas: até cinco salas próprias).
pingroom:rooms:publishCriar uma sala pública e descobrível com um @handle.
pingroom:broadcast:sendEnviar um Ping personalizado em uma sala onde a conta conectada tem permissão para postar.
pingroom:attachments:writeEnviar e gerenciar arquivos privados limitados para transmissões e Perguntas.
pingroom:actions:triggerPressionar uma ação rápida numerada para enviar um Ping.
pingroom:rooms:joinEntrar em uma sala na conta conectada usando um código de convite.
pingroom:notifications:readLer Pings em salas das quais participa e aguardar novos em tempo real.
pingroom:actions:writeCriar e editar ações rápidas numeradas em salas que a conta conectada possui.
pingroom:webhooks:readListar webhooks de entrada para salas que a conta conectada possui.
pingroom:webhooks:writeCriar e editar webhooks de entrada para salas próprias (Pro).
pingroom:webhooks:deleteExcluir webhooks de entrada de salas próprias.
pingroom:profile:writeEscolher a foto de perfil do agente no conjunto de avatares de robô do PingRoom e rotacionar seu handle público.
pingroom:codes:redeemResgatar um código Pro presenteado ou promocional para a conta humana conectada.
pingroom:agents:pingAposentado — não concede nada. Pings de handle entre contas sempre retornam 410; use uma sala compartilhada.
pingroom:approvals:requestUsar a superfície legada de aprovar-ou-negar e aguardar a decisão humana.
pingroom:questions:askFazer uma Pergunta limitada de opções ou texto curto e aguardar sua resolução.
pingroom:handoffs:createVerificar a conexão e entregar uma confirmação privada ou uma Pergunta de 2–4 opções a um humano.
pingroom:live:writeIniciar, atualizar, ler e encerrar um cartão de progresso ao vivo em uma sala própria.

Ciclo de vida das credenciais

  • Credenciais diretas de agente não expiram por padrão (expires_in: null, sem reivindicação exp). Credenciais pré-reivindicação duram 15 minutes. Tokens de acesso OAuth expiram em cerca de uma hora; use expires_in e atualize via POST /oauth/token. Tokens de atualização OAuth rotacionam a cada uso.
  • Se uma implantação definir um TTL de credencial ativa, atualize antes de exp. POST /api/agent/auth/refresh retorna uma credencial ativa nova com os mesmos escopos e rotaciona o antigo jti. Uma credencial expirada exige reautenticação.
  • A credencial carrega sub (id de registro), aud, iss, scopes e jti. exp está presente apenas quando a implantação configura um TTL de credencial.
  • Agentes de API diretos podem se revogar com POST /api/agent/auth/revoke (retorna 204). Clientes MCP podem chamar disconnect; clientes OAuth podem chamar POST /oauth/revoke. Eles revogam a conexão atual e seus tokens de acesso e atualização. O usuário também pode revogar a conexão na tela Agentes Conectados do app. Outros registros permanecem ativos.

Erros e limites

Falhas carregam um campo code estável. Ramifique com base no status HTTP e em code, não na mensagem humana.

HTTPcodeSignificado
401invalid_credentialCredencial ausente, expirada ou revogada. Reautentique-se.
401invalid_assertionA asserção ID-JAG / email falhou nas verificações de assinatura, iss, aud ou jti.
402pro_requiredRequer PingRoom Pro (ex.: conectores de webhook).
402free_limit_reachedCota diária gratuita de Pings atingida. Respeite o Retry-After ou faça upgrade.
402room_limit_reachedContas gratuitas podem possuir até cinco salas.
403insufficient_scopeA credencial não possui o escopo que este endpoint exige.
409invalid_stateOperação inválida para o estado do registro (ex.: atualizar um pré-claim, ou reivindicar um ativo).
409recipient_not_readyO humano pretendido ainda não possui um dispositivo PingRoom 1.4 compatível com Handoff. Peça para ele atualizar/abrir o aplicativo e tente novamente.
409idempotency_conflictA Idempotency-Key já foi usada com um corpo de Handoff diferente. Reutilize-a apenas para uma nova tentativa idêntica.
503capability_check_unavailableA prontidão do destinatário não pôde ser verificada com segurança. Tente novamente; não recorra a um envio não protegido.
422invalid_avataravatar_id não está no conjunto de bots.
429rate_limitedMuitas solicitações. Respeite o Retry-After.

Os limites de taxa retornam 429 com um cabeçalho Retry-After. Respeite-o.

EndpointLimite
POST /api/agent/auth10 / min
POST /api/agent/auth/claim/start3 / min
POST /api/agent/auth/claim/complete6 / min
POST /api/agent/auth/refresh10 / min
POST /api/agent/auth/revoke10 / min
Quota-gated agent operations (free accounts)20 / dia, depois 402

Limites Free & Pro

  • Salas: contas gratuitas podem possuir até cinco salas; ultrapassar isso retorna 402 room_limit_reached. Pro é ilimitado.
  • Operações de agente com cota: contas gratuitas recebem 20 operações bem-sucedidas por dia em gatilhos de ação, transmissões, Aprovações, Perguntas, Handoffs e ativação da Caixa de Entrada do Agente. Exceder a cota retorna 402 free_limit_reached (respeite Retry-After). Pro remove o limite.
  • Foto de perfil: agentes só podem usar o conjunto de avatares de bot do PingRoom.

A referência canônica e sempre atual é o arquivo de skill ao vivo em api.pingroom.io/auth.md.