Switching from another tool
From HeyReach
HeyReach's API calls, webhooks, terms and message variables, each mapped to its Gelee equivalent.
The plain-English guide covers what you gain, what you give up and when to stay on HeyReach: Switching from HeyReach to Gelee.
What HeyReach offers
HeyReach has a public REST API at api.heyreach.io/api/public, authenticated with an X-API-KEY header and limited to 300 requests a minute. It covers campaigns (create, sequence, schedule, senders, start, pause, resume), adding leads with custom fields, lists, the inbox (list conversations, read one, send a message into an existing conversation, mark seen), LinkedIn accounts (including connecting with credentials or cookies), tags, stats, the blacklist, email enrichment, webhooks and organization-level workspace management.
Its webhooks cover connection requests sent and accepted, messages and InMails sent, first replies and every reply, follows, liked posts, profile views, campaign completion and tag changes, and can be limited to specific campaigns.
Their words, our words
| HeyReach | Gelee | Notes |
|---|---|---|
| Campaign | Campaign | Both run a sequence from one or more senders. |
| Lead list | The campaign's leads | Gelee has no separate list object: leads live in campaigns. Push or upload them straight into one. |
| LinkedIn sender account | Seat | One connected LinkedIn account. |
| Custom user fields | Custom fields | Used as {{custom.key}} in messages. |
| Tags | Tags | Plus inbox flags: interested, lost, referral, follow-up. |
| Unibox / inbox | Inbox | Gelee's AI SDR can draft or send replies there. |
| Blacklist (leads and companies) | Blacklist | Profiles and companies, checked before every send. |
| Workspace | Workspace | One Gelee API key belongs to one workspace. |
API calls
Every HeyReach call we found in its docs, and the Gelee call that does the same job. Gelee's base URL, keys and limits are in Keys and limits.
| HeyReach | Gelee | Notes |
|---|---|---|
GET auth/CheckApiKey | GET /me | Also returns the workspace name and every seat. |
POST campaign/GetAll, GET campaign/GetById | GET /campaigns, GET /campaigns/{id} | Includes seats, schedule, source, auto top-up and counts. |
POST campaign/Create + UpdateSequence | POST /campaigns (sequence in the body) | Lands as a draft. |
POST campaign/StartCampaign, Resume | POST /campaigns/{id}/launch | |
POST campaign/Pause | POST /campaigns/{id}/pause | |
POST campaign/UpdateSettings, UpdateSchedule, UpdateAccounts | PATCH /campaigns/{id} | name, schedule, seat_ids, filters, search, auto_top_up. |
POST campaign/CreateCampaignFromTemplate | POST /campaigns/{id}/duplicate | |
POST campaign/AddLeadsToCampaignV2 | POST /campaigns/{id}/leads | customUserFields becomes custom_fields; up to 100 a call; safe to retry. |
PATCH campaign/UpdateLeadCustomFields | PATCH /prospects/{id} { custom_fields } | null deletes a field, like HeyReach. |
POST campaign/StopLeadInCampaign | POST /prospects/{id}/pause or /remove | Or POST /inbox/stop with LinkedIn URLs to stop someone everywhere. |
POST campaign/GetLeadsFromCampaign | GET /prospects?campaign_id=… | Every lead, with sender, timeline, booking and score. |
POST campaign/GetCampaignsForLead | GET /prospects?linkedin_url=… | Every campaign row for that person. |
POST lead/GetLead | GET /prospects?linkedin_url=…, GET /people/{id} | |
POST lead/AddTags, ReplaceTags, GetTags | PATCH /prospects/{id} { tags } | { add, remove } or a full list. |
POST inbox/GetConversationsV2, V3 | GET /inbox | Every seat, with the whole story of each person. |
GET inbox/GetChatroom | GET /inbox/{chat_id}/messages | From stored history, paged with a cursor. |
POST inbox/SendMessage | POST /inbox/{chat_id}/messages | Needs a key with the send permission. Takes an Idempotency-Key. |
(no equivalent found in HeyReach's docs) | POST /conversations | Start a new conversation or InMail to someone you have no thread with. |
POST inbox/SetSeenStatus | POST /inbox/{chat_id}/read | |
POST li_account/GetAll, GetById, GetAccountStatus | GET /seats | Status, limits, today's sends, warm-up. |
POST li_account/Connect, ConnectWithCookies | POST /tools/seat_connect_cookie (then /tools/seat_connect_code if LinkedIn asks for a code), or POST /tools/seat_connect for a login link | POST /seats/{id}/reconnect-link sends a reconnect link for a seat that dropped. |
POST stats/GetOverallStats, GetOverallStatsByCampaign | GET /analytics, /analytics/daily, /campaigns/{id}/performance | |
POST blacklist/AddLeads, AddCompanies | POST /blacklist | Up to 500 entries a call. |
POST blacklist/RemoveLeads, RemoveCompanies | DELETE /blacklist/{id} | |
webhooks/CreateWebhook, GetAllWebhooks, UpdateWebhook, DeleteWebhook | POST, GET, PATCH, DELETE /webhooks | Always signed when made through the API. |
list/* (lead and company lists) | Not available | Push leads straight into a campaign instead. |
enrichment/enrich-email | Not available | |
management/organizations/* (workspaces, users, keys) | POST /team for teammates | No workspace or key creation over the API. |
Webhooks
Gelee signs every delivery and retries failures. Setup and signature checks are in Webhooks.
| HeyReach | Gelee webhook | Notes |
|---|---|---|
| CONNECTION_REQUEST_SENT | invite_sent | Pick it by name; it is not part of "all". |
| CONNECTION_REQUEST_ACCEPTED | connection_accepted | |
| MESSAGE_SENT, INMAIL_SENT | message_sent | message.message_type says INMAIL for InMails. Pick by name. |
| MESSAGE_REPLY_RECEIVED, INMAIL_REPLY_RECEIVED (first reply) | reply_received | Fires on every reply; timeline.first_reply_at tells you if it is the first. |
| EVERY_MESSAGE_REPLY_RECEIVED | reply_received | Also reply_positive and reply_negative, sorted by sentiment. |
| CAMPAIGN_COMPLETED | campaign_completed | |
| LEAD_TAG_UPDATED | lead_updated | Also fires for custom fields, flags, notes, pause and resume. |
| FOLLOW_SENT, LIKED_POST, VIEWED_PROFILE | No webhook | |
| (none) | call_booked, needs_human, lead_accepted, lead_rejected | Bookings, replies the AI handed to a person, and verdicts on pushed leads. |
Message variables
| HeyReach | Gelee |
|---|---|
{FIRST_NAME} | {{firstName}} |
Company | {{company}} |
Position | {{role}} |
A custom user field | {{custom.field_name}} |
Every Gelee variable:
| Value | Gelee variable |
|---|---|
| First name | {{firstName}} |
| Full name | {{fullName}} |
| Company | {{company}} |
| Job title | {{role}} |
| Industry | {{industry}} |
| Your own per-lead field | {{custom.your_field}} |
| A fallback when empty | {{custom.your_field|default text}} |
| Sender's name | {{senderName}} |
Code from the guide
curl -X POST "https://www.gelee.ai/api/v1/blacklist" \
-H "Authorization: Bearer gk_your_key" \
-H "Content-Type: application/json" \
-d '{"entries":[
{"value":"https://www.linkedin.com/in/janedoe","type":"account"},
{"value":"Acme Corp","type":"company"}
]}'curl -X POST "https://www.gelee.ai/api/v1/campaigns/CAMPAIGN_ID/leads" \
-H "Authorization: Bearer gk_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: import-batch-1" \
-d '{"leads":[{"linkedin_url":"https://www.linkedin.com/in/janedoe",
"first_name":"Jane","company":"Acme","title":"VP Sales",
"custom_fields":{"report_link":"https://acme.example/r/5d70"},
"tags":["imported"]}]}'# HeyReach
curl -X POST "https://api.heyreach.io/api/public/inbox/SendMessage" \
-H "X-API-KEY: $HEYREACH_KEY" -H "Content-Type: application/json" \
-d '{"conversationId":"2-ODM0…","linkedInAccountId":123,"message":"Hi Jane"}'
# Gelee
curl -X POST "https://www.gelee.ai/api/v1/inbox/chat_88/messages" \
-H "Authorization: Bearer $GELEE_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: msg-5d70-1" \
-d '{"text":"Hi Jane"}'