Servidor MCP

PingRoom

io.pingroom/pingroom
Comunicación Productividad Público y accesible MCP 2025-11-25

Qué hace este MCP

Sends mobile notifications, asks questions, requests approvals, and coordinates human handoffs through rooms and live status updates.

activate_agent_inbox
Activate Agent Inbox
Start or resume the onboarding Question in the private room the human chose during authorization. If recipient_not_ready, ask the human to install or update PingRoom from install_url, open the app, sign in, and enable notifications before retrying. Read question.id, then call wait_for_handoff only while state is pending and within a bounded local deadline. Success is answered with activation_completed true. Any other terminal result is incomplete: stop polling that attempt, then call activate_agent_inbox again for one numbered retry. The stamp requires native phone receipt before the human answer.
Acceso externo
Esquema de entrada
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
ask_question
Ask Question
Ask a person a question with 2-4 tappable options, then block on their answer (pair with wait_for_answer). Delivered as a push they can answer from the lock screen or in-app; the first valid answer wins. Rate-limited.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'prompt'], 'properties': {'ttl': {'type': 'integer', 'minimum': 1, 'description': 'Seconds the question stays open before it expires.'}, 'data': {'type': 'object', 'properties': {'location': {'type': 'object', 'required': ['latitude', 'longitude'], 'properties': {'label': {'type': 'string', 'maxLength': 100, 'description': 'Optional place name shown to the recipient.'}, 'address': {'type': 'string', 'maxLength': 255, 'description': 'Optional formatted street address.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees.'}, 'longitude': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}}, 'description': 'A shareable geographic location.', 'additionalProperties': False}}, 'description': 'Arbitrary structured context (max 25 keys / 8KB). Read surfaces return it after connector privacy filtering; do not put secrets in data. data.location is reserved for a shareable location.', 'maxProperties': 25, 'additionalProperties': True}, 'prompt': {'type': 'string', 'maxLength': 500, 'description': 'The question the person reads.'}, 'context': {'type': 'string', 'maxLength': 40, 'description': 'Optional secondary line, e.g. a build number.'}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'label'], 'properties': {'label': {'type': 'string', 'maxLength': 40, 'description': 'Button text shown to the person.'}, 'style': {'enum': ['primary', 'danger', 'default'], 'type': 'string', 'description': 'primary = affirmative (brand color), danger = destructive (red), default = quiet.'}, 'value': {'type': 'string', 'maxLength': 40, 'description': 'Stable token returned as the answer.'}}, 'additionalProperties': False}, 'maxItems': 4, 'minItems': 2, 'description': 'Answer options in display order. Omit for a default Approve/Deny.'}, 'reply_to': {'type': 'string', 'maxLength': 255, 'description': 'Optional routing pointer, echoed back unchanged.'}, 'text_input': {'type': 'object', 'properties': {'max_length': {'type': 'integer', 'maximum': 60, 'minimum': 1, 'description': 'Max characters (default 60).'}, 'placeholder': {'type': 'string', 'maxLength': 60, 'description': 'Hint shown in the reply field.'}}, 'description': 'Invite a typed answer (on its own, or alongside options). max_length is capped at 60.', 'additionalProperties': False}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'attachment_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'maxItems': 4, 'description': 'Ids of up to 4 uploaded attachments (see upload_attachment) to include. Uploading requires a Pro account.'}, 'correlation_id': {'type': 'string', 'maxLength': 255, 'description': 'Your own id, echoed back unchanged on read.'}, 'idempotency_key': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'Stable key so a retried call cannot create a second one.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
broadcast
Broadcast Ping
Send a custom ping to a room the account belongs to. Rate-limited. Not available in personal rooms (use trigger_quick_action there).
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'message'], 'properties': {'data': {'type': 'object', 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'Reserved: an absolute http:// or https:// URL. Present turns the ping into a tappable link.'}, 'label': {'type': 'string', 'maxLength': 26, 'description': 'Reserved: short caption shown with the link ping.'}, 'location': {'type': 'object', 'required': ['latitude', 'longitude'], 'properties': {'label': {'type': 'string', 'maxLength': 100, 'description': 'Optional place name shown to the recipient.'}, 'address': {'type': 'string', 'maxLength': 255, 'description': 'Optional formatted street address.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees.'}, 'longitude': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}}, 'description': 'A shareable geographic location.', 'additionalProperties': False}, 'button_label': {'type': 'string', 'maxLength': 26, 'description': 'Reserved: label for the link button rendered for data.url.'}}, 'description': 'Arbitrary structured context (max 25 keys / 8KB). Read surfaces return it after connector privacy filtering; do not put secrets in data. data.location is reserved for a shareable location, and data.url + data.button_label are reserved for a tappable link ping.', 'maxProperties': 25, 'additionalProperties': True}, 'title': {'type': 'string', 'maxLength': 40, 'description': 'Optional headline. Defaults to the room name.'}, 'message': {'type': 'string', 'maxLength': 160, 'description': 'Ping body text (max 120 characters in private rooms, 160 in public rooms).'}, 'ack_mode': {'enum': ['any', 'all'], 'type': 'string', 'description': 'With requires_ack: any (default) resolves on the first confirmation; all waits for every original eligible recipient. Read action_state.confirmed_count and required_count for progress.'}, 'reply_to': {'type': 'string', 'maxLength': 255, 'description': 'Id of the ping this one answers (notification id or correlation id).'}, 'is_urgent': {'type': 'boolean', 'description': 'Deliver time-sensitive so the ping breaks through Focus / Do Not Disturb and reaches members who muted the room or you (a block still wins). Independent of requires_ack: urgent affects delivery only and asks nothing of the recipient.'}, 'action_icon': {'type': 'string', 'maxLength': 50, 'description': 'Optional emoji shown with the ping.'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'requires_ack': {'type': 'boolean', 'description': 'Keep this ping open until its confirmation rule is met, and show it as a lock-screen card with an Acknowledge button. Does not raise the interruption level on its own — combine with is_urgent for an ack that also breaks through Focus.'}, 'action_number': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Optional quick-action slot to attribute the ping to.'}, 'attachment_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'maxItems': 4, 'description': 'Ids of up to 4 uploaded attachments (see upload_attachment) to include. Uploading requires a Pro account.'}, 'correlation_id': {'type': 'string', 'maxLength': 255, 'description': 'Your own id, echoed back unchanged on read.'}, 'ack_timeout_seconds': {'type': 'integer', 'maximum': 86400, 'minimum': 60, 'description': 'Optional acknowledgement deadline in seconds.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'id': {'type': 'string', 'format': 'uuid'}, 'data': {'type': 'object', 'description': 'Structured context after connector privacy filtering. Credential, account, and direct-contact fields are removed.', 'maxProperties': 25, 'additionalProperties': True}, 'room': {'type': 'object'}, 'state': {'type': 'string'}, 'sender': {'type': 'object'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'question': {}, 'attachments': {'type': 'array'}, 'action_state': {'type': 'object'}, 'origin_agent': {'type': 'object', 'description': 'Present when a connected agent originated the ping: its handle and display name.'}, 'correlation_id': {'type': ['string', 'null']}, 'delivery_state': {'type': 'string'}, 'notification_id': {'type': 'string', 'format': 'uuid'}}, 'description': 'A privacy-minimized, chainable PingRoom notification result.', 'additionalProperties': True}}, 'additionalProperties': False}
cancel_question
Cancel Question
Withdraw a still-pending question you asked.
Destructivo Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['question_id'], 'properties': {'question_id': {'type': 'string', 'format': 'uuid', 'description': 'Question id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
connection_info
Connection Info
Verify the current connection: owner.id is the human public User ID, handle identifies the robot, and home_room is its delivery room. After login or reconnect, match owner.id and handle to the approved account and robot before sending. A mismatch means stop and reload or restart the MCP client. Includes a credential-protected latest-pings feed and token-free install URL; never send credentials to the install URL.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'required': ['status', 'handle', 'owner'], 'properties': {'owner': {'type': 'object', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string', 'pattern': '^[A-Z0-9]{12}$', 'description': 'The human public User ID shown in PingRoom, not an internal database identifier.'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'handle': {'type': 'string'}, 'status': {'enum': ['active', 'revoked'], 'type': 'string'}}, 'description': 'The authenticated robot and its owner public User ID, for account verification.', 'additionalProperties': True}}, 'additionalProperties': False}
create_handoff
Create Handoff
Hand work to exactly one human as either an acknowledgement or a tappable question. The server verifies that one of the recipient's current devices supports the complete Handoff action before creating anything.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['kind', 'prompt', 'audience'], 'properties': {'data': {'type': 'object', 'description': 'Structured context returned on read surfaces after connector privacy filtering. Do not put secrets in data.'}, 'kind': {'enum': ['ack', 'question'], 'type': 'string', 'description': 'ack asks the human to acknowledge; question asks them to choose an option.'}, 'prompt': {'type': 'string', 'maxLength': 500, 'description': 'The work/request shown to the human.'}, 'options': {'type': 'array', 'items': {'oneOf': [{'type': 'string', 'maxLength': 40}, {'type': 'object', 'required': ['value', 'label'], 'properties': {'label': {'type': 'string', 'maxLength': 40}, 'style': {'enum': ['primary', 'danger', 'default'], 'type': 'string'}, 'value': {'type': 'string', 'maxLength': 40}}, 'additionalProperties': False}]}, 'maxItems': 4, 'minItems': 2, 'description': 'Required for question and forbidden for ack. Each item may be a label string or a structured option.'}, 'urgency': {'enum': ['active', 'passive'], 'type': 'string', 'description': 'Notification interruption level. Defaults to active.'}, 'audience': {'type': 'object', 'required': ['type', 'user_id'], 'properties': {'type': {'enum': ['direct'], 'type': 'string'}, 'user_id': {'enum': ['me'], 'type': 'string', 'description': 'The authorizing human, expressed as the literal value "me".'}}, 'additionalProperties': False}, 'reply_to': {'type': 'string', 'maxLength': 255, 'description': 'Optional routing pointer.'}, 'expires_in': {'type': 'integer', 'description': 'Seconds before the handoff expires; the server clamps this to its safe range.'}, 'correlation_id': {'type': 'string', 'maxLength': 255, 'description': 'Your own stable correlation id.'}, 'idempotency_key': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'Stable key for at-most-once creation across both Ack and Question kinds.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
create_public_room
Create Public Room
Create a publicly discoverable room with a unique @handle. Counts toward the free-plan five-room cap.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['name', 'icon', 'color', 'handle'], 'properties': {'icon': {'type': 'string', 'description': 'A v3 room-icon catalog id, e.g. "bell". Call list_room_icons to discover the valid ids.'}, 'name': {'type': 'string', 'maxLength': 24, 'description': 'Room display name.'}, 'color': {'type': 'string', 'description': 'Hex color, e.g. "#e33122".'}, 'handle': {'type': 'string', 'pattern': '^[a-z0-9_]{3,20}$', 'description': 'Globally unique @handle (vanity URL): lowercase letters, digits, underscores.'}, 'category': {'type': 'string', 'maxLength': 100, 'description': 'Discovery category.'}, 'show_owner': {'type': 'boolean', 'description': 'Whether the owner is shown publicly. Defaults to true.'}, 'description': {'type': 'string', 'maxLength': 120, 'description': 'Short room description shown in public discovery.'}, 'location_name': {'type': 'string', 'maxLength': 160, 'description': 'Place name shown in nearby discovery. Send all three location fields or none.'}, 'location_latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees. Send all three location fields or none.'}, 'location_longitude': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees. Send all three location fields or none.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
create_room
Create Room
Create a new private room owned by the authenticated account. Free accounts may own up to five rooms. If this agent was granted every room and has no delivery room yet, the new room becomes its delivery room — where its handoffs and direct questions land.
Esquema de entrada
{'type': 'object', 'required': ['name', 'icon', 'color'], 'properties': {'icon': {'type': 'string', 'description': 'A v3 room-icon catalog id, e.g. "bell". Call list_room_icons to discover the valid ids.'}, 'name': {'type': 'string', 'maxLength': 24, 'description': 'Room display name.'}, 'color': {'type': 'string', 'description': 'Hex color, e.g. "#e33122".'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
create_webhook
Create Webhook
Create an incoming webhook for a room the account owns. The bound account must be Pro. Returns the secret trigger URL — treat it as a credential.
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'name'], 'properties': {'icon': {'type': 'string', 'description': 'A v3 room-icon catalog id, e.g. "bell". Call list_room_icons to discover the valid ids.'}, 'name': {'type': 'string', 'maxLength': 100, 'description': 'Webhook name (shown to the owner).'}, 'color': {'type': 'string', 'description': 'Hex color, e.g. "#e33122".'}, 'sound': {'type': 'string', 'description': 'Canonical sound id, e.g. "ting". Omit for the room default.'}, 'title': {'type': 'string', 'maxLength': 40, 'description': 'Optional push title used when the webhook fires.'}, 'enabled': {'type': 'boolean', 'description': 'Whether the webhook is active. Defaults to true.'}, 'message': {'type': 'string', 'maxLength': 160, 'description': 'Optional default push body (max 120 characters in private rooms, 160 in public rooms).'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'action_number': {'type': ['integer', 'null'], 'maximum': 16, 'minimum': 1, 'description': 'Quick-action slot whose label, sound, and acknowledgement preset fires use. Omit or pass null for an independent webhook with no Quick Ping preset.'}, 'cooldown_seconds': {'type': 'integer', 'maximum': 60, 'minimum': 0, 'description': 'Minimum seconds between fires. Defaults to 5.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'id': {'type': ['string', 'null'], 'format': 'uuid'}, 'icon': {'type': ['string', 'null']}, 'name': {'type': ['string', 'null']}, 'color': {'type': ['string', 'null']}, 'sound': {'type': ['string', 'null']}, 'title': {'type': ['string', 'null']}, 'enabled': {'type': 'boolean'}, 'message': {'type': ['string', 'null']}, 'webhook_url': {'type': ['string', 'null']}, 'action_number': {'type': ['integer', 'null']}, 'cooldown_seconds': {'type': ['integer', 'null']}}, 'description': 'An incoming webhook. `webhook_url` embeds the secret — treat it as a credential.', 'additionalProperties': False}}, 'additionalProperties': False}
delete_attachment
Delete Attachment
Delete an attachment this agent uploaded that is not yet claimed by a ping.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['attachment_id'], 'properties': {'attachment_id': {'type': 'string', 'format': 'uuid', 'description': 'Attachment id returned by upload_attachment.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
delete_webhook
Delete Webhook
Delete an incoming webhook (by id) from a room the account owns.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'webhook_id'], 'properties': {'webhook_id': {'type': 'string', 'description': 'Webhook id (from list_webhooks or create_webhook).'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
disconnect
Disconnect
Revoke this authenticated robot connection, including its access and refresh credentials and room memberships. Use only when the human explicitly requests logout, disconnection, or reconnection. Call BEFORE clearing local credentials or running MCP logout/login. It affects only the current connection and accepts no account or robot selector. After login, restart or reload the MCP client, then match connection_info owner.id and handle to the approved account and robot before sending.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'required': ['status', 'handle', 'owner'], 'properties': {'owner': {'type': 'object', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string', 'pattern': '^[A-Z0-9]{12}$', 'description': 'The human public User ID shown in PingRoom, not an internal database identifier.'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'handle': {'type': 'string'}, 'status': {'enum': ['active', 'revoked'], 'type': 'string'}}, 'description': 'The authenticated robot and its owner public User ID, for account verification.', 'additionalProperties': True}}, 'additionalProperties': False}
get_approval
Get Approval
Fetch the current status of an approval request without blocking.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['approval_id'], 'properties': {'approval_id': {'type': 'string', 'format': 'uuid', 'description': 'Approval request id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
get_attachment
Get Attachment
Fetch an attachment visible to this agent as base64 content plus metadata. Results over the connector size limit return attachment_too_large — fetch those via the agent REST API instead.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['attachment_id'], 'properties': {'attachment_id': {'type': 'string', 'format': 'uuid', 'description': 'Attachment id returned by upload_attachment.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
get_handoff
Get Handoff
Fetch the authoritative current state of one Handoff without blocking.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['handoff_id'], 'properties': {'handoff_id': {'type': 'string', 'format': 'uuid', 'description': 'Handoff id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
get_live_status
Get Live Status
Read back the current state of a live stream you created, so a restarted producer can reconcile instead of starting a duplicate. Only returns streams started by this credential, within the last 24 hours. Returns notification_id and correlation_id, then the stored display state (state, progress, message, category, template, accent_override, eta_at, deadline_at, duration_seconds, metrics, prompt, options, left, right, center, steps, current_step), action_state, and updated_at. Fields you never set come back as null rather than being omitted, so a matchup/metrics/countdown/question stream can be resumed without re-sending content.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'correlation_id'], 'properties': {'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'correlation_id': {'type': 'string', 'maxLength': 255, 'description': 'The stream key used when the stream was started.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
get_notification
Get Notification
Fetch one visible ping by notification id, including its current action_state.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['notification_id'], 'properties': {'notification_id': {'type': 'string', 'format': 'uuid', 'description': 'Room notification id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'id': {'type': 'string', 'format': 'uuid'}, 'data': {'type': 'object', 'description': 'Structured context after connector privacy filtering. Credential, account, and direct-contact fields are removed.', 'maxProperties': 25, 'additionalProperties': True}, 'room': {'type': 'object'}, 'state': {'type': 'string'}, 'sender': {'type': 'object'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'question': {}, 'attachments': {'type': 'array'}, 'action_state': {'type': 'object'}, 'origin_agent': {'type': 'object', 'description': 'Present when a connected agent originated the ping: its handle and display name.'}, 'correlation_id': {'type': ['string', 'null']}, 'delivery_state': {'type': 'string'}, 'notification_id': {'type': 'string', 'format': 'uuid'}}, 'description': 'A privacy-minimized, chainable PingRoom notification result.', 'additionalProperties': True}}, 'additionalProperties': False}
get_question
Get Question
Fetch the current state of a question without blocking.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['question_id'], 'properties': {'question_id': {'type': 'string', 'format': 'uuid', 'description': 'Question id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
get_room
Get Room
Fetch a single room by its invite code, including members and quick actions.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code'], 'properties': {'invite_code': {'type': 'string', 'description': 'Room invite code.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
join_room
Join Room
Join a room using its invite code. Include the password only if the room is protected.
Destructivo Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code'], 'properties': {'password': {'type': 'string', 'description': 'Only required for password-protected rooms.'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
list_handoffs
List Handoffs
List a bounded page of this agent's Handoffs, newest first. Omit state (or use open) for unresolved work; use all for history and page while has_more is true.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'page': {'type': 'integer', 'minimum': 1, 'description': 'Page number, newest first.'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Handoffs per page. Defaults to 10; maximum 25.'}, 'state': {'enum': ['open', 'all'], 'type': 'string', 'description': 'Filter to open Handoffs or include all states.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'required': ['handoffs', 'page', 'per_page', 'has_more'], 'properties': {'page': {'type': 'integer'}, 'handoffs': {'type': 'array', 'items': {'type': 'object'}}, 'has_more': {'type': 'boolean'}, 'per_page': {'type': 'integer'}}, 'additionalProperties': False}}, 'additionalProperties': False}
list_notifications
List Notifications
List a bounded page of recent pings across approved rooms, newest first. Use page to continue while has_more is true.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'date': {'type': 'string', 'format': 'date', 'description': 'Only pings created on this calendar date, e.g. "2026-08-25".'}, 'page': {'type': 'integer', 'minimum': 1, 'description': 'Page number, newest first.'}, 'type': {'enum': ['received', 'sent'], 'type': 'string', 'description': 'Narrow to pings you received or pings you sent. Omit for both.'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Pings per page. Defaults to 10; maximum 25.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'page': {'type': ['integer', 'null']}, 'total': {'type': ['integer', 'null']}, 'has_more': {'type': 'boolean'}, 'per_page': {'type': ['integer', 'null']}, 'last_page': {'type': ['integer', 'null']}, 'notifications': {'type': 'array', 'items': {'type': 'object', 'properties': {'id': {'type': 'string', 'format': 'uuid'}, 'data': {'type': 'object', 'description': 'Structured context after connector privacy filtering. Credential, account, and direct-contact fields are removed.', 'maxProperties': 25, 'additionalProperties': True}, 'room': {'type': 'object'}, 'state': {'type': 'string'}, 'sender': {'type': 'object'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'question': {}, 'attachments': {'type': 'array'}, 'action_state': {'type': 'object'}, 'origin_agent': {'type': 'object', 'description': 'Present when a connected agent originated the ping: its handle and display name.'}, 'correlation_id': {'type': ['string', 'null']}, 'delivery_state': {'type': 'string'}, 'notification_id': {'type': 'string', 'format': 'uuid'}}, 'description': 'A privacy-minimized, chainable PingRoom notification result.', 'additionalProperties': True}}}, 'additionalProperties': False}}, 'additionalProperties': False}
list_questions
List Questions
List a bounded page of questions you asked, newest first. Optionally filter by state; use page while has_more is true.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'page': {'type': 'integer', 'minimum': 1, 'description': 'Page number, newest first.'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Questions per page. Defaults to 10; maximum 25.'}, 'state': {'enum': ['pending', 'answered', 'expired', 'cancelled', 'all'], 'type': 'string', 'description': 'Filter by state. Omit for all.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'required': ['questions', 'page', 'per_page', 'has_more'], 'properties': {'page': {'type': 'integer'}, 'has_more': {'type': 'boolean'}, 'per_page': {'type': 'integer'}, 'questions': {'type': 'array', 'items': {'type': 'object'}}}, 'additionalProperties': False}}, 'additionalProperties': False}
list_quick_actions
List Quick Actions
List the quick actions configured for a room.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code'], 'properties': {'invite_code': {'type': 'string', 'description': 'Room invite code.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'properties': {'icon': {'type': ['string', 'null']}, 'label': {'type': ['string', 'null']}, 'input_type': {'enum': ['none', 'location', 'link', 'file', 'photo', 'pdf'], 'type': 'string'}, 'requires_ack': {'type': 'boolean'}, 'action_number': {'type': ['integer', 'null']}}, 'additionalProperties': False}}}, 'additionalProperties': False}
list_room_icons
List Room Icons
List the room-icon catalog (icon ids, tags, and categories). Call this before create_room / create_public_room / create_webhook to pick a valid icon id, and to interpret icon values returned by reads.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
list_rooms
List Rooms
List the rooms the authenticated account belongs to.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'properties': {'icon': {'type': ['string', 'null']}, 'name': {'type': ['string', 'null']}, 'type': {'type': ['string', 'null']}, 'color': {'type': ['string', 'null']}, 'muted': {'type': 'boolean'}, 'paused': {'type': 'boolean'}, 'is_public': {'type': 'boolean'}, 'description': {'type': ['string', 'null']}, 'invite_code': {'type': ['string', 'null']}, 'quick_actions': {'type': 'array', 'items': {'type': 'object', 'properties': {'icon': {'type': ['string', 'null']}, 'label': {'type': ['string', 'null']}, 'input_type': {'enum': ['none', 'location', 'link', 'file', 'photo', 'pdf'], 'type': 'string'}, 'requires_ack': {'type': 'boolean'}, 'action_number': {'type': ['integer', 'null']}}, 'additionalProperties': False}}, 'quick_action_count': {'type': 'integer', 'maximum': 16, 'minimum': 0}, 'quick_action_limit': {'enum': [4, 16], 'type': 'integer'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
list_webhooks
List Webhooks
List the incoming webhooks (with their trigger URLs) for a room the account owns.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code'], 'properties': {'invite_code': {'type': 'string', 'description': 'Room invite code.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'properties': {'id': {'type': ['string', 'null'], 'format': 'uuid'}, 'icon': {'type': ['string', 'null']}, 'name': {'type': ['string', 'null']}, 'color': {'type': ['string', 'null']}, 'sound': {'type': ['string', 'null']}, 'title': {'type': ['string', 'null']}, 'enabled': {'type': 'boolean'}, 'message': {'type': ['string', 'null']}, 'webhook_url': {'type': ['string', 'null']}, 'action_number': {'type': ['integer', 'null']}, 'cooldown_seconds': {'type': ['integer', 'null']}}, 'description': 'An incoming webhook. `webhook_url` embeds the secret — treat it as a credential.', 'additionalProperties': False}}}, 'additionalProperties': False}
live_status
Publish Live Status
Start, update, or end a live progress card on the room members' lock screen (an iOS Live Activity / Android live update). Reuse the same correlation_id for every ping of one stream: the first ping starts the card and sends one alert, further "running" pings move it silently, and the first "done"/"failed" sends one completion alert and ends it. Free accounts get a small number of NEW streams per day; updates and the final ping of an open stream are never charged; a first ping that is already "done"/"failed" counts as a new stream.
Acceso externo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'correlation_id', 'live_status'], 'properties': {'data': {'type': 'object', 'description': 'Arbitrary structured context (max 25 keys / 8KB), returned on read surfaces after connector privacy filtering. Do not put secrets in data.'}, 'title': {'type': 'string', 'maxLength': 40, 'description': "Card title. Defaults to the selected quick action's label."}, 'action': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Quick-action slot to attribute the stream to (supplies the icon and sound).'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'live_status': {'type': 'object', 'required': ['state'], 'properties': {'left': {'type': 'object', 'required': ['label', 'value'], 'properties': {'label': {'type': 'string', 'maxLength': 24}, 'value': {'type': 'string', 'maxLength': 24}}, 'description': 'Left side {label,value} for the matchup template.', 'additionalProperties': False}, 'right': {'type': 'object', 'required': ['label', 'value'], 'properties': {'label': {'type': 'string', 'maxLength': 24}, 'value': {'type': 'string', 'maxLength': 24}}, 'description': 'Right side {label,value} for the matchup template.', 'additionalProperties': False}, 'state': {'enum': ['running', 'done', 'failed'], 'type': 'string', 'description': 'running keeps the card live; done/failed end it with one completion alert.'}, 'steps': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40}, 'maxItems': 8, 'minItems': 2, 'description': 'Step labels. Required on the first ping of a steps stream; immutable afterwards.'}, 'center': {'type': 'string', 'maxLength': 40, 'description': 'Center score/clock for the matchup template.'}, 'eta_at': {'type': 'integer', 'description': 'Epoch seconds; renders a live ETA on status/progress.'}, 'prompt': {'type': 'string', 'maxLength': 256, 'description': 'The ask, for the question template.'}, 'message': {'type': 'string', 'maxLength': 256, 'description': "The card's live message line."}, 'metrics': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'value'], 'properties': {'label': {'type': 'string', 'maxLength': 24}, 'value': {'type': 'string', 'maxLength': 24}}, 'additionalProperties': False}, 'maxItems': 3, 'description': 'Up to 3 {label,value} counters for the metrics template.'}, 'options': {'type': 'array', 'items': {'type': 'object', 'required': ['value', 'label'], 'properties': {'label': {'type': 'string', 'maxLength': 40}, 'value': {'type': 'string', 'maxLength': 64}}, 'additionalProperties': False}, 'maxItems': 4, 'description': 'Up to 4 {value,label} choices for the question template.'}, 'category': {'enum': ['status', 'steps', 'alert'], 'type': 'string', 'description': 'Legacy rendering category; prefer template. "alert" has NO template equivalent and is the only way to start a stream time-sensitive (breaks through Focus). Fixed at stream creation.'}, 'progress': {'type': 'number', 'maximum': 1, 'minimum': 0, 'description': 'Progress bar / Dynamic Island gauge, 0..1.'}, 'template': {'enum': ['status', 'steps', 'progress', 'metrics', 'countdown', 'question', 'matchup'], 'type': 'string', 'description': 'Which layout the OS renders. Fixed at stream creation.'}, 'deadline_at': {'type': 'integer', 'description': 'Epoch seconds the countdown template counts down to.'}, 'current_step': {'type': 'integer', 'maximum': 8, 'minimum': 0, 'description': 'Index into steps; the only mutable steps field.'}, 'accent_override': {'type': 'string', 'description': 'Hex #rrggbb; a semantic accent for one frame (e.g. deadline red).'}, 'duration_seconds': {'type': 'integer', 'maximum': 4102444800, 'minimum': 1, 'description': 'Original countdown duration in seconds. Set on creation; preserved through updates and completion.'}}, 'description': "The live card's state. Only state is required.", 'additionalProperties': False}, 'requires_ack': {'type': 'boolean', 'description': 'Add an Acknowledge button; the first eligible member to tap resolves it for everyone. Does not raise the interruption level — set category "alert" for a time-sensitive start.'}, 'correlation_id': {'type': 'string', 'maxLength': 255, 'description': 'The stream key. Reuse it on every ping of the same stream.'}, 'ack_timeout_seconds': {'type': 'integer', 'maximum': 86400, 'minimum': 1, 'description': 'Optional acknowledgement deadline in seconds.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
redeem_code
Redeem Pro Code
Redeem a gifted Pro or promo code for the human account that connected this agent. Consumes a single-use code and grants Pro; no room or paid plan is required. Use only a code the user supplied for redemption. Existing eligibility and one-per-account limits apply. Do not retry a successful redemption.
Destructivo
Esquema de entrada
{'type': 'object', 'required': ['code'], 'properties': {'code': {'type': 'string', 'pattern': '^[ \\t\\r\\n]*[A-Za-z0-9]{12}[ \\t\\r\\n]*$', 'description': 'The 12-letter/digit gift or promo code. Case-insensitive; surrounding whitespace is trimmed.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'required': ['message', 'kind', 'reward_days', 'package', 'lifetime', 'plan', 'plan_expires_at'], 'properties': {'kind': {'enum': ['gift', 'redeem'], 'type': 'string'}, 'plan': {'enum': ['pro'], 'type': 'string'}, 'message': {'type': 'string'}, 'package': {'enum': ['monthly', 'yearly', 'lifetime', None], 'type': ['string', 'null']}, 'lifetime': {'type': 'boolean'}, 'reward_days': {'type': ['integer', 'null']}, 'plan_expires_at': {'type': ['string', 'null']}}, 'additionalProperties': False}}, 'additionalProperties': False}
request_approval
Request Approval
Ask the human to approve or reject an action, then block on their answer (pair with wait_for_approval). Delivered as a push to the room. The connected human must be the room owner or an admin, or the room must allow everyone to trigger; otherwise 403 forbidden (ask_question, which targets only the connected human, has no such requirement). Rate-limited.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'question'], 'properties': {'ttl': {'type': 'integer', 'minimum': 1, 'description': 'Seconds the request stays open before it expires.'}, 'data': {'type': 'object', 'description': 'Arbitrary structured context, returned on reads after connector privacy filtering. Do not put secrets in data.'}, 'title': {'type': 'string', 'maxLength': 40, 'description': 'Optional short title for the request.'}, 'options': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40}, 'maxItems': 4, 'minItems': 2, 'description': 'Answers to choose between. Defaults to ["approve","deny"].'}, 'question': {'type': 'string', 'maxLength': 500, 'description': 'What you want the human to decide on.'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'correlation_id': {'type': 'string', 'maxLength': 255, 'description': 'Your own id, echoed back unchanged on read.'}, 'idempotency_key': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'Stable key so a retried call cannot create a second one.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
rotate_handle
Rotate Agent Handle
Rotate this agent's public handle — kill-switch for a leaked handle.
Destructivo
Esquema de entrada
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
set_avatar
Set Agent Avatar
Set this agent's avatar. Must be one of the PingRoom bot avatars.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['avatar_id'], 'properties': {'avatar_id': {'type': 'string', 'description': 'Bot avatar id, e.g. "bots-3".'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
trigger_quick_action
Trigger Quick Action
Press a room quick action, notifying its members. Rate-limited. Read the action's input_type first (list_quick_actions): location needs data.location, link needs data.url, file/photo/pdf need attachment_ids — a press without the matching detail is a 422 quick_action_input_required.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'action_number'], 'properties': {'data': {'type': 'object', 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'An absolute http:// or https:// URL.'}, 'location': {'type': 'object', 'required': ['latitude', 'longitude'], 'properties': {'label': {'type': 'string', 'maxLength': 100, 'description': 'Optional place name shown to the recipient.'}, 'address': {'type': 'string', 'maxLength': 255, 'description': 'Optional formatted street address.'}, 'latitude': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees.'}, 'longitude': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees.'}}, 'description': 'A shareable geographic location.', 'additionalProperties': False}}, 'description': 'The detail this press carries. data.location satisfies an action whose input_type is location; data.url satisfies link. Only these two keys are accepted on a trigger.', 'additionalProperties': False}, 'ack_mode': {'enum': ['any', 'all'], 'type': 'string', 'description': 'Confirmation rule for this press: any (default) resolves on the first confirmation; all waits for every original eligible recipient. Applies only when this press requires acknowledgement.'}, 'is_urgent': {'type': 'boolean', 'description': "Deliver this one press time-sensitive so it breaks through Focus / Do Not Disturb and reaches members who muted the room or you (a block still wins). Send-time only — the action's saved configuration is unchanged."}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'requires_ack': {'type': 'boolean', 'description': "Keep this one press open until an eligible recipient acknowledges it. Send-time only and elevating only: true adds the acknowledgement to an action that has none, false never disables the action's stored ack policy."}, 'action_number': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Quick-action slot number (1–16). Slots 5–16 require the room owner to have Pro.'}, 'attachment_ids': {'type': 'array', 'items': {'type': 'string', 'format': 'uuid'}, 'maxItems': 4, 'description': "Ids of up to 4 uploaded attachments (see upload_attachment). Required when the action's input_type is file, photo (jpg/png only) or pdf (pdf only); a mismatched type is a 422 quick_action_input_type."}, 'trigger_source': {'enum': ['manual', 'location'], 'type': 'string', 'description': 'Defaults to "manual". Only these two are client-settable — "webhook" and "system" are stamped server-side and are rejected here.'}, 'quick_action_id': {'type': 'string', 'format': 'uuid', 'description': 'Optional id of the action as read from list_quick_actions. When the slot has since moved pages the press is refused with 409 quick_action_layout_changed instead of firing the wrong Ping.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'id': {'type': 'string', 'format': 'uuid'}, 'data': {'type': 'object', 'description': 'Structured context after connector privacy filtering. Credential, account, and direct-contact fields are removed.', 'maxProperties': 25, 'additionalProperties': True}, 'room': {'type': 'object'}, 'state': {'type': 'string'}, 'sender': {'type': 'object'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'question': {}, 'attachments': {'type': 'array'}, 'action_state': {'type': 'object'}, 'origin_agent': {'type': 'object', 'description': 'Present when a connected agent originated the ping: its handle and display name.'}, 'correlation_id': {'type': ['string', 'null']}, 'delivery_state': {'type': 'string'}, 'notification_id': {'type': 'string', 'format': 'uuid'}}, 'description': 'A privacy-minimized, chainable PingRoom notification result.', 'additionalProperties': True}}, 'additionalProperties': False}
update_quick_action
Update Quick Action
Configure a numbered quick-action slot for a room the account owns.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'action_number', 'label', 'icon'], 'properties': {'icon': {'type': 'string', 'description': 'Emoji or icon id.'}, 'label': {'type': 'string', 'maxLength': 255, 'description': 'Button label. Must be sent, but may be empty ("") — a Ping can be named by its emoji alone, and clients render an untitled one as just the emoji.'}, 'sound': {'type': 'string', 'description': 'Canonical sound id, e.g. "ting". Omit for the room default.'}, 'input_type': {'enum': ['none', 'location', 'link', 'file', 'photo', 'pdf'], 'type': 'string', 'description': 'Detail every press of this action must carry: none (default), location (data.location), link (data.url), file (any attachment), photo (jpg/png attachment) or pdf (pdf attachment). A press without it is a 422 quick_action_input_required.'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'requires_ack': {'type': 'boolean', 'description': 'Whether pings from this action remain open until one eligible recipient acknowledges them.'}, 'action_number': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Quick-action slot number (1–16). Slots 5–16 require the room owner to have Pro.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
update_quick_actions
Update Quick Actions
Configure several of a room's quick-action slots in one call. Prefer this over repeated update_quick_action: each single-slot write wakes the owner's device with its own background refresh, so setting up four Pings one at a time spends four of a finite daily push budget on one operation. Slots you do not list are left exactly as they are, so this is also the right tool for editing a single Ping.
Destructivo Idempotente
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'actions'], 'properties': {'actions': {'type': 'array', 'items': {'type': 'object', 'required': ['action_number', 'label', 'icon'], 'properties': {'icon': {'type': 'string', 'description': 'Emoji or icon id.'}, 'label': {'type': 'string', 'maxLength': 255, 'description': 'Button label. Must be sent, but may be empty ("") — a Ping can be named by its emoji alone, and clients render an untitled one as just the emoji.'}, 'sound': {'type': 'string', 'description': 'Canonical sound id, e.g. "ting". Omit for the room default.'}, 'input_type': {'enum': ['none', 'location', 'link', 'file', 'photo', 'pdf'], 'type': 'string', 'description': 'Detail every press of this action must carry: none (default), location (data.location), link (data.url), file (any attachment), photo (jpg/png attachment) or pdf (pdf attachment). A press without it is a 422 quick_action_input_required.'}, 'requires_ack': {'type': 'boolean', 'description': 'Whether pings from this action remain open until one eligible recipient acknowledges them.'}, 'action_number': {'type': 'integer', 'maximum': 16, 'minimum': 1, 'description': 'Quick-action slot number (1–16). Slots 5–16 require the room owner to have Pro.'}}, 'additionalProperties': False}, 'maxItems': 16, 'minItems': 1, 'description': 'Add new pages as complete groups of four in order (5–8, 9–12, 13–16); the room owner needs Pro. The slots to write. Each action_number must appear at most once. Slots omitted here keep their current configuration — nothing in this tool deletes an action.'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
update_webhook
Update Webhook
Update an incoming webhook (by id) on a room the account owns — e.g. change its icon, title, message, or sound.
Destructivo
Esquema de entrada
{'type': 'object', 'required': ['invite_code', 'webhook_id'], 'properties': {'icon': {'type': 'string', 'description': 'A v3 room-icon catalog id, e.g. "bell". Call list_room_icons to discover the valid ids.'}, 'name': {'type': 'string', 'maxLength': 100, 'description': 'Webhook name (shown to the owner).'}, 'color': {'type': 'string', 'description': 'Hex color, e.g. "#e33122".'}, 'sound': {'type': 'string', 'description': 'Canonical sound id, e.g. "ting".'}, 'title': {'type': 'string', 'maxLength': 40, 'description': 'Push title used when the webhook fires.'}, 'enabled': {'type': 'boolean', 'description': 'Whether the webhook is active.'}, 'message': {'type': 'string', 'maxLength': 160, 'description': 'Default push body (max 120 characters in private rooms, 160 in public rooms).'}, 'webhook_id': {'type': 'string', 'description': 'Webhook id (from list_webhooks or create_webhook).'}, 'invite_code': {'type': 'string', 'description': 'Room invite code.'}, 'action_number': {'type': ['integer', 'null'], 'maximum': 16, 'minimum': 1, 'description': 'Quick-action slot whose label, sound, and acknowledgement preset fires use. Pass null to clear the preset and make the webhook independent.'}, 'cooldown_seconds': {'type': 'integer', 'maximum': 60, 'minimum': 0, 'description': 'Minimum seconds between fires.'}, 'regenerate_secret': {'type': 'boolean', 'description': 'Rotate the secret trigger URL.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'id': {'type': ['string', 'null'], 'format': 'uuid'}, 'icon': {'type': ['string', 'null']}, 'name': {'type': ['string', 'null']}, 'color': {'type': ['string', 'null']}, 'sound': {'type': ['string', 'null']}, 'title': {'type': ['string', 'null']}, 'enabled': {'type': 'boolean'}, 'message': {'type': ['string', 'null']}, 'webhook_url': {'type': ['string', 'null']}, 'action_number': {'type': ['integer', 'null']}, 'cooldown_seconds': {'type': ['integer', 'null']}}, 'description': 'An incoming webhook. `webhook_url` embeds the secret — treat it as a credential.', 'additionalProperties': False}}, 'additionalProperties': False}
upload_attachment
Upload Attachment
Upload a small file (max ~90 KiB over MCP; Pro account required) and get an attachment id to include in broadcast or ask_question via attachment_ids. Larger files: use the PingRoom CLI or agent REST API.
Esquema de entrada
{'type': 'object', 'required': ['filename', 'content_base64'], 'properties': {'filename': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'File name including extension, e.g. report.md.'}, 'mime_type': {'type': 'string', 'maxLength': 100, 'description': 'Optional MIME type, e.g. text/markdown. Defaults from the filename extension.'}, 'content_base64': {'type': 'string', 'maxLength': 124000, 'minLength': 1, 'description': 'Base64-encoded file bytes (standard alphabet, padding optional).'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
wait_for_ack
Wait for Acknowledgement
Long-poll a generic acknowledgement-required ping until its confirmation rule is met (any: first confirmation; all: every original eligible recipient), it expires, or the timeout elapses. Questions use wait_for_answer instead.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['notification_id'], 'properties': {'timeout': {'type': 'integer', 'maximum': 30, 'minimum': 0, 'description': 'Seconds to hold the request open. Use 0 for an immediate authoritative state read.'}, 'notification_id': {'type': 'string', 'format': 'uuid', 'description': 'Room notification id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'id': {'type': 'string', 'format': 'uuid'}, 'data': {'type': 'object', 'description': 'Structured context after connector privacy filtering. Credential, account, and direct-contact fields are removed.', 'maxProperties': 25, 'additionalProperties': True}, 'room': {'type': 'object'}, 'state': {'type': 'string'}, 'sender': {'type': 'object'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'question': {}, 'attachments': {'type': 'array'}, 'action_state': {'type': 'object'}, 'origin_agent': {'type': 'object', 'description': 'Present when a connected agent originated the ping: its handle and display name.'}, 'correlation_id': {'type': ['string', 'null']}, 'delivery_state': {'type': 'string'}, 'notification_id': {'type': 'string', 'format': 'uuid'}}, 'description': 'A privacy-minimized, chainable PingRoom notification result.', 'additionalProperties': True}}, 'additionalProperties': False}
wait_for_answer
Wait for Answer
Long-poll a question until it is answered or expires. Returns the state and, once answered, the chosen option value + label and the responder.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['question_id'], 'properties': {'timeout': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Seconds to hold the request open (server-capped).'}, 'question_id': {'type': 'string', 'format': 'uuid', 'description': 'Question id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
wait_for_approval
Wait for Approval
Long-poll an approval request until the human decides or it expires. Returns the status and, once decided, the chosen option.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['approval_id'], 'properties': {'timeout': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Seconds to hold the request open (server-capped).'}, 'approval_id': {'type': 'string', 'format': 'uuid', 'description': 'Approval request id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
wait_for_handoff
Wait for Handoff
Long-poll a Handoff until the human resolves it, it expires, or the bounded timeout elapses. For the onboarding Question returned by activate_agent_inbox, success requires an answered result with activation_completed true; use a bounded local deadline and treat any terminal answer without that stamp as incomplete.
Esquema de entrada
{'type': 'object', 'required': ['handoff_id'], 'properties': {'timeout': {'type': 'integer', 'maximum': 25, 'minimum': 0, 'description': 'Seconds to hold the request open; use 0 for an immediate state read.'}, 'handoff_id': {'type': 'string', 'format': 'uuid', 'description': 'Handoff id.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'description': 'Purpose-built PingRoom result with credential and account fields removed.'}}, 'additionalProperties': False}
wait_for_notification
Wait for Notification
Long-poll for the next ping. Blocks until one arrives or the timeout elapses — the real-time inbound channel for an agent. The agent's own sends are excluded.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'properties': {'after': {'type': 'string', 'format': 'uuid', 'description': 'Cursor from the previous call; omit to get the current head.'}, 'timeout': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Seconds to hold the request open (server-capped).'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'object', 'properties': {'cursor': {'type': ['string', 'null'], 'format': 'uuid'}, 'notifications': {'type': 'array', 'items': {'type': 'object', 'properties': {'id': {'type': 'string', 'format': 'uuid'}, 'data': {'type': 'object', 'description': 'Structured context after connector privacy filtering. Credential, account, and direct-contact fields are removed.', 'maxProperties': 25, 'additionalProperties': True}, 'room': {'type': 'object'}, 'state': {'type': 'string'}, 'sender': {'type': 'object'}, 'status': {'type': 'string'}, 'message': {'type': ['string', 'null']}, 'question': {}, 'attachments': {'type': 'array'}, 'action_state': {'type': 'object'}, 'origin_agent': {'type': 'object', 'description': 'Present when a connected agent originated the ping: its handle and display name.'}, 'correlation_id': {'type': ['string', 'null']}, 'delivery_state': {'type': 'string'}, 'notification_id': {'type': 'string', 'format': 'uuid'}}, 'description': 'A privacy-minimized, chainable PingRoom notification result.', 'additionalProperties': True}}}, 'additionalProperties': False}}, 'additionalProperties': False}
Modificado
get_live_status
1 de October de 2026 a las 02:50
Modificado
update_webhook
29 de September de 2026 a las 02:59
Modificado
create_webhook
29 de September de 2026 a las 02:59
Modificado
request_approval
29 de September de 2026 a las 02:59
Modificado
live_status
29 de September de 2026 a las 02:59
Modificado
update_quick_actions
23 de September de 2026 a las 02:50
Modificado
update_quick_action
23 de September de 2026 a las 02:50
Modificado
create_public_room
23 de September de 2026 a las 02:50
Modificado
trigger_quick_action
23 de September de 2026 a las 02:50
Modificado
list_quick_actions
23 de September de 2026 a las 02:50
Modificado
list_rooms
23 de September de 2026 a las 02:50
Añadido
rotate_handle
17 de September de 2026 a las 12:53
Añadido
set_avatar
17 de September de 2026 a las 12:53
Añadido
update_quick_actions
17 de September de 2026 a las 12:53
Añadido
update_quick_action
17 de September de 2026 a las 12:53
Añadido
delete_webhook
17 de September de 2026 a las 12:53
Añadido
update_webhook
17 de September de 2026 a las 12:53
Añadido
create_webhook
17 de September de 2026 a las 12:53
Añadido
list_webhooks
17 de September de 2026 a las 12:53
Añadido
join_room
17 de September de 2026 a las 12:53
Añadido
create_public_room
17 de September de 2026 a las 12:53
Añadido
create_room
17 de September de 2026 a las 12:53
Añadido
get_room
17 de September de 2026 a las 12:53
Añadido
delete_attachment
17 de September de 2026 a las 12:53
Añadido
get_attachment
17 de September de 2026 a las 12:53
Añadido
upload_attachment
17 de September de 2026 a las 12:53
Añadido
list_handoffs
17 de September de 2026 a las 12:53
Añadido
get_handoff
17 de September de 2026 a las 12:53
Añadido
wait_for_handoff
17 de September de 2026 a las 12:53
Añadido
create_handoff
17 de September de 2026 a las 12:53