All topics
  1. Getting started
    1. Create your account
    2. Get started with the guided welcome
    3. Invite your team
    4. Keep your number and forward it to your agent
    5. Set up your first agent
    6. A tour of HiloVoice
    7. Get help
  2. Concepts
    1. What HiloVoice does
    2. The five kinds of agent
    3. Phone numbers and caller ID
    4. Campaigns and recipients
    5. Calls, leads and contacts
    6. Roles and permissions
  3. Building an agent
    1. How the builder works
    2. Describe the business
    3. Name the agent and give it a purpose
    4. Set your opening hours
    5. Handle each kind of caller
    6. Choose what the agent asks
    7. Give the agent answers
    8. Shape how a call sounds
    9. Give a Receptionist its number
    10. Write an outbound agent's opening
    11. Set a follow-up's goal
    12. Set when an outbound agent may call
    13. Give an outbound agent a caller ID
    14. Turn callers into leads
    15. Book appointments on a call
    16. Hand calls to a person
    17. Turn away callers you can't help
    18. Let the agent check your records
    19. Send messages after a call
    20. Review and go live
    21. Start a new agent from one you have
    22. Pause, archive or delete an agent
    23. Call new leads within seconds
  4. Agent playbooks
    1. Set up a receptionist for a clinic
    2. Confirm tomorrow's appointments
    3. Check the details you hold
    4. Ask for feedback after a visit
    5. Follow up on open quotes
  5. Testing and going live
    1. Test an agent with Try it
    2. Put a Receptionist on the web
    3. Check an agent before real calls reach it
    4. Your responsibilities on calls
  6. Campaigns
    1. How a campaign runs
    2. Create a campaign
    3. Import a campaign's recipients
    4. Set a campaign's calling hours and retries
    5. Monitor a running campaign
    6. Work the Needs a person queue
    7. Call a recipient again
    8. Read a follow-up's progress
  7. Day-to-day operations
    1. The Usage page
    2. Review your calls
    3. Follow up your leads
    4. Keep your contacts up to date
    5. Set up transfer destinations
    6. Put callers straight through to a person
    7. Block a number
    8. Keep up with notifications
  8. Integrations
    1. What you can connect
    2. Connect your own Twilio account
    3. Connect your calendar
    4. Send email from your own address
    5. Connect HubSpot
    6. Connect Salesforce
    7. Connect Slack
    8. Connect Zapier
    9. Send leads to your own system
    10. Add a lookup source
  9. Administration
    1. Change your organization's settings
    2. Manage members and roles
    3. Manage your phone numbers
    4. Plans, minutes and limits
    5. Make and revoke API keys
    6. Check who did what in the activity log
    7. Manage your own account
    8. Join the HiloVoice affiliate program
  10. Reference
    1. Glossary
    2. Campaign statuses
    3. Recipient statuses
    4. Follow-up dispositions
    5. Call statuses and outcomes
    6. Agent builder fields
    7. CSV columns
    8. Error messages
    9. Frequently asked questions

Send leads to your own system

For OwnersChecked against the app on October 1, 2026

The Lead endpoint posts leads to a web address you own: your CRM's inbound webhook, a Make or Zapier hook, or a route on your own server. Every lead gets Push to endpoint, and each lead can also go on its own once its call is scored. With a signing secret, your system can check each delivery came from HiloVoice.

Before you start

  • You're an Owner, Admin or Builder.
  • Lead endpoints are on Growth and up. On a smaller plan, the row on Integrations shows Growth and up. The free trial includes it.
  • You have an HTTPS address that takes a POST with a JSON body and answers with a 2xx status. For a Zap, Connect Zapier instead: it sends every call as well.

Steps

  1. Open Settings → Integrations and click Lead endpoint.
  2. Paste your address under Endpoint URL.
  3. To have deliveries signed, type a secret your system also knows under Signing secret. It's optional.
  4. To send each lead once its call is scored (on agents with Lead scoring on), tick Each lead when it's scored under Also send.
  5. Click Connect Lead endpoint. HiloVoice sends a test delivery first (event lead.ping), and Connected means your endpoint answered it.

To change Also send later, click Lead endpoint: the box shows what's ticked now. Change it and click Save; the address and secret aren't asked for again.

The Lead endpoint's Connect tab: the endpoint URL, a signing secret, Each lead when it's scored ticked, and Connect Lead endpoint. 6. On Leads, open a lead, click Actions, then Push to endpoint.

A lead's Actions menu, with Push to endpoint and the address it posts to.

A message says Pushed to your endpoint (Sent to <host>.), or The endpoint didn't take it with what it answered. The lead's History records each push.

What a delivery looks like

POST <your URL>
Content-Type: application/json
X-HiloVoice-Event: lead.pushed       lead.scored for a scored lead, lead.ping for the test
X-HiloVoice-Delivery-Id: 6f1c2e0a-…  unique to the delivery; safe to deduplicate on
X-HiloVoice-Signature: t=…,v1=…      only with a signing secret

Before 2026-10-02 these were named X-Hilo-Event, X-Hilo-Delivery-Id and X-Hilo-Signature. An endpoint that checks those names needs the new ones.

The body, for a lead pushed by hand:

{
  "event": "lead.pushed",
  "deliveryId": "6f1c2e0a-9b3d-4c8e-8f21-0d5b7a1e9c44",
  "sentAt": "2026-10-01T15:04:05+00:00",
  "sentBy": "Maya Patel",
  "lead": {
    "id": "4bbc9fe3-34e5-4aea-9f4b-62a507a781bb",
    "organizationId": "e2bd54e4-47e2-4277-83ca-c4cc236f6245",
    "fullName": "Jordan Ellis",
    "phone": "+13125550142",
    "email": "[email protected]",
    "status": "Qualified",
    "qualification": "qualified",
    "outcome": "appointment_scheduled",
    "agentOutcome": "qualified",
    "outcomeCorrectedBy": "Maya Patel",
    "summary": "New patient asking for a cleaning, evenings preferred.",
    "fields": {
      "reason_for_visit": "routine_cleaning",
      "preferred_appointment_time": "evening"
    },
    "labels": {
      "reason_for_visit": "Reason for visit",
      "preferred_appointment_time": "Preferred appointment time"
    },
    "agentId": "9b7e6f11-2c6d-4d8a-a4e2-1a3f0c6b5d90",
    "firstCallId": "0c2a9c1e-7d4b-4f7e-b0c3-2e9a8d7f6b51",
    "lastCallId": "8cd80186-baf3-429e-ad06-62972d1f581b",
    "callCount": 2,
    "lastActivityAt": "2026-10-01T14:26:00+00:00",
    "createdAt": "2026-09-30T11:02:00+00:00",
    "score": 83,
    "scoreStatus": "scored",
    "scoreBand": { "key": "hot", "label": "Hot" },
    "scoreSignals": [
      { "name": "Wants an appointment this week", "points": 30 },
      { "name": "Only asking about prices", "points": -10 }
    ],
    "scoredAt": "2026-10-01T14:28:00+00:00"
  }
}
  • fields holds whatever the agent captured on the calls, keyed by question, and labels names each key. A question the lead has no answer for is left out.
  • outcome is the lead's outcome as HiloVoice shows it: a person's correction when there is one, else the agent's. agentOutcome is always the agent's.
  • status is Open, Qualified, Disqualified or Closed.
  • The score fields are the lead's Score tab: scoreStatus is scored, pending, insufficient, not_applicable or failed. A lead never scored has none of them.
  • The test delivery's body is only event (lead.ping) and sentAt.

What HiloVoice sends, on the Lead endpoint's How to tab, shows the same example, built by the code that builds a real delivery.

Check the signature

With a Signing secret, each delivery carries X-HiloVoice-Signature: t=<unix seconds>,v1=<hex>. To check it on your side:

  1. Read t and v1 from the header.
  2. Work out the HMAC-SHA256 of t, a full stop, then the body exactly as it arrived, keyed with your secret, as lowercase hex.
  3. Refuse the delivery if that differs from v1, or if t is more than a few minutes old.

In Node.js, for example:

const crypto = require("crypto");

// header: the X-HiloVoice-Signature value. rawBody: the body as it arrived, before any parsing.
function cameFromHiloVoice(header, rawBody, secret) {
  const parts = Object.fromEntries(header.split(",").map((part) => part.trim().split("=")));
  if (!parts.t || !parts.v1) return false;
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
  return expected.length === parts.v1.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

To send each call rather than each lead, give an agent a Call a webhook action: it posts a call.completed event, signed the same way with its own Signing secret, and its body is the one Zapier gets. See Send messages after a call.

What happens next

  • Push to endpoint sends once, when you click it.
  • A scored lead is one of its call's after-call actions. The call's After the call tab shows Sent the scored lead to your lead endpoint. It's tried again if your endpoint can't be reached or answers with a 5xx, keeping the same X-HiloVoice-Delivery-Id. It's never sent for a call from Try it, or for a call with too little to score.
  • If a scored lead can't be sent at all, owners, admins and builders get a notification.
  • HiloVoice sends lead.ping again every few hours. If your endpoint stops answering, the row says Needs attention.

If it does not work

You seeWhyWhat to do
Lead endpoints are on Growth and up. An owner can change the plan under Settings → Billing.Your plan doesn't include the Lead endpointAsk an owner to change the plan.
The endpoint must be a full http(s) URL.What's pasted isn't a whole web addressPaste the full address, starting https://.
The endpoint answered <code> to a test delivery.Your endpoint turned down the lead.pingMake it answer 2xx to any POST, the test included.
Could not reach the endpoint: …Nothing answered at that addressCheck the address, and that your server is up.
Push to endpoint says Set upNo endpoint is connected, or it needs attentionConnect it, or put it right, on Settings → Integrations.
The endpoint didn't take it, with <host> answered <code>.Your endpoint refused the leadCheck your endpoint's log for the delivery id, then push again.
Your signature check failsThe body was parsed and written out again before checking, or the secrets differCheck against the raw body, with the same secret on both sides.