Hey Jango has four places where outside code can meet it. Each one is described here from the code that serves it. Anything not on this page is not open to developers: there is no public API for a person's conversations, memory, mail or files, and none is planned here.
| You want to | Use | Who sets it up |
|---|---|---|
| Let people use your service by asking Jango | A connector (MCP server) | You build it and submit it; a person reviews it; each user says yes |
| Make a two-way app inside a workspace chat | The Helper API and signed events | A workspace admin adds your helper and gives you its token |
| Post into a workspace channel from a tool | An incoming webhook (Slack-compatible) | A workspace admin makes the webhook |
| See what a published page may contain | Page rules | Anyone, by asking Jango to make a page |
Connectors (MCP)
A connector is a remote server that speaks the open Model Context Protocol. People find approved connectors by asking Jango “what can I connect?”, and Jango then uses the connector's tools for them.
- A public
https://address on port 443, Streamable HTTP (or SSE). No local or desktop servers. - It answers
initializeandtools/listwith no user data. At most 25 tools; one person can connect at most 3 services. - A tool description says what the tool does and what to pass, and nothing else. An automatic check refuses descriptions that try to steer the assistant. No tool may ask for passwords, card numbers or identity documents.
- Sign-in is either none (public information) or a per-user access key sent as
Authorization: Bearer <key>; answer a missing or wrong key with HTTP 401. OAuth sign-in pages are not supported. - Categories: travel, shopping, food, money, business, marketing, productivity, developer, news, health, education, entertainment, home, other.
Submit at heyjango.com/connectors/build. The page has a prompt you can paste into Claude or ChatGPT to scaffold a server, and the form. We check that the address answers, read its tools and run a safety check; a person then reviews it. Listing never connects it for anyone: each user is told what it does and must say yes, and can disconnect at any time. What your server returns is treated as outside content, never as instructions. If your tools change after approval they are checked again.
Helper API
A helper is a two-way app that a workspace admin adds in the app (workspace settings, Helpers, Add a helper). The admin chooses its channels and scopes and gets a token, shown once. A helper can post, reply in threads, update its own messages, put buttons on them and offer / actions. Switched off by us, every call answers paused (503).
POST https://heyjango.com/helpers/<owner>/v1/<method>
Authorization: Bearer hk_<id>_<secret>
Content-Type: application/json
<owner> is the 32-character id shown with the token. HTTPS only; any other method than POST answers 405. Methods:
| Method | Scope | Body (JSON) | Answer |
|---|---|---|---|
me | any | none | The helper's id and name, its workspace, channels, scopes and actions. |
post | post, or reply with thread_of | channel, text and/or blocks; optional thread_of (a message id), buttons | {"ok":true,"mid":"…","delivered":n} |
update | update | mid of one of its own messages, then the new text/blocks/buttons | {"ok":true,"mid":"…"} |
actions | actions | actions: a list of {"name","description"}; at most 25; a name is 1 to 32 characters of a-z, 0-9, _, - | The list as saved. It appears in members' / menu. |
key | any | pub: your X25519 public key, 32 bytes, base64 | {"ok":true}. Needed to receive the words people share with you; see sealed messages. |
Scopes: read, post, reply, update, actions. A button is {"id","label","style"} with id of letters, digits and _ . : - (up to 40), a label up to 40 characters, style primary, danger or default; at most 5 per message.
Every answer is JSON: {"ok":true,…} or {"ok":false,"reason":"…"}. Reasons you can meet: invalid_token (401), token_revoked (410), missing_scope and host_not_admin (403), channel_not_found, thread_not_found, message_not_found, unknown_method (404), no_dropbox and message_deleted (409), too_large (413), invalid_json, invalid_payload, bad_buttons, bad_actions, bad_key (400), rate_limited (429), paused (503).
Limits: 120 calls a minute per helper; a body up to 262,144 bytes; 25 helpers per workspace. An address that sends 20 bad tokens in 10 minutes is refused for 60 minutes. When a token is rotated the previous one keeps working for 60 minutes. A helper stops working if the admin who added it is no longer an admin. Every use is written to the workspace's audit log (who, address, result), never the token or the words.
Events sent to your helper
Your helper's URL (an https:// address) receives JSON POSTs for: message.new (a new message in its channels, only with the read scope and a registered key), action (a / action used) and button (a button tapped). Each body carries type, id, helper, workspace, channel, user (id and name of the member), at and the event's own fields. The words of a message are never in the clear: they arrive in sealed.
Prove the address first. Before any event is sent, we send a signed {"type":"url_verification","challenge":"…"} and require a 200 that echoes the challenge as plain text or as {"challenge":"…"}. We never follow a redirect.
Check the signature. Every event carries X-Jango-Timestamp (unix seconds) and X-Jango-Signature: v1=<hex>, where the hex is HMAC-SHA256 of "v1:" + timestamp + ":" + raw body with your signing secret. For 60 minutes after a rotation a second , v1=<hex> made with the previous secret follows. Reject old timestamps. Answer within 5 seconds; a failed delivery (no answer or a 5xx) is tried once more.
Incoming webhooks
A workspace admin makes a webhook for one channel (workspace admin screens, New webhook) and gets its address, shown once. It accepts Slack's incoming-webhook format, so a tool that posts to Slack can post here by changing only the URL.
POST https://heyjango.com/hooks/<owner>/<hook>/<secret>
Content-Type: application/json
{"text":"Deploy finished","username":"CI"}
The body is JSON, or a form with payload=. It may have text (up to 40,000 characters), up to 50 blocks, up to 20 attachments and a username; one that says nothing is refused. Body up to 1,048,576 bytes. The answer is plain text in Slack's words (ok, invalid_token, rate_limited, too_large, paused…), with the matching status; HTTPS only.
- The secret is in the address: keep the address private. Only a hash of it is kept; rotating keeps the old one working for 60 minutes; revoking is immediate.
- Admins can set an expiry, an IP allow-list (up to 20 ranges, IPv4 and IPv6), a rate per minute (default 60, at most 600) and optional signing: send
X-Jango-TimestampandX-Jango-Signature: v1=<hex>made as above with the webhook's signing secret, within 300 seconds. - 20 failures from one address in 10 minutes block it for 60 minutes. A webhook unused for 30 days is marked unused and, after 90 days, revoked unless the admin keeps it. 50 webhooks per workspace.
Sealed messages
The servers do not keep what a webhook or helper posts, or what members share with a helper, in a form they can read. It is sealed to a key that only members' phones (or, for the words shared with your helper, you) can open:
"dbx1:" + base64( eph_pub(32) | nonce(12) | ChaCha20-Poly1305 ciphertext+tag )
key = HKDF-SHA256(ikm = X25519(eph_priv, recipient_pub),
salt = "jango-dbx1", info = "jango-dropbox-v1", 32 bytes)
no associated data
To read a sealed copy sent to your helper, take the first 32 bytes as the sender's ephemeral public key, derive the key with your own X25519 private key, and open the rest. Register your public key with the key method. Known-answer vector (keys from RFC 7748 section 6.1):
recipient_priv 5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb
recipient_pub de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f
eph_priv 77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a
eph_pub 8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a
X25519 shared 4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742
nonce 000102030405060708090a0b
plaintext {"text":"Deploy finished","blocks":[],"attachments":[],"username":"CI","at":1760000000000}
HKDF key a68f9b227d75d790378a677b2d7e65dbc25f8d5da53f1b16f42f49a0ffb89a70
Pages people publish
People can ask Jango to make a small website and publish it at heyjango.app/s/<id>. These are plain pages served from a separate domain under a strict content policy, so there is nothing to integrate, but if you build tools that make such pages, these are the rules a page must meet:
- Plain HTML and inline CSS only. No
script,iframe,object,embed,form,input,textarea,select,button,base,meta,link, frame or applet tags, no event handlers, nojavascript:links, no@import. - Up to 150,000 characters; 5 pages per person; 10 publishes a day.
- A safety check refuses pages that pass themselves off as a real organisation or person, ask visitors for sign-in, payment or identity details, or show invented reviews or records.
- Every page carries a line saying it was made by a Hey Jango user and a Report link; pages reported by 3 people are taken down while they are checked.
What is not open
- No public API for a person's chats, memory, mail, calendar, files or health data. Those stay on the person's phone or sealed on our servers.
- No API keys for the assistant itself, and no way to call the brain with a person's account from outside the app.
- The apps, and the web app at heyjango.com/app (linked from a person's phone), are ours and are not an SDK.
Security and reporting
Everything above is HTTPS only. Wrong tokens are counted per address and refused after repeated failures. Tokens and secrets are shown once and kept only as hashes or locked at rest; neither the token nor the body is ever logged. If you find a way to read data that is not yours, or to act as someone else, tell us at once through the support form (topic Bug or crash or Privacy and data) and do not test it on other people's accounts. For how data is handled, see the Privacy Centre.
Last updated 29 October 2026 (first developer documentation: connectors, Helper API and events, incoming webhooks, sealed messages, page rules).
