Ping

Interactive Actions

Add interactive elements to your notifications. There are two categories:

  1. URL actions - Open links in Safari (no callback needed)
  2. Interactive actions - Collect user input and POST responses to your callback URL

Action Types

TypeDescriptionRequires keyRequires callback_url
urlOpens external URLNoNo
buttonClickable buttonOptionalYes
selectDropdown menuYesYes
textText input fieldYesYes
numberNumeric inputYesYes
toggleOn/off switchYesYes

URL Actions

Open links directly in Safari. No callback URL required.

JSON
{
  "type": "url",
  "label": "View Build",
  "value": "https://github.com/org/repo/actions/runs/123"
}
FieldTypeRequiredDescriptionConstraints
typestringYesMust be "url"
labelstringYesButton textMax 30 characters
valuestringYesURL to openMax 500 characters, valid URL

Button Actions

Clickable buttons that trigger callbacks. Ideal for approve/reject workflows.

JSON
{
  "type": "button",
  "label": "Approve",
  "key": "approve",
  "style": "primary"
}
FieldTypeRequiredDescriptionConstraints
typestringYesMust be "button"
labelstringYesButton textMax 30 characters
keystringNoIdentifier for callbackMax 50 characters
stylestringNoVisual styleprimary, secondary, destructive

Button Styles

  • primary - Blue button, main action
  • destructive - Red button, dangerous actions
  • secondary - Gray button, secondary actions (default)

Select Actions

Dropdown menu for selecting from predefined options.

JSON
{
  "type": "select",
  "label": "Priority",
  "key": "priority",
  "options": [
    {"label": "Low", "value": "low"},
    {"label": "Medium", "value": "medium"},
    {"label": "High", "value": "high"}
  ],
  "value": "medium"
}
FieldTypeRequiredDescriptionConstraints
typestringYesMust be "select"
labelstringYesLabel textMax 30 characters
keystringYesIdentifier for callbackMax 50 characters
optionsarrayYesSelection optionsMax 10 options
options[].labelstringYesDisplay textMax 50 characters
options[].valuestringYesValue sent in callbackMax 100 characters
valuestringNoDefault selection

Text Input Actions

Free-form text entry field.

JSON
{
  "type": "text",
  "label": "Reply",
  "key": "message",
  "placeholder": "Type your message...",
  "multiline": true
}
FieldTypeRequiredDescriptionConstraints
typestringYesMust be "text"
labelstringYesLabel textMax 30 characters
keystringYesIdentifier for callbackMax 50 characters
placeholderstringNoPlaceholder textMax 100 characters
multilinebooleanNoAllow multiple linesDefault: false
valuestringNoDefault text

Number Input Actions

Numeric input with optional min/max bounds.

JSON
{
  "type": "number",
  "label": "Quantity",
  "key": "quantity",
  "min": 1,
  "max": 100,
  "defaultValue": 10
}
FieldTypeRequiredDescriptionConstraints
typestringYesMust be "number"
labelstringYesLabel textMax 30 characters
keystringYesIdentifier for callbackMax 50 characters
minnumberNoMinimum value
maxnumberNoMaximum value
defaultValuenumberNoDefault value

Toggle Actions

Boolean on/off switch.

JSON
{
  "type": "toggle",
  "label": "Enable notifications",
  "key": "enabled",
  "value": "false"
}
FieldTypeRequiredDescriptionConstraints
typestringYesMust be "toggle"
labelstringYesLabel textMax 30 characters
keystringYesIdentifier for callbackMax 50 characters
valuestringNoDefault state"true" or "false"

Complete Examples

Approval Buttons

JSON
{
  "title": "Approve Request",
  "body": "Alice requested access to production",
  "callback_url": "https://your-server.com/approvals",
  "actions": [
    {"type": "button", "label": "Approve", "key": "approve", "style": "primary"},
    {"type": "button", "label": "Reject", "key": "reject", "style": "destructive"}
  ]
}

Preview

Approve Request

just now
Alice requested access to production

Complex Form

JSON
{
  "title": "Issue Report",
  "body": "Please provide details",
  "callback_url": "https://your-server.com/issues",
  "actions": [
    {
      "type": "select",
      "label": "Category",
      "key": "category",
      "options": [
        {"label": "Bug", "value": "bug"},
        {"label": "Feature", "value": "feature"}
      ]
    },
    {
      "type": "text",
      "label": "Description",
      "key": "description",
      "placeholder": "Describe the issue...",
      "multiline": true
    },
    {"type": "button", "label": "Submit", "key": "submit", "style": "primary"}
  ]
}

Preview

Issue Report

just now
Please provide details

URL + Interactive Buttons

JSON
{
  "title": "Review PR #42",
  "body": "alice requested your review",
  "callback_url": "https://your-server.com/reviews",
  "actions": [
    {"type": "url", "label": "View PR", "value": "https://github.com/org/repo/pull/42"},
    {"type": "button", "label": "Approve", "key": "approve", "style": "primary"},
    {"type": "button", "label": "Request Changes", "key": "changes", "style": "destructive"}
  ]
}

Preview

Review PR #42

just now
alice requested your review

Constraints

  • Maximum 5 actions per message
  • Label max 30 characters
  • Key max 50 characters
  • URL max 500 characters (must be valid)
  • Select options max 10 options
  • Option label max 50 characters
  • Option value max 100 characters
  • Placeholder max 100 characters
  • callback_url required for interactive actions (not needed for URL-only)

iOS App Behavior

The iOS app handles actions with a polished UX:

Button-Only Actions (no form fields):

  • Buttons appear directly in message bubbles
  • Tapping a button immediately sends the callback
  • Shows loading state during submission
  • After success, buttons are replaced with a "Submitted" indicator

Actions with Form Fields (select, text, number, toggle):

  • Tapping a button opens a sheet with the form
  • Form adapts to content with fields at top, submit button at bottom
  • Cancel button in top-left toolbar
  • Full-width submit button at bottom (follows HIG)
  • Sheet dismisses on successful submission

Callback Result Details:

  • Tap the "Submitted" or "Failed" indicator to see details
  • Shows: status code, timestamp, action triggered, callback URL
  • For forms: shows all submitted form values
  • Error messages displayed for failed callbacks