Quick start
- Install Noti on iPhone and allow notifications.
- Open the app and tap Copy Webhook.
-
Send a
POSTwith JSONtitle+body.
Your personal webhook looks like
https://api-noti.oksocool.com/api/notify/<deviceId>.
Endpoint
POST https://api-noti.oksocool.com/api/notify/{deviceId}
Content-Type: application/json
Replace {deviceId} with the ID from the URL you copied in
the app. No API key is required — possession of the URL is the credential. Keep it private.
Payload fields
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Notification title |
body |
string | Yes | Notification body |
subtitle |
string | No | Secondary line under the title |
sound |
string | No | Defaults to default |
image |
string (URL) | No | Rich notification image. Must be a public HTTPS URL. |
url |
string (URL) | No | Opened when the user taps the notification |
actions |
string[] | No | Action button labels, e.g. ["View","Dismiss"] |
Notification types
1. Basic alert
Only title and body. Best for CI status, cron jobs, and simple scripts.
2. Alert with subtitle
Add subtitle for branch names, environments, or short metadata.
3. Rich image
Set image to a public image URL. The server enables
mutable-content; the Noti Notification Service Extension downloads and attaches it.
4. Deep link / open URL
Set url. When the user taps the notification (or the View action),
Noti opens that link.
5. Action buttons
Pass actions as an array of button titles. The push uses the Noti
notification category so iOS can show those actions.
Examples
curl — basic
curl -X POST "https://api-noti.oksocool.com/api/notify/YOUR_DEVICE_ID" \
-H "Content-Type: application/json" \
-d '{"title":"Build Failed","body":"Error on main branch"}'
curl — rich + deep link
curl -X POST "https://api-noti.oksocool.com/api/notify/YOUR_DEVICE_ID" \
-H "Content-Type: application/json" \
-d '{
"title": "New order",
"subtitle": "#12345",
"body": "Nike Dunk Low · ¥899",
"image": "https://example.com/preview.jpg",
"url": "https://example.com/orders/12345",
"sound": "default",
"actions": ["View", "Dismiss"]
}'
GitHub Actions
- name: Notify Noti
if: failure()
run: |
curl -X POST "${{ secrets.NOTI_WEBHOOK_URL }}" \
-H "Content-Type: application/json" \
-d "{\"title\":\"CI Failed\",\"body\":\"${{ github.repository }} · ${{ github.ref_name }}\"}"
JavaScript / Node
await fetch(process.env.NOTI_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
title: "Deploy complete",
body: "production is live",
url: "https://example.com",
}),
});
Agent prompt
Don’t want to wire it yourself? Copy this prompt into ChatGPT / Claude / Cursor and paste your webhook URL. The agent can add Noti notifications to your project.
You are helping me integrate Noti, an iOS push notification webhook.
Context:
- I have the Noti iOS app installed.
- My personal webhook URL is: PASTE_YOUR_NOTI_WEBHOOK_URL_HERE
- Docs: https://noti.oksocool.com/docs
API rules:
- Method: POST
- Header: Content-Type: application/json
- Required JSON fields: "title" (string), "body" (string)
- Optional fields: "subtitle" (string), "sound" (string, default "default"), "image" (public https image URL), "url" (open on tap), "actions" (string array of button labels)
- No API key. The webhook URL itself is the secret — never commit it; use env vars / secrets.
Your task:
1) Inspect my project and find the best place to send a notification (CI failure, deploy finished, error alert, cron, form submit, etc.).
2) Implement a minimal, idiomatic integration for this stack.
3) Use environment variable NOTI_WEBHOOK_URL (or the project’s existing secrets pattern).
4) Show me exactly how to set the secret and how to test with one curl command.
5) Keep changes small. Do not add a new backend service.
Example payload:
{
"title": "Build Failed",
"body": "main · tests failed",
"url": "https://github.com/org/repo/actions"
}
Errors
| Status | Meaning |
|---|---|
200 |
Accepted and delivered to APNs (or mock success in misconfigured env) |
400 |
Missing title/body, or device has no APNs token yet (open the app and allow notifications) |
404 |
Unknown deviceId |
405 |
Only POST is allowed |
500 |
APNs delivery failed |
Tip: use the in-app Send Test Notification button first. If that works, your webhook URL and push permission are fine — debug the caller next.