Skip to content
Docs

Trigger URL

Every agent has its own trigger URL. POST a lead to it from Zapier, Make, GoHighLevel, Typeform or Facebook Lead Ads, and the agent calls that lead. No API key and no code needed.

POST https://api.avoonta.com/v1/hooks/lead/hk_<64 hex characters>

Switch it on first

A new trigger URL is off and accepts nothing. A workspace owner or admin switches it on by ticking this statement for the agent:

I confirm every lead sent to this URL has agreed to be called and texted by {Company Name}, including by an AI assistant.

We save who ticked it, when, and the exact words. Unticking switches the URL off again. While it is off, or while the agent is switched off, the URL answers 404 not_found.

Only send leads who really agreed to be called by your business, including by an AI assistant. The attestation above is your statement that they did. See Compliance.

What to send

Send JSON (Content-Type: application/json) or form fields (application/x-www-form-urlencoded). At most 64 KB. Multipart form uploads are not supported.

You do not need exact field names. We look for each value by name, ignoring case, spaces and punctuation, at the top level first and then inside nested objects. Facebook's [{ "name": …, "values": [ … ] }] list shape works too.

We fillFrom any of these names
phone requiredphone, phone_number, mobile, mobile_phone, mobile_number, cell, cell_phone, telephone, tel, contact_phone, lead_phone, phone1, primary_phone
first namefirst_name, fname, given_name, first. If none, the first word of: full_name, name, contact_name, lead_name
last namelast_name, lname, surname, family_name
emailemail, email_address, mail, contact_email
companycompany, company_name, business, business_name, organization, organisation
context for the agentcustom_context, notes, note, message, comments, comment, context, details
when the lead agreedconsented_at, consent_timestamp, opt_in_at, opt_in_timestamp, created_time, submitted_at, date_added, submission_time, timestamp, created_at

The phone follows the same rules as lead.phone in Orders: US numbers only. The consent time can be ISO 8601 or a Unix time in seconds or milliseconds. If there is none, or it is in the future or unreadable, we use the time we received the lead.

Example

curl -X POST "https://api.avoonta.com/v1/hooks/lead/hk_…" \
  -H "Content-Type: application/json" \
  -d '{
    "full_name": "Daniel Cohen",
    "phone_number": "(415) 555-0199",
    "email": "daniel@acme.example",
    "message": "Wants a quote for a 10kW system",
    "submitted_at": "2026-10-14T09:00:00Z"
  }'
HTTP/1.1 202 Accepted

{
  "success": true,
  "order_id": "ord_9b1e0c4d2a7f4e8b9c3d5a6f7e8d9c0b",
  "status": "QUEUED",
  "test": false
}

What happens to the lead

Duplicates and rate limit

Send a test lead

Add ?test=1 to the URL to send a test lead to your own phone:

POST https://api.avoonta.com/v1/hooks/lead/hk_…?test=1

Using it from your tools

Zapier

  1. Trigger: your lead source (Facebook Lead Ads, a form, a CRM).
  2. Action: Webhooks by Zapier → POST.
  3. URL: your trigger URL. Payload type: json (or form).
  4. Data: map at least phone, and ideally first_name, email and the lead's submission time as consented_at.

Make

  1. Add an HTTP → Make a request module after your trigger.
  2. Method POST, URL: your trigger URL, body type Raw, content type JSON (application/json).
  3. Body: a JSON object with phone, first_name, consented_at and anything else useful.

GoHighLevel, Typeform and other tools

Use the tool's "webhook" or "custom webhook" action with method POST and your trigger URL. Most send JSON; the field names are matched as shown above.

Your own website form

Do not put the trigger URL in the HTML of a public page. Anyone who reads the page source could then send leads that we would call at your cost. Post the form to your own server, or to Zapier or Make, and forward it from there.

Errors

StatusCodeMeaning
404not_foundUnknown URL, or the URL or its agent is switched off.
405method_not_allowedUse POST.
400invalid_bodyNot JSON or form fields, or bigger than 64 KB.
400invalid_requestNo phone number was found in the lead.
403test_number_not_verified?test=1 to a number you have not confirmed.
429rate_limitedMore than 60 leads in a minute. Wait 60 seconds.
503unavailableA short problem on our side. Retry.

The order checks can also return agent_not_published, invalid_phone, unsupported_destination, high_cost_destination, insufficient_balance, do_not_contact and the 503 codes. See Errors.