Helpy developer guide
Connect Claude, ChatGPT, Cursor and Hermes to Helpy over MCP, and your systems through the REST API and webhooks — always with each user's exact permissions.
Overview
There are three ways to connect anything to Helpy. All of them run with exactly the permissions and data scope of the user who connected, and follow any change immediately:
| Method | For | Address |
|---|---|---|
| MCP server | AI apps: Claude, ChatGPT, Cursor, Hermes, Claude Code, VS Code | https://helpy.ai/api/mcp |
| REST API v1 | Your systems, scripts, n8n, Make and apps | https://helpy.ai/api/v1 |
| Webhooks | Real-time events (customer created or updated) | Helpy → Apps → Zapier/Webhooks |
The full OpenAPI 3.1 description of the REST API (for Postman, Swagger and SDK generators):
https://helpy.ai/api/v1/openapi.json
Connect an AI app in two minutes
One link for every app. The app discovers sign-in by itself (OAuth): you sign in to Helpy once and approve — no key to copy. Step-by-step setup is inside Helpy under Settings → AI connections.
Server link
https://helpy.ai/api/mcp
| App | Setup |
|---|---|
| Claude | Settings → Connectors → Add custom connector → paste the link → Connect and approve. On Team/Enterprise the owner adds it once for the organization. |
| ChatGPT | Settings → Apps & Connectors → Advanced → turn on Developer mode → Create: the link with OAuth → approve. |
| Cursor | The “Add to Cursor” button in Helpy, or ~/.cursor/mcp.json then Login in MCP settings. |
| Hermes | ~/.hermes/config.yaml then hermes mcp login helpy — or an API key for unattended runs. |
| Claude Code | The command below, then /mcp → helpy → Authenticate. |
| VS Code | .vscode/mcp.json then Agent mode in Copilot Chat. |
Cursor — ~/.cursor/mcp.json
{
"mcpServers": {
"helpy": {
"url": "https://helpy.ai/api/mcp"
}
}
}Hermes — ~/.hermes/config.yaml
mcp_servers:
helpy:
url: "https://helpy.ai/api/mcp"
auth: oauth
# then run: hermes mcp login helpyClaude Code
claude mcp add --transport http helpy https://helpy.ai/api/mcp
VS Code — .vscode/mcp.json
{
"servers": {
"helpy": {
"type": "http",
"url": "https://helpy.ai/api/mcp"
}
}
}With an API key instead of sign-in (Hermes on a server, n8n, any MCP client without OAuth): send the header Authorization: Bearer <key>.
Hermes with an API key (HELPY_API_KEY environment variable)
mcp_servers:
helpy:
url: "https://helpy.ai/api/mcp"
headers:
Authorization: "Bearer ${HELPY_API_KEY}"How the MCP server works
- Transport: stateless Streamable HTTP (JSON-RPC over POST) — protocol versions 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05.
- Tools: the same tools as the Helpy assistant (about 90) — the app only sees what the user is allowed to do in their company, plan and installed apps.
- Reads run immediately. Any change returns a preview with an action_id and does nothing; after the user agrees in the chat the app calls helpy_confirm_action. There are also helpy_cancel_action and helpy_undo_action (for reversible changes, within minutes).
- Changes that affect many customers need acknowledge_bulk=true after the user confirms the count.
- search and fetch: unified search over customers, conversations and the help center (compatible with ChatGPT Deep Research).
- Ready-made prompts appear as shortcuts in Claude and Cursor:
| Prompt | What it does |
|---|---|
| daily_briefing | Today's numbers, waiting conversations, tasks and bookings — with a prioritized plan. |
| inbox_triage | Conversations waiting for a reply: a summary of each and a suggested reply. |
| follow_up_leads | New or untouched customers — who to follow up with and how. |
| customer_360 | Everything about one customer: details, conversations, tasks and bookings, and the next best step. |
| weekly_report | Last 7 days vs. the week before, with recommendations. |
| launch_campaign | A full campaign plan (page, messages, follow-up) carried out step by step with your approval. |
Limit tools to groups: append group names to the link, comma-separated, e.g. /api/mcp/crm,inbox,tasks. Account, help and approval tools are always included.
| Group | Contains |
|---|---|
| crm | Customers, stages, notes and audiences |
| inbox | Search, read, reply to and update conversations |
| tasks | Tasks and teammates |
| bookings | Bookings and availability |
| pages | Landing pages, QR codes, catalogs and brand |
| outreach | Sequences, WhatsApp templates and broadcasts |
| automations | Automations and recipes |
| agents | AI agents and their campaigns |
| calls | Calls, callbacks and call flows |
| prospects | Prospect search and company research |
| workspace | Reports, app diagnosis, team and settings |
Authentication
OAuth 2.1 (for apps a user connects themselves):
| Item | Value |
|---|---|
| Resource metadata (RFC 9728) | https://helpy.ai/.well-known/oauth-protected-resource/api/mcp |
| Authorization server (RFC 8414) | https://helpy.ai/.well-known/oauth-authorization-server |
| Authorization endpoint | https://helpy.ai/oauth/authorize |
| Token endpoint | https://helpy.ai/api/oauth/token |
| Dynamic client registration (RFC 7591) | https://helpy.ai/api/oauth/register |
| Revocation (RFC 7009) | https://helpy.ai/api/oauth/revoke |
| Scopes | helpy:read to read, helpy:write to make changes — the user can untick changes on the consent screen |
| Security | PKCE (S256) required, 1-hour access tokens, 90-day rotating refresh tokens (reuse of a stolen one closes the connection), CIMD supported |
API keys (for systems and automation): Helpy → Settings → AI connections → API keys. The key is shown once and works with both the MCP server and the REST API. “Allow changes” grants helpy:write.
Authorization: Bearer hlp_sk_YOUR_KEY
REST API v1
- Base URL: https://helpy.ai/api/v1
- Responses are always { "data": ..., "meta"?: ... } and errors { "error": { "code", "message" } }.
- Cursor pagination: send meta.nextCursor as ?cursor= on the next request.
- Translated labels (stage and service names) default to Arabic — use ?locale=en or Accept-Language: en for English.
- Anything outside the user's data scope returns 404 as if it didn't exist.
| Request | Permission | Description |
|---|---|---|
| GET /me | — | User, company, effective permissions and connection |
| GET /leads | leads.view | Customers: ?search= ?status= ?cursor= |
| POST /leads | leads.create | Create a customer (phone or email) with the app's validation and duplicate check |
| GET /leads/{id} | leads.view | Full customer profile |
| PATCH /leads/{id} | leads.status / pipeline.move / leads.assign | Status, stage, deal value or owner |
| GET|POST /leads/{id}/notes | leads.view / leads.notes | Notes |
| GET /leads/{id}/timeline | leads.view | Full activity timeline |
| GET /pipeline/stages | pipeline.view | Pipeline stages |
| GET|POST /tasks | tasks.view / tasks.create | Tasks: ?status=open|done ?scope=mine|all |
| GET|PATCH|DELETE /tasks/{id} | tasks.view / tasks.edit / tasks.delete | A task — done:true completes it |
| GET /conversations | inbox.view | Conversations: ?scope= ?state= ?channel= ?q= |
| GET /conversations/{id} | inbox.view | A conversation with its messages |
| POST /conversations/{id}/messages | inbox.reply + the channel permission | Send a text reply (WhatsApp within the 24-hour window) |
| POST /conversations/{id}/state | inbox.state | Open, snooze or close |
| GET|POST /bookings | bookings.view / bookings.create | A day's bookings ?date= or a new booking |
| GET /bookings/options · /bookings/slots | bookings.view | Resources, services and free times |
| POST /bookings/{id}/status | bookings.edit | confirm, complete or no_show |
| GET /team | team.view | Teammates and departments |
Create a customer
curl -X POST https://helpy.ai/api/v1/leads \
-H "Authorization: Bearer hlp_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Sara Ahmed","phone":"+966501112233","email":"sara@example.com","tags":["expo"]}'A follow-up task on the customer
curl -X POST https://helpy.ai/api/v1/tasks \
-H "Authorization: Bearer hlp_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Call Sara","leadId":"LEAD_ID","dueAt":"2026-11-01T09:00:00Z","priority":"HIGH"}'Reply to a conversation
curl -X POST https://helpy.ai/api/v1/conversations/CONVERSATION_ID/messages \
-H "Authorization: Bearer hlp_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"body":"أهلاً سارة، عرض السعر في الطريق 👋"}'JavaScript
const res = await fetch("https://helpy.ai/api/v1/leads?search=Sara", {
headers: { Authorization: `Bearer ${process.env.HELPY_API_KEY}` },
});
const { data, error } = await res.json();Python
import os, requests
res = requests.get(
"https://helpy.ai/api/v1/tasks",
headers={"Authorization": f"Bearer {os.environ['HELPY_API_KEY']}"},
)
tasks = res.json()["data"]Errors and limits
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_body · invalid_* · nothing_to_update | Missing or invalid input |
| 401 | unauthorized | Missing, invalid, revoked or expired token |
| 403 | forbidden · insufficient_scope · api_disabled | Missing permission, read-only key, or connections turned off for the company |
| 404 | not_found | Not found or outside the user's data scope |
| 409 | duplicate · whatsapp_window_closed · email_not_supported | Conflicts with the current state |
| 422 | validation_failed | Invalid data (phone or email) |
| 429 | rate_limited | Too many requests — wait for Retry-After |
- REST: 240 reads and 60 writes per minute per connection.
- MCP: 120 requests per minute per connection.
- Every response carries Helpy-Api-Version and X-RateLimit-Limit.
Webhooks
In Helpy → Apps → Zapier/Webhooks add your URL and pick events: lead.created and lead.updated. Each delivery is a JSON POST, retried up to 6 times until your URL answers 2xx.
Body
{
"event": "lead.created",
"data": { "id": "…", "name": "Sara Ahmed", "phone": "+9665…", "status": "NEW", "createdAt": "…" },
"firedAt": "2026-10-28T12:00:00.000Z"
}Verify the request comes from Helpy: the X-Webhook-Signature header is sha256=HMAC-SHA256(raw body, webhook secret).
Node.js
import { createHmac, timingSafeEqual } from "node:crypto";
function fromHelpy(rawBody, header, secret) {
const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
return header?.length === expected.length && timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}Security and privacy
- Every request re-checks the user, permissions and data scope from the database — nothing is cached in the token.
- Tokens and keys are stored as SHA-256 hashes only, and no secret is ever logged.
- Users disconnect any app or key instantly, and owners can disconnect their team's. “Sign out everywhere” and password changes disconnect everything.
- Connecting, disconnecting, key creation and every change are written to the audit log.
- In MCP: customer messages and notes are treated as data, not instructions, and changes need explicit approval.
- The Helpy team can turn connections off for the whole platform or a single company at once.