Wire Benji into your stack — incoming leads, outbound events, and everything in between. Print or save as PDF for offline.
Every Benji webhook + API call authenticates with a Bearer token you generate in Settings → Integrations → API & Webhooks. Keys start with benji_ and are scoped per-user.
Pass the key in the Authorization header:
Authorization: Bearer benji_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json
code: "revoked".One endpoint creates a new lead in Benji and (optionally) a loan attached to that lead, with the LO who owns the API key as the recipient. Triggers AI SMS nurturing + cadences automatically.
POST https://benji.biz/api/webhooks/leads Authorization: Bearer benji_xxxxxxxx Content-Type: application/json
{
"firstName": "Sarah",
"lastName": "Whitman",
"email": "sarah@example.com",
"phone": "+1 612 555 0100",
"source": "Facebook Lead Ads"
}{
"firstName": "Sarah",
"lastName": "Whitman",
"email": "sarah@example.com",
"phone": "+1 612 555 0100",
"source": "Facebook Lead Ads — Spring Refi",
// Free-text — lands in the lead's Notes section.
// Aliases: "message" and "comments" are also accepted.
"notes": "Looking at a $485k purchase in Maple Grove",
// Optional structured fields. All optional.
"state": "MN",
"program": "Refinance",
"loanType": "CONVENTIONAL",
"loanAmountRange": "300K_TO_500K",
"creditScoreRange": "SCORE_740_759",
// Free-form JSON. Stamp anything you want — read back from the
// Client's metadata. Useful for dedup keys (Meta fb_lead_id),
// form IDs, campaign tracking.
"metadata": {
"fb_lead_id": "1234567890",
"fb_form_id": "987654321",
"fb_campaign_id": "abc123"
},
// Optional: create a loan in the same request.
"loan": {
"loanType": "CONVENTIONAL",
"loanPurpose": "PURCHASE",
"loanAmount": 485000,
"propertyType": "SINGLE_FAMILY",
"purchasePrice": 525000,
"downPayment": 40000,
"interestRate": 6.625
}
}HTTP 201
{
"success": true,
"clientId": "cl_abc123…",
"message": "Lead \"Sarah Whitman\" created successfully",
"pipelineStage": "LEAD",
"leadDisposition": "NEW",
"noteId": "n_def456…",
"loanId": "ln_ghi789…"
}INBOUND_WEBHOOK events (filterable by source tag).CLIENT_CREATEDgets fired with the new client's payload. See §4.End-to-end setup paths for the most common lead sources. Each is ~5 minutes once you have an API key.
Pipe every Facebook lead form submission directly into Benji. AI SMS texts within seconds of submit.
https://benji.biz/api/webhooks/leads. Payload type: JSON. Paste the template from §2 above, replacing each value with the Meta field picker.Authorization: Bearer benji_xxxx, Content-Type: application/json.firstName and lastName before the POST step.If you control the form's backend, post directly — no middleware needed. curl example:
curl -X POST https://benji.biz/api/webhooks/leads \
-H "Authorization: Bearer benji_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Sarah",
"lastName": "Whitman",
"email": "sarah@example.com",
"phone": "+1 612 555 0100",
"source": "Marketing site — Hero CTA"
}'Native Zapier-driven sync. Every Arive loan auto-creates or upserts a Benji client + loan, idempotent by sysGUID. Full setup walkthrough lives at benji.biz/integrations (and the in-app Settings → Arive card after you sign up).
OAuth integration — connect once in Settings → Integrations, and every Calendly booking appears on the Benji calendar with the right client attached.
Any tool that can POST JSON with a Bearer header works. The payload shape from §2 is the contract. Make and n8n have identical setup steps to Zapier — Webhook node, POST, JSON body, two headers. No special connectors needed.
Subscribe to Benji events from your backend. Useful for syncing into a data warehouse, firing third-party automations, or keeping a backup CRM in sync.
Settings → Integrations → Outgoing webhooks → Add endpoint. Pick a URL, choose which events to subscribe to, optionally provide a signing secret.
| Event | Fires when |
|---|---|
CLIENT_CREATED | Any new client/lead — in-app + API + Arive sync |
CLIENT_UPDATED | Disposition / stage / contact field change |
CLIENT_DELETED | LO permanently removes a client |
LOAN_CREATED | New loan attached to a client |
LOAN_STAGE_CHANGED | Loan moves to a new pipeline stage |
LOAN_FUNDED | Loan reaches FUNDED status |
APPOINTMENT_BOOKED | Calendar event added (Calendly or in-app) |
NOTE_ADDED | LO or AI adds a note to a client |
SMS_RECEIVED | Borrower replies to a Benji-sent SMS |
When you set a signing secret, every delivery includes anX-Benji-Signature header — an HMAC-SHA256 of the raw body using your secret. Verify before trusting the payload.
// Node.js example
import crypto from "crypto";
function verifyBenjiSignature(body, header, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(header)
);
}Failed deliveries retry with exponential backoff for up to 24 hours. Persistent failures mark the endpoint inactive — you'll see this in Settings → Outgoing webhooks with a button to reactivate.
The fields you can write to via the incoming webhook + the enum values they accept. Anything not listed is rejected with a 422.
firstName · lastNameemail · phone · sourcestate | string (2-letter US state code) |
program | Free text — e.g. "Refinance", "Purchase" |
loanType | CONVENTIONAL | FHA | VA | USDA | JUMBO | NON_QM | HELOC |
loanAmountRange | UNDER_100K | RANGE_100K_TO_300K | RANGE_300K_TO_500K | RANGE_500K_TO_750K | RANGE_750K_TO_1M | OVER_1M |
creditScoreRange | SCORE_BELOW_600 | SCORE_600_619 | SCORE_620_639 | … | SCORE_800_PLUS |
notes / message / comments | Free text — lands in client.Notes |
metadata | Arbitrary JSON object — for dedup IDs, source tracking |
loanType | (required if loan block present) — same enum as above |
loanPurpose | PURCHASE | REFINANCE | CASH_OUT_REFI | HELOC | CES |
loanAmount | number |
propertyType | SINGLE_FAMILY | MULTI_FAMILY | CONDO | TOWNHOUSE | MANUFACTURED | LAND |
occupancyType | PRIMARY | SECOND_HOME | INVESTMENT |
purchasePrice / downPayment | number |
interestRate | decimal (6.75) or percent-form (0.0675) — both accepted |
loanTermMonths | number — 120, 180, 240, 360, 480 |
closingDate | ISO 8601 date |
"+1 612 555 0100", "612-555-0100", "(612) 555-0100"). Benji normalizes to E.164 internally. If your form lets users type freely, we'll handle the cleanup.SCREAMING_SNAKE_CASE. Lowercase or mixed case returns a 422.Retry-After header in seconds. Your client should respect it — bursting through the rate limit gets the key throttled longer.metadata.fb_lead_id on your side before posting.clientId.