New You can now run your Gelee campaigns from Claude, ChatGPT or Cursor. Read the docs →

Switching from another tool

From HeyReach

HeyReach's API calls, webhooks, terms and message variables, each mapped to its Gelee equivalent.

Last updated 25 October 2026

Deciding whether to switch?

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

HeyReachGeleeNotes
CampaignCampaignBoth run a sequence from one or more senders.
Lead listThe campaign's leadsGelee has no separate list object: leads live in campaigns. Push or upload them straight into one.
LinkedIn sender accountSeatOne connected LinkedIn account.
Custom user fieldsCustom fieldsUsed as {{custom.key}} in messages.
TagsTagsPlus inbox flags: interested, lost, referral, follow-up.
Unibox / inboxInboxGelee's AI SDR can draft or send replies there.
Blacklist (leads and companies)BlacklistProfiles and companies, checked before every send.
WorkspaceWorkspaceOne 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.

HeyReachGeleeNotes
GET auth/CheckApiKeyGET /meAlso returns the workspace name and every seat.
POST campaign/GetAll, GET campaign/GetByIdGET /campaigns, GET /campaigns/{id}Includes seats, schedule, source, auto top-up and counts.
POST campaign/Create + UpdateSequencePOST /campaigns (sequence in the body)Lands as a draft.
POST campaign/StartCampaign, ResumePOST /campaigns/{id}/launch
POST campaign/PausePOST /campaigns/{id}/pause
POST campaign/UpdateSettings, UpdateSchedule, UpdateAccountsPATCH /campaigns/{id}name, schedule, seat_ids, filters, search, auto_top_up.
POST campaign/CreateCampaignFromTemplatePOST /campaigns/{id}/duplicate
POST campaign/AddLeadsToCampaignV2POST /campaigns/{id}/leadscustomUserFields becomes custom_fields; up to 100 a call; safe to retry.
PATCH campaign/UpdateLeadCustomFieldsPATCH /prospects/{id} { custom_fields }null deletes a field, like HeyReach.
POST campaign/StopLeadInCampaignPOST /prospects/{id}/pause or /removeOr POST /inbox/stop with LinkedIn URLs to stop someone everywhere.
POST campaign/GetLeadsFromCampaignGET /prospects?campaign_id=…Every lead, with sender, timeline, booking and score.
POST campaign/GetCampaignsForLeadGET /prospects?linkedin_url=…Every campaign row for that person.
POST lead/GetLeadGET /prospects?linkedin_url=…, GET /people/{id}
POST lead/AddTags, ReplaceTags, GetTagsPATCH /prospects/{id} { tags }{ add, remove } or a full list.
POST inbox/GetConversationsV2, V3GET /inboxEvery seat, with the whole story of each person.
GET inbox/GetChatroomGET /inbox/{chat_id}/messagesFrom stored history, paged with a cursor.
POST inbox/SendMessagePOST /inbox/{chat_id}/messagesNeeds a key with the send permission. Takes an Idempotency-Key.
(no equivalent found in HeyReach's docs)POST /conversationsStart a new conversation or InMail to someone you have no thread with.
POST inbox/SetSeenStatusPOST /inbox/{chat_id}/read
POST li_account/GetAll, GetById, GetAccountStatusGET /seatsStatus, limits, today's sends, warm-up.
POST li_account/Connect, ConnectWithCookiesPOST /tools/seat_connect_cookie (then /tools/seat_connect_code if LinkedIn asks for a code), or POST /tools/seat_connect for a login linkPOST /seats/{id}/reconnect-link sends a reconnect link for a seat that dropped.
POST stats/GetOverallStats, GetOverallStatsByCampaignGET /analytics, /analytics/daily, /campaigns/{id}/performance
POST blacklist/AddLeads, AddCompaniesPOST /blacklistUp to 500 entries a call.
POST blacklist/RemoveLeads, RemoveCompaniesDELETE /blacklist/{id}
webhooks/CreateWebhook, GetAllWebhooks, UpdateWebhook, DeleteWebhookPOST, GET, PATCH, DELETE /webhooksAlways signed when made through the API.
list/* (lead and company lists)Not availablePush leads straight into a campaign instead.
enrichment/enrich-emailNot available
management/organizations/* (workspaces, users, keys)POST /team for teammatesNo workspace or key creation over the API.

Webhooks

Gelee signs every delivery and retries failures. Setup and signature checks are in Webhooks.

HeyReachGelee webhookNotes
CONNECTION_REQUEST_SENTinvite_sentPick it by name; it is not part of "all".
CONNECTION_REQUEST_ACCEPTEDconnection_accepted
MESSAGE_SENT, INMAIL_SENTmessage_sentmessage.message_type says INMAIL for InMails. Pick by name.
MESSAGE_REPLY_RECEIVED, INMAIL_REPLY_RECEIVED (first reply)reply_receivedFires on every reply; timeline.first_reply_at tells you if it is the first.
EVERY_MESSAGE_REPLY_RECEIVEDreply_receivedAlso reply_positive and reply_negative, sorted by sentiment.
CAMPAIGN_COMPLETEDcampaign_completed
LEAD_TAG_UPDATEDlead_updatedAlso fires for custom fields, flags, notes, pause and resume.
FOLLOW_SENT, LIKED_POST, VIEWED_PROFILENo webhook
(none)call_booked, needs_human, lead_accepted, lead_rejectedBookings, replies the AI handed to a person, and verdicts on pushed leads.

Message variables

HeyReachGelee
{FIRST_NAME}{{firstName}}
Company{{company}}
Position{{role}}
A custom user field{{custom.field_name}}

Every Gelee variable:

ValueGelee 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

Push the blocklist
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"}
      ]}'
Push leads with your own fields
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 → Gelee
# 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"}'

HeyReach's docs