Free · Open Source · No Signup

Webhooks to
Telegram,
Instantly.

POST any payload to your unique URL.
It lands in your Telegram chat within seconds.
No account. No dashboard. No config.

Type /start — get your URL in under 10 seconds.

🪝
PingHook
bot
📍 Source: github / prod
New Webhook Received
{
  "event": "push",
  "repo": "myapp",
  "branch": "main",
  "author": "asaf",
  "status": "success"
}
14:32
📍 Source: grafana
New Webhook Received
{
  "alert": "High CPU",
  "value": "94%",
  "state": "alerting"
}
14:35

Works with anything that can send a POST request

GitHub Actions Grafana n8n Zapier Make cron jobs Python scripts Node.js curl Uptime Kuma Prometheus AlertManager Any HTTP client

Three steps. Under a minute.

No email. No OAuth. No SDK.

1

Start the bot

Open Telegram, message @PingHookBot, and type /start. You get a unique webhook URL immediately.

2

Paste the URL anywhere

Add it to GitHub Actions, Grafana, n8n, a cron job, or just curl it from your terminal. If it sends HTTP, it works.

3

Get notified instantly

Every POST becomes a Telegram message. JSON is pretty-printed in a code block. Plain text supports **bold**, _italic_, and ~~strikethrough~~. Labels tag the source.

Everything you need. Nothing you don't.

🏷️

Smart Labels

Append path segments to tag events by source or environment. /send/key/github/prod shows 📍 Source: github / prod in chat.

Smart Formatting

JSON is auto-indented in a code block. Plain text supports Markdown — **bold**, _italic_, and ~~strikethrough~~ render natively in Telegram.

Zero Config

No SDK. No OAuth. No account. Your webhook URL is your only credential — paste it, POST to it, done.

📜

Webhook History

Use /history in the bot to see your last 10 webhooks — timestamp, labels, and payload preview, all in Telegram.

↩️

Replay Webhooks

Type /replay 3 to resend the 3rd most recent payload to your chat. Debug without re-triggering your pipeline.

🔒

Write-Only URLs

Your URL can only trigger notifications — it can never be used to read your data. History stays inside Telegram, where only you can access it.

5/min
Rate limit (free tier)
100 KB
Max payload size
JSON · MD · text
Accepted formats
<1s
Typical delivery time

Paste. Send. Done.

Replace YOUR_KEY with the URL from the bot.

# Send a JSON payload with a label
curl -X POST https://pinghook.dev/v1/user/send/YOUR_KEY/github/prod \
  -H "Content-Type: application/json" \
  -d '{"event":"push","repo":"myapp","branch":"main","status":"success"}'

# Response
{ "status": "ok", "message": "Notification sent." }
# Plain text — no Content-Type header needed
curl -X POST https://pinghook.dev/v1/user/send/YOUR_KEY/server \
  -d "Deployment finished. All checks passed."

# Works from any shell, script, or cron job
curl -X POST https://pinghook.dev/v1/user/send/YOUR_KEY \
  -d "Backup completed at $(date)"
# Plain text with Markdown — renders natively in Telegram
curl -X POST https://pinghook.dev/v1/user/send/YOUR_KEY/deploy \
  -d "**Deploy succeeded** on main

_Started by:_ asaf
_Duration:_ 42s
_Status:_ ~~failing~~ passing"

# Supported: **bold**  _italic_  ~~strikethrough~~
# JSON payloads are auto-formatted in a code block — no Markdown needed
# .github/workflows/notify.yml
- name: Notify via PingHook
  if: always()
  run: |
    curl -s -X POST \
      https://pinghook.dev/v1/user/send/${{ secrets.PINGHOOK_KEY }}/github/${{ github.ref_name }} \
      -H "Content-Type: application/json" \
      -d '{
        "event": "workflow_${{ job.status }}",
        "repo": "${{ github.repository }}",
        "branch": "${{ github.ref_name }}",
        "run": "${{ github.run_number }}"
      }'
# pip install requests
import requests

PINGHOOK_URL = "https://pinghook.dev/v1/user/send/YOUR_KEY"

requests.post(
    f"{PINGHOOK_URL}/my-script",
    json={"event": "job_done", "rows_processed": 42_819}
)

# Or plain text
requests.post(PINGHOOK_URL, data="ETL pipeline finished successfully")

Common questions

Is my payload data stored?

Yes — PingHook now stores your last webhooks so you can view them with /history and replay them with /replay N. Your history is only accessible through your own Telegram chat — not via the webhook URL, not via any dashboard.

What's the rate limit?

Free tier: 5 requests per 60 seconds per webhook URL. Payloads over 100 KB are rejected with a 413. Larger limits are planned for a paid tier.

What payload formats are supported?

JSON (application/json) is auto-indented in a monospace code block. Plain text supports Markdown — **bold**, _italic_, and ~~strikethrough~~ all render natively in Telegram. Both formats support labels.

Can I use multiple labels?

Yes — chain as many path segments as you want: /send/key/github/prod/backend shows 📍 Source: github / prod / backend. Labels are lowercased automatically.

Can I self-host this?

Yes. PingHook is fully open source. Clone the repo, add your own .env, and run it with Uvicorn. The schema.sql file creates everything you need in any PostgreSQL database.

What if someone gets my webhook URL?

The URL is write-only — all it can do is send a notification to your Telegram chat. The rate limiter caps abuse at 5 pings per minute. To regenerate your key, just message the bot — feature coming soon.