Creates a lead in the Provident CRM and attaches it to a contact.
Only hard requirement: at least one entry in leadPhones or leadEmails.
Contact resolution — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (+971501234567) for reliable matching.
Lookup fields (leadType, funnel, source, subSource, eventType, marketingType, campaignName, advertisingCampaign, website, currency, localeCountry, location/locationId, areaOfInterest, propertyTypeInterest, marketSegment, agentCategory, buyerType, languages, assignedBy, distributionType, listingId/referenceNo) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in intakeUnresolved.
Which pipeline the lead lands in is funnel. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send Leasing, Show Room, PvH, … for an enquiry that belongs to another business line.
Extra fields not defined in this schema are accepted and stored verbatim with the lead rather than rejected.
Not idempotent: the same payload posted twice creates two leads.
Quiz answers — landing pages that ask a question set can send a quiz object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable questionKey per question and optionKey per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (2 million, 2,000,000, AED 2M, ٢ مليون → 2000000); ambiguous dates like 03/04/2026 are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.
The access_token returned by POST /oauth2/token, sent as Authorization: Bearer <access_token>. It is an opaque string, not a JWT.
Body
application/json
Lead intake payload. At least one entry in leadPhones or leadEmails is required; every other field is optional. Unknown fields are accepted and stored verbatim with the lead.
leadPhones
string[]
Phone numbers. Used FIRST to match an existing contact. Use E.164 format for reliable matching. Required unless leadEmails is supplied.
Maximum string length: 64
Example:
["+971501234567"]
leadEmails
string[]
Email addresses. Used to match an existing contact when no phone matches. Required unless leadPhones is supplied.
Maximum string length: 255
Example:
["john.doe@example.com"]
leadFirstName
string | null
Maximum string length: 255
Example:
"John"
leadMiddleName
string | null
Maximum string length: 255
Example:
"Ahmad"
leadSecondName
string | null
Second given name — used when no middle name is supplied.
Maximum string length: 255
Example:
"A."
leadLastName
string | null
Maximum string length: 255
Example:
"Doe"
leadCompanyName
string | null
Company name for corporate enquiries.
Maximum string length: 255
Example:
"Acme Real Estate"
leadType
string
LOOKUP. Lead type display name, e.g. Primary Buyer, Secondary Buyer, Primary Buyer and Secondary Buyer, Tenant, Landlord, Broker, Seller, Owner, Mortgages. Ask Provident for the full list. The shorthand Primary / Secondary / Primary and Secondary is accepted as an alias for the corresponding … Buyer type, in either direction. Omit this on a listing enquiry and it is derived from the listing — see listingId.
Maximum string length: 255
Example:
"Primary Buyer"
funnel
string
LOOKUP. Which CRM funnel (pipeline) the enquiry belongs to. OMIT IT for the main sales pipeline — that is the default and what almost every lead wants. Send a value only for an enquiry that belongs to a different business line: Leasing, Show Room, PvH, Mortgages, Property Management, Landlord/Sellers Listings, Provident the Agency, Events, Recruitment, Precision Inspections, 811 services, Prism. The display name or the stable key both work (Show Room and show_room are the same funnel), matched case-insensitively and ignoring spaces, hyphens and underscores. Deliberately NOT derived from leadType: a Tenant enquiry can belong to Leasing or PvH and a Primary Buyer to sales, Show Room or the Agency — only the sender knows which. An unrecognised funnel does not fail the request: the lead is created on the main sales pipeline and the value is returned in intakeUnresolved.funnel.
Maximum string length: 255
Example:
"Leasing"
priority
string | null
Free text priority indicator.
Maximum string length: 64
Example:
"High"
marketSegment
enum<string>
LOOKUP. Marketing's segmentation of the lead.
Available options:
Standard,
Luxury,
Super Luxury
Maximum string length: 255
Example:
"Luxury"
agentCategory
enum<string>
LOOKUP. Marketing's grading of the lead.
Available options:
A,
B,
C,
D
Maximum string length: 255
Example:
"A"
buyerType
string | null
LOOKUP. Who the enquirer says they are — a form's "I am an Agent / Investor" choice, for example. Matched against Provident's buyer types (Investor, End User, First Time Buyer, Broker, Flipper, …); Agent is accepted and recorded as Broker. Send the choice as the visitor saw it — an unrecognised value comes back in intakeUnresolved and is mapped on our side. Beats a quiz answer that sets the same field.
Maximum string length: 255
Example:
"Investor"
areaOfInterest
string | null
LOOKUP. Area the customer says they are interested in, matched on location name. Kept for existing integrations — new ones should send location / locationId, which fill the lead's location that assignment routes on.
Example:
"Dubai Marina"
location
string | null
LOOKUP. Where the property is — the lead's location, which is what lead assignment routes on. Matched case-insensitively on the location name from GET /public/locations/search. Used only when locationId is omitted or matches no location, so sending both means a stale id still lands the lead on the right location by name. Anything you send here wins over a location taken from listingId or shortLinkId. Location names are NOT unique: prefer locationId, because a name that matches more than one location is unmatched. An unmatched name comes back in intakeUnresolved.location.
Not the same field as areaOfInterest, which is the area the customer says they want and is kept for existing integrations.
Maximum string length: 255
Example:
"Dubai Marina"
locationId
string | null
LOOKUP. Location id — id from GET /public/locations/search or GET /public/projects/filters. Tried before location; a value that is not a uuid is matched as a name instead of being discarded. A value that matches no location (an unknown or retired id) never fails the request: it comes back in intakeUnresolved.locationId, and location, if you sent it, is then tried by name. That report stands even when the name matched, so a stale id you keep sending stays visible.
Maximum string length: 255
Example:
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
propertyTypeInterest
string | null
LOOKUP. Property type the lead is interested in. Matched case-insensitively after trimming, and a regular English plural also matches the singular catalogue entry (Apartments → Apartment, Townhouses → Townhouse), so a form offering plural choices needs no mapping on your side.
Maximum string length: 255
Example:
"Apartment"
budgetMin
string | null
Minimum budget. Numeric string; a JSON number is also accepted.
Example:
"1000000"
budgetMax
string | null
Maximum budget. Numeric string; a JSON number is also accepted.
Example:
"2500000"
currency
string
LOOKUP. ISO 4217 currency code for the budget values.
Maximum string length: 3
Example:
"AED"
initialInquiry
string | null
Free-text message or callback reason from the form.
Example:
"Looking for a 2BR with sea view, ready to move in Q4."
languages
string[]
LOOKUP. Languages the lead speaks, by code or name. Unrecognised entries are ignored.
Maximum string length: 255
Example:
["ar", "English"]
listingId
string<uuid>
LOOKUP. Provident listing UUID. Takes precedence over referenceNo when both are sent.
A resolved listing also fills in what the form did not ask. Each field below is taken from the listing ONLY where this payload leaves it empty — anything you send always wins, and a quiz answer mapped to the same field beats the listing too:
leadType — from the listing category and offering type: Primary -> Primary Buyer, Secondary -> Secondary Buyer, and any rental listing -> Tenant whatever its category.
developer, location, property type, bedrooms, currency — copied from the listing. The location fills the lead's own location and does not overwrite areaOfInterest.
budgetMin — the listing price, unless the price is on application or it would exceed a budgetMax you sent. budgetMax is never derived.
Sending a value we then fail to match (an unknown developer name, say) is still reported in intakeUnresolved even though the listing goes on to fill that field.
The listing's own agent, where it has one, becomes the lead owner and wins over assignedBy.
referenceNo
string
LOOKUP. Listing reference number, used when listingId is not supplied. A reference number matching MORE THAN ONE listing counts as unresolved, and nothing is inherited. See listingId for what a resolved listing fills in.
Maximum string length: 128
Example:
"PR-123456"
source
string
LOOKUP. Lead source. Send this — an unrecognised or omitted source leaves the lead with no source attribution.
Maximum string length: 255
Example:
"Website"
subSource
string[]
LOOKUP. Sub-sources. Only those linked to the resolved source are kept; ignored entirely when source did not resolve.
Maximum string length: 255
Example:
["Callback Form", "Team Page"]
marketingType
string
LOOKUP. Marketing type, e.g. Organic or Paid.
Maximum string length: 255
Example:
"Organic"
eventType
string
LOOKUP. What the user did — e.g. Submit Form, Call, Whatsapp Click, DM, Webpush, Gamification.
Maximum string length: 255
Example:
"Submit Form"
campaignName
string
LOOKUP. CRM campaign name.
Maximum string length: 255
Example:
"Spring 2026 Landing Page"
advertisingCampaign
string
CREATED ON FIRST SIGHT. Advertising campaign name — the one field here that is not a strict lookup: a name Provident has never seen creates the campaign instead of being discarded. Omit it when you send metaFacebook; the Meta campaign fills it.
Maximum string length: 255
Example:
"Google Ads — Q3"
developerName
string
LOOKUP. Developer the enquiry is about, matched on name or slug — Sobha Realty or sobha-realty. Values come from GET /public/developers.
Maximum string length: 255
Example:
"Sobha Realty"
developerId
string
Developer uuid from GET /public/developers. Takes precedence over developerName; a non-uuid value here is treated as a name instead of being discarded.
Example:
"8ecf4fcd-ec63-5764-8524-7cd917494dbe"
website
string
LOOKUP. Website NAME or DOMAIN the lead came from — either resolves, matched case-insensitively. Prefer the domain (provident.ae, providentestate.com); it survives a display-name change. Ask Provident to add your domain before you start sending it.
Maximum string length: 255
Example:
"provident.ae"
pageUrl
string | null
Full URL of the page the submission originated from.
Name of the web form the visitor submitted. Falls back to metaFacebook.formName (truncated to 255) when omitted.
Maximum string length: 255
Example:
"contact-popup-form"
adsetName
string | null
Ad set / ad group name on your side. Free text — distinct from the campaignName lookup. Falls back to metaFacebook.adgroupName (truncated to 255) when omitted.
Submitter IP. IPv4, IPv6 and proxy chains all fit.
Maximum string length: 64
Example:
"217.165.113.16"
userAgent
string | null
Browser user-agent string captured at submission.
Example:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
submittedAt
string<date-time> | null
When the visitor submitted the form on your side. Distinct from the CRM's own createdAt, which is when we received it. An unparseable value is ignored rather than failing the request.
Example:
"2026-07-27T13:45:31.728Z"
localeCountry
string
LOOKUP. Country code (e.g. AE) or full country name. When omitted, the API attempts to infer it from a trailing two-letter segment of pageUrl.
Maximum string length: 255
Example:
"AE"
assignedBy
string
LOOKUP. Assign the lead to a specific Provident agent by email address. Omit to let Provident's automatic assignment engine route the lead. When the lead also resolves a listing that has an agent of its own, the listing's agent wins.
Maximum string length: 255
Example:
"agent@providentestate.com"
distributionType
enum<string>
How you would like this lead routed. This is a HINT, not an instruction: the value is stored on the lead and only affects who receives it if Provident has configured a routing rule that claims it. A value no rule claims changes nothing, so sending one is always safe.
Where a rule does claim the value it OUTRANKS the normal rule order: a lead sent as Location distribution that also carries a campaign is routed by the location rule, not by the campaign rule that would otherwise have matched first. Which types are claimed is configuration on our side and changes — ask before relying on it.
Matched case-insensitively after trimming, on both sides of the comparison, so capitalisation never decides routing; the leading word on its own also works (campaign, personal, developer, language, location, default, roadshow).
An unrecognised value is stored exactly as sent rather than rejected — a lead is never lost over this field, it simply matches no rule.
Personal distribution carries one extra meaning: it marks the lead as having a named owner, and such a lead is never re-assigned automatically and runs no follow-up clock at all. It only takes effect together with a resolved assignedBy — the two fields are one instruction. If assignedBy is missing or names nobody we can match, the lead is still created and routed normally but the marker is dropped, and both values come back in intakeUnresolved.
Omit it and a Meta lead form can carry it instead. A Distribution or Distribution Type entry in metaFacebook.customFields is read as a fallback and normalised the same way, because the value is usually set by whoever built the ad form rather than by whoever posts the lead. A top-level distributionType always wins.
Available options:
Personal distribution,
Campaign distribution,
Developer distribution,
Language distribution,
Location distribution,
Default distribution,
Developer and Area distribution,
Area distribution Secondary,
Roadshow distribution
Maximum string length: 64
Example:
"Campaign distribution"
metaFacebook
object
Meta / Facebook / Instagram (or TikTok) lead-ads metadata. Send only for leads originating from an ad-platform lead form. The standard fields above still drive routing.
Stored alongside the lead AND copied onto it: metaCampaignId + metaCampaignName become the lead's advertising campaign (matched on the Meta campaign id, and created if Provident has never seen it, so campaign names need no prior agreement); finalPageName, adName/adId, adgroupName/adgroupId and formName/formId become filterable columns on the lead. Matching on the id is what makes a rename safe — rename a campaign in Ads Manager and its leads stay on one campaign in the CRM. campaignName is a different, strictly-matched field: the CRM's own campaign, which drives routing.
The whole object is discarded when metaLeadId is absent. metaLeadId is unique across the CRM: it prevents the metadata being attached twice, but it does NOT prevent a duplicate lead — de-duplicate on your side.
Show child attributes
quiz
object
A dynamic quiz / survey submitted with the lead — for landing pages that ask a set of questions. Unlike every other field in this API, the questions do NOT have to be agreed with Provident in advance: questions and options register themselves the first time they arrive, so a new quiz starts capturing answers with no API change on either side. Answers are searchable in the CRM, shown on the lead, and — for questions Provident maps to a CRM field — used to fill that field on the lead itself.
Show child attributes
integrationRef
string | null
Your handle for the specific automation behind this lead — a Make scenario name, a webhook id, a form build. Free text: stored verbatim, never matched against anything, and never reported in intakeUnresolved.
It identifies an INTEGRATION, not a submission, so keep it stable across every lead that automation sends; a per-lead unique id makes it useless for grouping. Values are only distinguished within one sender, so two partners can both use scenario-1.
Do NOT put your own name here. The submitting OAuth client is recorded automatically from the access token — there is no field for it, because attribution a sender can write is not attribution.
Maximum string length: 128
Example:
"make:meta-leadgen-eu"
comments
object[]
Comments to write onto the lead's thread, OLDEST FIRST — the first entry in the array is the eldest and appears at the bottom of the CRM timeline. Entries sent without a date, and entries sharing the same timestamp, keep the order you sent them in. Maximum 5 per request: anything past the fifth is SKIPPED and reported back as comments.skipped rather than failing the request, because failing it would throw away a real customer enquiry over a comment. Send a longer conversation as consecutive PUTs, five at a time, oldest batch first. On an update these are ADDED to what the lead already has.
Maximum array length: 5
Show child attributes
jobPosition
string | null
Recruitment funnel: the job position the applicant applied for, as your form wrote it. Free text — stored as sent, never matched against a list, never reported in intakeUnresolved. Send it with "funnel": "Recruitment". Longer values are cut at 255 characters.
Maximum string length: 255
Example:
"Property Consultant"
resumeUrl
string | null
Recruitment funnel: a link to the applicant's CV FILE. We download it shortly after responding and keep our own private copy on the lead; your link need only stay reachable for a few minutes.
Must be a public http(s) URL on the default port, without credentials, returning the file itself: PDF, Word (.doc/.docx), RTF, OpenDocument text, PNG or JPEG, at most 10 MB. The type is read from the file's bytes, not your headers. A link that returns a web page fails; Google Drive /file/d/<id>/view and Dropbox ?dl=0 links are converted to direct downloads for you. Up to 5 redirects are followed.
A bad link never fails the request — see resume in the response. A new link replaces the lead's CV.
Accepted. EITHER a new lead (CreatedLead) OR an enquiry merged into an existing one (MergedLead) — branch on merged before reading any other field. A CreatedLead body carries many further fields that are not part of this contract.
Option 1
Option 2
A newly created lead (merged is false). The response actually carries the whole lead record; only the properties listed here are contractual and safe to depend on.
id
string<uuid>
UUID of the created lead. Store this against your own submission record.
contactId
string<uuid>
UUID of the contact the lead was attached to (matched or newly created).
intakeUnresolved
object | null
Map of field name → the original value you sent, for every lookup value that could not be matched. null when everything resolved. Quiz answers that could not be read appear namespaced as quiz.<quizKey>.<questionKey> — unlike a failed lookup, the answer IS still stored on the lead, and a Provident admin can map the value once so every future submission of it resolves automatically.
Show child attributes
Example:
{ "source": "Web-Site", "quiz.off-plan-investor-2026.free_budget": "somewhere around a lot" }
needsIntakeReview
boolean
true when intakeUnresolved is non-empty.
merged
enum<boolean>
Always false here. true means the enquiry was folded into an existing lead — see MergedLead.
Available options:
false
isRepeatLead
boolean
True when this person already had a lead older than the merge window, or a recent lead in a different funnel. The lead is routed and worked normally; this is a marker, not a routing instruction.
repeatOfLeadId
string<uuid> | null
The earlier lead's id when isRepeatLead is true, otherwise null.
isAgentEnquiry
boolean
True when the enquiry was recognised as coming from a competing agent rather than a buyer. The lead is still created and worked; the flag keeps it out of lead-volume and cost-per-lead reporting.
agentEnquiryReason
enum<string> | null
Why, when isAgentEnquiry is true; null otherwise.
Available options:
known_agent,
prior_lead,
competitor_domain,
manual,
null
createdAt
string<date-time>
assignedTo
object | null
The agent the lead landed on. NULL means 'not decided yet' — the routing engine runs after this response is sent — NOT 'nobody'. Reliable only when you sent referenceNo/listingId or assignedBy; otherwise use GET /public/leads/{id}/assignment or the lead.assigned webhook.
Show child attributes
comments
object | null
What became of the comments[] you sent; null when you sent none.
Show child attributes
resume
object | null
What became of the resumeUrl you sent; null when you sent none.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Provident Lead Intake API","description":"Post leads into Provident's CRM, follow what happens to them, and read our reference data.","colors":{"primary":"#2f4960","light":"#f3793c","dark":"#1a2942"},"logo":{"light":"https://mintcdn.com/provident-estate/rDaG7vP82bnppp3b/logo/light.svg?fit=max\u0026auto=format\u0026n=rDaG7vP82bnppp3b\u0026q=85\u0026s=14fa412d7a470cfd31a4a7a429fd2fe2","dark":"https://mintcdn.com/provident-estate/rDaG7vP82bnppp3b/logo/dark.svg?fit=max\u0026auto=format\u0026n=rDaG7vP82bnppp3b\u0026q=85\u0026s=d99a68718044b9a3ff472b917ac33608"},"favicon":"https://mintcdn.com/provident-estate/rDaG7vP82bnppp3b/favicon.svg?fit=max\u0026auto=format\u0026n=rDaG7vP82bnppp3b\u0026q=85\u0026s=15a76077afc84cf43011d38fca09cfaa","navbar":{"links":[{"href":"mailto:it@provident.ae","label":"Support"}],"primary":{"type":"button","label":"Request credentials","href":"mailto:it@provident.ae?subject=Lead%20Intake%20API%20credentials"}},"footer":{"socials":{"website":"https://www.providentestate.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"provident-estate","hasAudioNarration":false,"actualSubdomain":"provident-estate","customDomains":["docs.prov.ae"],"gitSource":{"type":"github","owner":"blaxkxanax","repo":"provident-public-api","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af6a56fb3530c79ca885f39","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"API Reference","count":21},{"language":"default","tag":"Reference data","count":10},{"language":"default","tag":"Lead follow-up","count":4},{"language":"default","tag":"Phone screening","count":3},{"language":"default","tag":"Guide","count":2},{"language":"default","tag":"Get started","count":2},{"language":"default","tag":"Authentication","count":1},{"language":"default","tag":"Do Not Call Registry","count":1},{"language":"default","tag":"Lead intake","count":1},{"language":"default","tag":"WhatsApp check","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/lead-intake/create-a-crm-lead","slug":"/api-reference/lead-intake/create-a-crm-lead","pageMetadata":{"title":"Create a CRM lead","description":"Creates a lead in the Provident CRM and attaches it to a contact.\n\n**Only hard requirement:** at least one entry in `leadPhones` or `leadEmails`.\n\n**Contact resolution** — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (`+971501234567`) for reliable matching.\n\n**Lookup fields** (`leadType`, `funnel`, `source`, `subSource`, `eventType`, `marketingType`, `campaignName`, `advertisingCampaign`, `website`, `currency`, `localeCountry`, `location`/`locationId`, `areaOfInterest`, `propertyTypeInterest`, `marketSegment`, `agentCategory`, `buyerType`, `languages`, `assignedBy`, `distributionType`, `listingId`/`referenceNo`) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in `intakeUnresolved`.\n\n**Which pipeline the lead lands in** is `funnel`. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send `Leasing`, `Show Room`, `PvH`, … for an enquiry that belongs to another business line.\n\n**Extra fields** not defined in this schema are accepted and stored verbatim with the lead rather than rejected.\n\n**Not idempotent:** the same payload posted twice creates two leads.\n\n**Quiz answers** — landing pages that ask a question set can send a `quiz` object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable `questionKey` per question and `optionKey` per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (`2 million`, `2,000,000`, `AED 2M`, `٢ مليون` → 2000000); ambiguous dates like `03/04/2026` are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/leads","href":"/api-reference/lead-intake/create-a-crm-lead","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Creates a lead in the Provident CRM and attaches it to a contact.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Only hard requirement:\"\n }), \" at least one entry in \", _jsx(_components.code, {\n children: \"leadPhones\"\n }), \" or \", _jsx(_components.code, {\n children: \"leadEmails\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Contact resolution\"\n }), \" — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (\", _jsx(_components.code, {\n children: \"+971501234567\"\n }), \") for reliable matching.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Lookup fields\"\n }), \" (\", _jsx(_components.code, {\n children: \"leadType\"\n }), \", \", _jsx(_components.code, {\n children: \"funnel\"\n }), \", \", _jsx(_components.code, {\n children: \"source\"\n }), \", \", _jsx(_components.code, {\n children: \"subSource\"\n }), \", \", _jsx(_components.code, {\n children: \"eventType\"\n }), \", \", _jsx(_components.code, {\n children: \"marketingType\"\n }), \", \", _jsx(_components.code, {\n children: \"campaignName\"\n }), \", \", _jsx(_components.code, {\n children: \"advertisingCampaign\"\n }), \", \", _jsx(_components.code, {\n children: \"website\"\n }), \", \", _jsx(_components.code, {\n children: \"currency\"\n }), \", \", _jsx(_components.code, {\n children: \"localeCountry\"\n }), \", \", _jsx(_components.code, {\n children: \"location\"\n }), \"/\", _jsx(_components.code, {\n children: \"locationId\"\n }), \", \", _jsx(_components.code, {\n children: \"areaOfInterest\"\n }), \", \", _jsx(_components.code, {\n children: \"propertyTypeInterest\"\n }), \", \", _jsx(_components.code, {\n children: \"marketSegment\"\n }), \", \", _jsx(_components.code, {\n children: \"agentCategory\"\n }), \", \", _jsx(_components.code, {\n children: \"buyerType\"\n }), \", \", _jsx(_components.code, {\n children: \"languages\"\n }), \", \", _jsx(_components.code, {\n children: \"assignedBy\"\n }), \", \", _jsx(_components.code, {\n children: \"distributionType\"\n }), \", \", _jsx(_components.code, {\n children: \"listingId\"\n }), \"/\", _jsx(_components.code, {\n children: \"referenceNo\"\n }), \") are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in \", _jsx(_components.code, {\n children: \"intakeUnresolved\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Which pipeline the lead lands in\"\n }), \" is \", _jsx(_components.code, {\n children: \"funnel\"\n }), \". Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send \", _jsx(_components.code, {\n children: \"Leasing\"\n }), \", \", _jsx(_components.code, {\n children: \"Show Room\"\n }), \", \", _jsx(_components.code, {\n children: \"PvH\"\n }), \", … for an enquiry that belongs to another business line.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Extra fields\"\n }), \" not defined in this schema are accepted and stored verbatim with the lead rather than rejected.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Not idempotent:\"\n }), \" the same payload posted twice creates two leads.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Quiz answers\"\n }), \" — landing pages that ask a question set can send a \", _jsx(_components.code, {\n children: \"quiz\"\n }), \" object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable \", _jsx(_components.code, {\n children: \"questionKey\"\n }), \" per question and \", _jsx(_components.code, {\n children: \"optionKey\"\n }), \" per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (\", _jsx(_components.code, {\n children: \"2 million\"\n }), \", \", _jsx(_components.code, {\n children: \"2,000,000\"\n }), \", \", _jsx(_components.code, {\n children: \"AED 2M\"\n }), \", \", _jsx(_components.code, {\n children: \"٢ مليون\"\n }), \" → 2000000); ambiguous dates like \", _jsx(_components.code, {\n children: \"03/04/2026\"\n }), \" are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a CRM lead","description":"Creates a lead in the Provident CRM and attaches it to a contact.\n\n**Only hard requirement:** at least one entry in `leadPhones` or `leadEmails`.\n\n**Contact resolution** — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (`+971501234567`) for reliable matching.\n\n**Lookup fields** (`leadType`, `funnel`, `source`, `subSource`, `eventType`, `marketingType`, `campaignName`, `advertisingCampaign`, `website`, `currency`, `localeCountry`, `location`/`locationId`, `areaOfInterest`, `propertyTypeInterest`, `marketSegment`, `agentCategory`, `buyerType`, `languages`, `assignedBy`, `distributionType`, `listingId`/`referenceNo`) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in `intakeUnresolved`.\n\n**Which pipeline the lead lands in** is `funnel`. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send `Leasing`, `Show Room`, `PvH`, … for an enquiry that belongs to another business line.\n\n**Extra fields** not defined in this schema are accepted and stored verbatim with the lead rather than rejected.\n\n**Not idempotent:** the same payload posted twice creates two leads.\n\n**Quiz answers** — landing pages that ask a question set can send a `quiz` object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable `questionKey` per question and `optionKey` per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (`2 million`, `2,000,000`, `AED 2M`, `٢ مليون` → 2000000); ambiguous dates like `03/04/2026` are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/leads","href":"/api-reference/lead-intake/create-a-crm-lead","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Lead intake"],"operationId":"createPublicLead","summary":"Create a CRM lead","description":"Creates a lead in the Provident CRM and attaches it to a contact.\n\n**Only hard requirement:** at least one entry in `leadPhones` or `leadEmails`.\n\n**Contact resolution** — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (`+971501234567`) for reliable matching.\n\n**Lookup fields** (`leadType`, `funnel`, `source`, `subSource`, `eventType`, `marketingType`, `campaignName`, `advertisingCampaign`, `website`, `currency`, `localeCountry`, `location`/`locationId`, `areaOfInterest`, `propertyTypeInterest`, `marketSegment`, `agentCategory`, `buyerType`, `languages`, `assignedBy`, `distributionType`, `listingId`/`referenceNo`) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in `intakeUnresolved`.\n\n**Which pipeline the lead lands in** is `funnel`. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send `Leasing`, `Show Room`, `PvH`, … for an enquiry that belongs to another business line.\n\n**Extra fields** not defined in this schema are accepted and stored verbatim with the lead rather than rejected.\n\n**Not idempotent:** the same payload posted twice creates two leads.\n\n**Quiz answers** — landing pages that ask a question set can send a `quiz` object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable `questionKey` per question and `optionKey` per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (`2 million`, `2,000,000`, `AED 2M`, `٢ مليون` → 2000000); ambiguous dates like `03/04/2026` are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.","security":["976b45c2-29ce-41b3-a45d-495b4b7a91e7"],"requestBody":"77e153ca-b598-4a96-b359-878e3e27193e","responses":{"201":"f8d0a990-4958-45e5-b646-0ecf2ead4b7a","400":"6069840c-3d80-4213-8c32-bfd85f1b89ce","401":"20dd682c-47b6-4c50-be0d-dda02c1ddc14","403":"78d6d049-b38a-49ef-9d9c-051f3e0c5ded","429":"d67bec96-384c-475c-802b-531d97b70021","500":"4934c5e2-e63a-41bc-b596-fa2d7f2151d2"},"method":"post","type":"path","servers":["7bf50989-7c21-464a-9a4e-ab762558db15","74af751c-6a6f-4aa0-bffc-fbb0a527c885"],"path":"/public/leads","baseUrlOptions":["https://devapi.prov.ae/v2","https://prodapi.prov.ae/v2"],"title":"Create a CRM lead","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Lead intake payload. At least one entry in `leadPhones` or `leadEmails` is required; every other field is optional. Unknown fields are accepted and stored verbatim with the lead.","properties":{"leadPhones":{"type":"array","items":{"type":"string","maxLength":64,"uniqueKey":"leadPhones.items.[INDEX]","typeLabel":"string"},"description":"Phone numbers. Used FIRST to match an existing contact. Use E.164 format for reliable matching. Required unless `leadEmails` is supplied.","example":["+971501234567"],"uniqueKey":"leadPhones","typeLabel":"string[]"},"leadEmails":{"type":"array","items":{"type":"string","maxLength":255,"uniqueKey":"leadEmails.items.[INDEX]","typeLabel":"string"},"description":"Email addresses. Used to match an existing contact when no phone matches. Required unless `leadPhones` is supplied.","example":["john.doe@example.com"],"uniqueKey":"leadEmails","typeLabel":"string[]"},"leadFirstName":{"oneOf":[{"type":"string","maxLength":255,"example":"John","uniqueKey":"leadFirstName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"example":"John","uniqueKey":"leadFirstName.oneOf.1","typeLabel":"null"}],"uniqueKey":"leadFirstName","typeLabel":"string | null"},"leadMiddleName":{"oneOf":[{"type":"string","maxLength":255,"example":"Ahmad","uniqueKey":"leadMiddleName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"example":"Ahmad","uniqueKey":"leadMiddleName.oneOf.1","typeLabel":"null"}],"uniqueKey":"leadMiddleName","typeLabel":"string | null"},"leadSecondName":{"oneOf":[{"type":"string","maxLength":255,"description":"Second given name — used when no middle name is supplied.","example":"A.","uniqueKey":"leadSecondName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"Second given name — used when no middle name is supplied.","example":"A.","uniqueKey":"leadSecondName.oneOf.1","typeLabel":"null"}],"uniqueKey":"leadSecondName","typeLabel":"string | null"},"leadLastName":{"oneOf":[{"type":"string","maxLength":255,"example":"Doe","uniqueKey":"leadLastName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"example":"Doe","uniqueKey":"leadLastName.oneOf.1","typeLabel":"null"}],"uniqueKey":"leadLastName","typeLabel":"string | null"},"leadCompanyName":{"oneOf":[{"type":"string","maxLength":255,"description":"Company name for corporate enquiries.","example":"Acme Real Estate","uniqueKey":"leadCompanyName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"Company name for corporate enquiries.","example":"Acme Real Estate","uniqueKey":"leadCompanyName.oneOf.1","typeLabel":"null"}],"uniqueKey":"leadCompanyName","typeLabel":"string | null"},"leadType":{"type":"string","maxLength":255,"description":"LOOKUP. Lead type display name, e.g. `Primary Buyer`, `Secondary Buyer`, `Primary Buyer and Secondary Buyer`, `Tenant`, `Landlord`, `Broker`, `Seller`, `Owner`, `Mortgages`. Ask Provident for the full list. The shorthand `Primary` / `Secondary` / `Primary and Secondary` is accepted as an alias for the corresponding `… Buyer` type, in either direction. Omit this on a listing enquiry and it is derived from the listing — see `listingId`.","example":"Primary Buyer","uniqueKey":"leadType","typeLabel":"string"},"funnel":{"type":"string","maxLength":255,"description":"LOOKUP. Which CRM funnel (pipeline) the enquiry belongs to. OMIT IT for the main sales pipeline — that is the default and what almost every lead wants. Send a value only for an enquiry that belongs to a different business line: `Leasing`, `Show Room`, `PvH`, `Mortgages`, `Property Management`, `Landlord/Sellers Listings`, `Provident the Agency`, `Events`, `Recruitment`, `Precision Inspections`, `811 services`, `Prism`. The display name or the stable key both work (`Show Room` and `show_room` are the same funnel), matched case-insensitively and ignoring spaces, hyphens and underscores. Deliberately NOT derived from `leadType`: a Tenant enquiry can belong to Leasing or PvH and a Primary Buyer to sales, Show Room or the Agency — only the sender knows which. An unrecognised funnel does not fail the request: the lead is created on the main sales pipeline and the value is returned in `intakeUnresolved.funnel`.","example":"Leasing","uniqueKey":"funnel","typeLabel":"string"},"priority":{"oneOf":[{"type":"string","maxLength":64,"description":"Free text priority indicator.","example":"High","uniqueKey":"priority.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"description":"Free text priority indicator.","example":"High","uniqueKey":"priority.oneOf.1","typeLabel":"null"}],"uniqueKey":"priority","typeLabel":"string | null"},"marketSegment":{"type":"string","maxLength":255,"description":"LOOKUP. Marketing's segmentation of the lead.","enum":["Standard","Luxury","Super Luxury"],"example":"Luxury","uniqueKey":"marketSegment","typeLabel":"enum\u003cstring>"},"agentCategory":{"type":"string","maxLength":255,"description":"LOOKUP. Marketing's grading of the lead.","enum":["A","B","C","D"],"example":"A","uniqueKey":"agentCategory","typeLabel":"enum\u003cstring>"},"buyerType":{"oneOf":[{"type":"string","maxLength":255,"description":"LOOKUP. Who the enquirer says they are — a form's \"I am an Agent / Investor\" choice, for example. Matched against Provident's buyer types (Investor, End User, First Time Buyer, Broker, Flipper, …); `Agent` is accepted and recorded as Broker. Send the choice as the visitor saw it — an unrecognised value comes back in `intakeUnresolved` and is mapped on our side. Beats a `quiz` answer that sets the same field.","example":"Investor","uniqueKey":"buyerType.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"LOOKUP. Who the enquirer says they are — a form's \"I am an Agent / Investor\" choice, for example. Matched against Provident's buyer types (Investor, End User, First Time Buyer, Broker, Flipper, …); `Agent` is accepted and recorded as Broker. Send the choice as the visitor saw it — an unrecognised value comes back in `intakeUnresolved` and is mapped on our side. Beats a `quiz` answer that sets the same field.","example":"Investor","uniqueKey":"buyerType.oneOf.1","typeLabel":"null"}],"uniqueKey":"buyerType","typeLabel":"string | null"},"areaOfInterest":{"oneOf":[{"type":"string","description":"LOOKUP. Area the customer says they are interested in, matched on location name. Kept for existing integrations — new ones should send `location` / `locationId`, which fill the lead's location that assignment routes on.","example":"Dubai Marina","uniqueKey":"areaOfInterest.oneOf.0","typeLabel":"string"},{"type":"null","description":"LOOKUP. Area the customer says they are interested in, matched on location name. Kept for existing integrations — new ones should send `location` / `locationId`, which fill the lead's location that assignment routes on.","example":"Dubai Marina","uniqueKey":"areaOfInterest.oneOf.1","typeLabel":"null"}],"uniqueKey":"areaOfInterest","typeLabel":"string | null"},"location":{"oneOf":[{"type":"string","maxLength":255,"description":"LOOKUP. Where the property is — the lead's location, which is what lead assignment routes on. Matched case-insensitively on the location `name` from `GET /public/locations/search`. Used only when `locationId` is omitted or matches no location, so sending both means a stale id still lands the lead on the right location by name. Anything you send here wins over a location taken from `listingId` or `shortLinkId`. Location names are NOT unique: prefer `locationId`, because a name that matches more than one location is unmatched. An unmatched name comes back in `intakeUnresolved.location`.\n\nNot the same field as `areaOfInterest`, which is the area the customer says they want and is kept for existing integrations.","example":"Dubai Marina","uniqueKey":"location.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"LOOKUP. Where the property is — the lead's location, which is what lead assignment routes on. Matched case-insensitively on the location `name` from `GET /public/locations/search`. Used only when `locationId` is omitted or matches no location, so sending both means a stale id still lands the lead on the right location by name. Anything you send here wins over a location taken from `listingId` or `shortLinkId`. Location names are NOT unique: prefer `locationId`, because a name that matches more than one location is unmatched. An unmatched name comes back in `intakeUnresolved.location`.\n\nNot the same field as `areaOfInterest`, which is the area the customer says they want and is kept for existing integrations.","example":"Dubai Marina","uniqueKey":"location.oneOf.1","typeLabel":"null"}],"uniqueKey":"location","typeLabel":"string | null"},"locationId":{"oneOf":[{"type":"string","maxLength":255,"description":"LOOKUP. Location id — `id` from `GET /public/locations/search` or `GET /public/projects/filters`. Tried before `location`; a value that is not a uuid is matched as a name instead of being discarded. A value that matches no location (an unknown or retired id) never fails the request: it comes back in `intakeUnresolved.locationId`, and `location`, if you sent it, is then tried by name. That report stands even when the name matched, so a stale id you keep sending stays visible.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6","uniqueKey":"locationId.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"LOOKUP. Location id — `id` from `GET /public/locations/search` or `GET /public/projects/filters`. Tried before `location`; a value that is not a uuid is matched as a name instead of being discarded. A value that matches no location (an unknown or retired id) never fails the request: it comes back in `intakeUnresolved.locationId`, and `location`, if you sent it, is then tried by name. That report stands even when the name matched, so a stale id you keep sending stays visible.","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6","uniqueKey":"locationId.oneOf.1","typeLabel":"null"}],"uniqueKey":"locationId","typeLabel":"string | null"},"propertyTypeInterest":{"oneOf":[{"type":"string","maxLength":255,"description":"LOOKUP. Property type the lead is interested in. Matched case-insensitively after trimming, and a regular English plural also matches the singular catalogue entry (`Apartments` → `Apartment`, `Townhouses` → `Townhouse`), so a form offering plural choices needs no mapping on your side.","example":"Apartment","uniqueKey":"propertyTypeInterest.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"LOOKUP. Property type the lead is interested in. Matched case-insensitively after trimming, and a regular English plural also matches the singular catalogue entry (`Apartments` → `Apartment`, `Townhouses` → `Townhouse`), so a form offering plural choices needs no mapping on your side.","example":"Apartment","uniqueKey":"propertyTypeInterest.oneOf.1","typeLabel":"null"}],"uniqueKey":"propertyTypeInterest","typeLabel":"string | null"},"budgetMin":{"oneOf":[{"type":"string","description":"Minimum budget. Numeric string; a JSON number is also accepted.","example":"1000000","uniqueKey":"budgetMin.oneOf.0","typeLabel":"string"},{"type":"null","description":"Minimum budget. Numeric string; a JSON number is also accepted.","example":"1000000","uniqueKey":"budgetMin.oneOf.1","typeLabel":"null"}],"uniqueKey":"budgetMin","typeLabel":"string | null"},"budgetMax":{"oneOf":[{"type":"string","description":"Maximum budget. Numeric string; a JSON number is also accepted.","example":"2500000","uniqueKey":"budgetMax.oneOf.0","typeLabel":"string"},{"type":"null","description":"Maximum budget. Numeric string; a JSON number is also accepted.","example":"2500000","uniqueKey":"budgetMax.oneOf.1","typeLabel":"null"}],"uniqueKey":"budgetMax","typeLabel":"string | null"},"currency":{"type":"string","maxLength":3,"description":"LOOKUP. ISO 4217 currency code for the budget values.","example":"AED","uniqueKey":"currency","typeLabel":"string"},"initialInquiry":{"oneOf":[{"type":"string","description":"Free-text message or callback reason from the form.","example":"Looking for a 2BR with sea view, ready to move in Q4.","uniqueKey":"initialInquiry.oneOf.0","typeLabel":"string"},{"type":"null","description":"Free-text message or callback reason from the form.","example":"Looking for a 2BR with sea view, ready to move in Q4.","uniqueKey":"initialInquiry.oneOf.1","typeLabel":"null"}],"uniqueKey":"initialInquiry","typeLabel":"string | null"},"languages":{"type":"array","items":{"type":"string","maxLength":255,"uniqueKey":"languages.items.[INDEX]","typeLabel":"string"},"description":"LOOKUP. Languages the lead speaks, by code or name. Unrecognised entries are ignored.","example":["ar","English"],"uniqueKey":"languages","typeLabel":"string[]"},"listingId":{"type":"string","format":"uuid","description":"LOOKUP. Provident listing UUID. Takes precedence over `referenceNo` when both are sent.\n\nA resolved listing also fills in what the form did not ask. Each field below is taken from the listing ONLY where this payload leaves it empty — anything you send always wins, and a quiz answer mapped to the same field beats the listing too:\n- `leadType` — from the listing category and offering type: Primary -> Primary Buyer, Secondary -> Secondary Buyer, and any rental listing -> Tenant whatever its category.\n- developer, location, property type, bedrooms, currency — copied from the listing. The location fills the lead's own location and does not overwrite `areaOfInterest`.\n- `budgetMin` — the listing price, unless the price is on application or it would exceed a `budgetMax` you sent. `budgetMax` is never derived.\n\nSending a value we then fail to match (an unknown developer name, say) is still reported in `intakeUnresolved` even though the listing goes on to fill that field.\n\nThe listing's own agent, where it has one, becomes the lead owner and wins over `assignedBy`.","uniqueKey":"listingId","typeLabel":"string\u003cuuid>"},"referenceNo":{"type":"string","maxLength":128,"description":"LOOKUP. Listing reference number, used when `listingId` is not supplied. A reference number matching MORE THAN ONE listing counts as unresolved, and nothing is inherited. See `listingId` for what a resolved listing fills in.","example":"PR-123456","uniqueKey":"referenceNo","typeLabel":"string"},"source":{"type":"string","maxLength":255,"description":"LOOKUP. Lead source. Send this — an unrecognised or omitted source leaves the lead with no source attribution.","example":"Website","uniqueKey":"source","typeLabel":"string"},"subSource":{"type":"array","items":{"type":"string","maxLength":255,"uniqueKey":"subSource.items.[INDEX]","typeLabel":"string"},"description":"LOOKUP. Sub-sources. Only those linked to the resolved `source` are kept; ignored entirely when `source` did not resolve.","example":["Callback Form","Team Page"],"uniqueKey":"subSource","typeLabel":"string[]"},"marketingType":{"type":"string","maxLength":255,"description":"LOOKUP. Marketing type, e.g. Organic or Paid.","example":"Organic","uniqueKey":"marketingType","typeLabel":"string"},"eventType":{"type":"string","maxLength":255,"description":"LOOKUP. What the user did — e.g. Submit Form, Call, Whatsapp Click, DM, Webpush, Gamification.","example":"Submit Form","uniqueKey":"eventType","typeLabel":"string"},"campaignName":{"type":"string","maxLength":255,"description":"LOOKUP. CRM campaign name.","example":"Spring 2026 Landing Page","uniqueKey":"campaignName","typeLabel":"string"},"advertisingCampaign":{"type":"string","maxLength":255,"description":"CREATED ON FIRST SIGHT. Advertising campaign name — the one field here that is not a strict lookup: a name Provident has never seen creates the campaign instead of being discarded. Omit it when you send `metaFacebook`; the Meta campaign fills it.","example":"Google Ads — Q3","uniqueKey":"advertisingCampaign","typeLabel":"string"},"developerName":{"type":"string","maxLength":255,"description":"LOOKUP. Developer the enquiry is about, matched on name or slug — `Sobha Realty` or `sobha-realty`. Values come from `GET /public/developers`.","example":"Sobha Realty","uniqueKey":"developerName","typeLabel":"string"},"developerId":{"type":"string","description":"Developer uuid from `GET /public/developers`. Takes precedence over `developerName`; a non-uuid value here is treated as a name instead of being discarded.","example":"8ecf4fcd-ec63-5764-8524-7cd917494dbe","uniqueKey":"developerId","typeLabel":"string"},"website":{"type":"string","maxLength":255,"description":"LOOKUP. Website NAME or DOMAIN the lead came from — either resolves, matched case-insensitively. Prefer the domain (`provident.ae`, `providentestate.com`); it survives a display-name change. Ask Provident to add your domain before you start sending it.","example":"provident.ae","uniqueKey":"website","typeLabel":"string"},"pageUrl":{"oneOf":[{"type":"string","description":"Full URL of the page the submission originated from.","example":"https://prov.ae/en/dubai-marina?utm_source=google","uniqueKey":"pageUrl.oneOf.0","typeLabel":"string"},{"type":"null","description":"Full URL of the page the submission originated from.","example":"https://prov.ae/en/dubai-marina?utm_source=google","uniqueKey":"pageUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"pageUrl","typeLabel":"string | null"},"pathLocale":{"oneOf":[{"type":"string","maxLength":32,"description":"Locale segment of the URL path, e.g. `en`.","example":"en","uniqueKey":"pathLocale.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":32,"description":"Locale segment of the URL path, e.g. `en`.","example":"en","uniqueKey":"pathLocale.oneOf.1","typeLabel":"null"}],"uniqueKey":"pathLocale","typeLabel":"string | null"},"gclid":{"oneOf":[{"type":"string","maxLength":512,"description":"Google Ads click id.","uniqueKey":"gclid.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"description":"Google Ads click id.","uniqueKey":"gclid.oneOf.1","typeLabel":"null"}],"uniqueKey":"gclid","typeLabel":"string | null"},"fbclid":{"oneOf":[{"type":"string","maxLength":512,"description":"Facebook click id.","uniqueKey":"fbclid.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"description":"Facebook click id.","uniqueKey":"fbclid.oneOf.1","typeLabel":"null"}],"uniqueKey":"fbclid","typeLabel":"string | null"},"utmSource":{"oneOf":[{"type":"string","maxLength":512,"example":"google","uniqueKey":"utmSource.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"example":"google","uniqueKey":"utmSource.oneOf.1","typeLabel":"null"}],"uniqueKey":"utmSource","typeLabel":"string | null"},"utmMedium":{"oneOf":[{"type":"string","maxLength":512,"example":"cpc","uniqueKey":"utmMedium.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"example":"cpc","uniqueKey":"utmMedium.oneOf.1","typeLabel":"null"}],"uniqueKey":"utmMedium","typeLabel":"string | null"},"utmCampaign":{"oneOf":[{"type":"string","maxLength":512,"example":"spring-2026","uniqueKey":"utmCampaign.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"example":"spring-2026","uniqueKey":"utmCampaign.oneOf.1","typeLabel":"null"}],"uniqueKey":"utmCampaign","typeLabel":"string | null"},"utmTerm":{"oneOf":[{"type":"string","maxLength":512,"example":"dubai marina apartments","uniqueKey":"utmTerm.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"example":"dubai marina apartments","uniqueKey":"utmTerm.oneOf.1","typeLabel":"null"}],"uniqueKey":"utmTerm","typeLabel":"string | null"},"utmContent":{"oneOf":[{"type":"string","maxLength":512,"example":"hero-cta","uniqueKey":"utmContent.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":512,"example":"hero-cta","uniqueKey":"utmContent.oneOf.1","typeLabel":"null"}],"uniqueKey":"utmContent","typeLabel":"string | null"},"formName":{"oneOf":[{"type":"string","maxLength":255,"description":"Name of the web form the visitor submitted. Falls back to `metaFacebook.formName` (truncated to 255) when omitted.","example":"contact-popup-form","uniqueKey":"formName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"Name of the web form the visitor submitted. Falls back to `metaFacebook.formName` (truncated to 255) when omitted.","example":"contact-popup-form","uniqueKey":"formName.oneOf.1","typeLabel":"null"}],"uniqueKey":"formName","typeLabel":"string | null"},"adsetName":{"oneOf":[{"type":"string","maxLength":255,"description":"Ad set / ad group name on your side. Free text — distinct from the `campaignName` lookup. Falls back to `metaFacebook.adgroupName` (truncated to 255) when omitted.","example":"test ww","uniqueKey":"adsetName.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"Ad set / ad group name on your side. Free text — distinct from the `campaignName` lookup. Falls back to `metaFacebook.adgroupName` (truncated to 255) when omitted.","example":"test ww","uniqueKey":"adsetName.oneOf.1","typeLabel":"null"}],"uniqueKey":"adsetName","typeLabel":"string | null"},"referrer":{"oneOf":[{"type":"string","description":"Referring URL the visitor arrived from.","example":"https://sobha-city.provident.ae/?utm_source=Google+Ads","uniqueKey":"referrer.oneOf.0","typeLabel":"string"},{"type":"null","description":"Referring URL the visitor arrived from.","example":"https://sobha-city.provident.ae/?utm_source=Google+Ads","uniqueKey":"referrer.oneOf.1","typeLabel":"null"}],"uniqueKey":"referrer","typeLabel":"string | null"},"ipAddress":{"oneOf":[{"type":"string","maxLength":64,"description":"Submitter IP. IPv4, IPv6 and proxy chains all fit.","example":"217.165.113.16","uniqueKey":"ipAddress.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"description":"Submitter IP. IPv4, IPv6 and proxy chains all fit.","example":"217.165.113.16","uniqueKey":"ipAddress.oneOf.1","typeLabel":"null"}],"uniqueKey":"ipAddress","typeLabel":"string | null"},"userAgent":{"oneOf":[{"type":"string","description":"Browser user-agent string captured at submission.","example":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","uniqueKey":"userAgent.oneOf.0","typeLabel":"string"},{"type":"null","description":"Browser user-agent string captured at submission.","example":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","uniqueKey":"userAgent.oneOf.1","typeLabel":"null"}],"uniqueKey":"userAgent","typeLabel":"string | null"},"submittedAt":{"oneOf":[{"type":"string","format":"date-time","description":"When the visitor submitted the form on your side. Distinct from the CRM's own createdAt, which is when we received it. An unparseable value is ignored rather than failing the request.","example":"2026-07-27T13:45:31.728Z","uniqueKey":"submittedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the visitor submitted the form on your side. Distinct from the CRM's own createdAt, which is when we received it. An unparseable value is ignored rather than failing the request.","example":"2026-07-27T13:45:31.728Z","uniqueKey":"submittedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"submittedAt","typeLabel":"string\u003cdate-time> | null"},"localeCountry":{"type":"string","maxLength":255,"description":"LOOKUP. Country code (e.g. AE) or full country name. When omitted, the API attempts to infer it from a trailing two-letter segment of `pageUrl`.","example":"AE","uniqueKey":"localeCountry","typeLabel":"string"},"assignedBy":{"type":"string","maxLength":255,"description":"LOOKUP. Assign the lead to a specific Provident agent by email address. Omit to let Provident's automatic assignment engine route the lead. When the lead also resolves a listing that has an agent of its own, the listing's agent wins.","example":"agent@providentestate.com","uniqueKey":"assignedBy","typeLabel":"string"},"distributionType":{"type":"string","maxLength":64,"description":"How you would like this lead routed. This is a HINT, not an instruction: the value is stored on the lead and only affects who receives it if Provident has configured a routing rule that claims it. A value no rule claims changes nothing, so sending one is always safe.\n\nWhere a rule does claim the value it OUTRANKS the normal rule order: a lead sent as `Location distribution` that also carries a campaign is routed by the location rule, not by the campaign rule that would otherwise have matched first. Which types are claimed is configuration on our side and changes — ask before relying on it.\n\nMatched case-insensitively after trimming, on both sides of the comparison, so capitalisation never decides routing; the leading word on its own also works (`campaign`, `personal`, `developer`, `language`, `location`, `default`, `roadshow`).\n\nAn unrecognised value is stored exactly as sent rather than rejected — a lead is never lost over this field, it simply matches no rule.\n\n`Personal distribution` carries one extra meaning: it marks the lead as having a named owner, and such a lead is never re-assigned automatically and runs no follow-up clock at all. It only takes effect together with a resolved `assignedBy` — the two fields are one instruction. If `assignedBy` is missing or names nobody we can match, the lead is still created and routed normally but the marker is dropped, and both values come back in `intakeUnresolved`.\n\n**Omit it and a Meta lead form can carry it instead.** A `Distribution` or `Distribution Type` entry in `metaFacebook.customFields` is read as a fallback and normalised the same way, because the value is usually set by whoever built the ad form rather than by whoever posts the lead. A top-level `distributionType` always wins.","enum":["Personal distribution","Campaign distribution","Developer distribution","Language distribution","Location distribution","Default distribution","Developer and Area distribution","Area distribution Secondary","Roadshow distribution"],"example":"Campaign distribution","uniqueKey":"distributionType","typeLabel":"enum\u003cstring>"},"metaFacebook":{"type":"object","description":"Meta / Facebook / Instagram (or TikTok) lead-ads metadata. Send only for leads originating from an ad-platform lead form. The standard fields above still drive routing.\n\nStored alongside the lead AND copied onto it: `metaCampaignId` + `metaCampaignName` become the lead's advertising campaign (matched on the Meta campaign id, and created if Provident has never seen it, so campaign names need no prior agreement); `finalPageName`, `adName`/`adId`, `adgroupName`/`adgroupId` and `formName`/`formId` become filterable columns on the lead. Matching on the id is what makes a rename safe — rename a campaign in Ads Manager and its leads stay on one campaign in the CRM. `campaignName` is a different, strictly-matched field: the CRM's own campaign, which drives routing.\n\nThe whole object is discarded when `metaLeadId` is absent. `metaLeadId` is unique across the CRM: it prevents the metadata being attached twice, but it does NOT prevent a duplicate lead — de-duplicate on your side.","properties":{"metaLeadId":{"type":"string","maxLength":64,"description":"Meta-issued lead id. Required for this block to be stored.","example":"7636865386872307975","uniqueKey":"metaFacebook.metaLeadId","typeLabel":"string"},"metaCreatedAt":{"type":"string","format":"date-time","description":"Submission time reported by Meta (ISO-8601).","example":"2026-05-06T19:38:09.000Z","uniqueKey":"metaFacebook.metaCreatedAt","typeLabel":"string\u003cdate-time>"},"platform":{"type":"string","maxLength":32,"description":"Source platform. The short forms `fb` and `ig` are accepted and normalised to `facebook` / `instagram`, so a sender forwarding Meta verbatim needs no translation; anything else is stored lowercased rather than rejected.","enum":["facebook","instagram","tiktok","fb","ig"],"example":"facebook","uniqueKey":"metaFacebook.platform","typeLabel":"enum\u003cstring>"},"adId":{"type":"string","maxLength":64,"uniqueKey":"metaFacebook.adId","typeLabel":"string"},"adName":{"type":"string","maxLength":512,"example":"Marina Launch — Video","uniqueKey":"metaFacebook.adName","typeLabel":"string"},"adType":{"type":"string","maxLength":64,"example":"Video","uniqueKey":"metaFacebook.adType","typeLabel":"string"},"adgroupId":{"type":"string","maxLength":64,"uniqueKey":"metaFacebook.adgroupId","typeLabel":"string"},"adgroupName":{"type":"string","maxLength":255,"example":"TARGETED","description":"Ad set / ad group name. Also fills the lead's `adsetName` when you send no top-level one.","uniqueKey":"metaFacebook.adgroupName","typeLabel":"string"},"metaCampaignId":{"type":"string","maxLength":64,"description":"Meta's own campaign id — NOT the CRM campaign (use `campaignName` for that).","uniqueKey":"metaFacebook.metaCampaignId","typeLabel":"string"},"metaCampaignName":{"type":"string","maxLength":512,"example":"Marina Q2","uniqueKey":"metaFacebook.metaCampaignName","typeLabel":"string"},"formId":{"type":"string","maxLength":64,"uniqueKey":"metaFacebook.formId","typeLabel":"string"},"formName":{"type":"string","maxLength":512,"example":"Marina Callback","description":"Meta lead-form name. Also fills the lead's `formName` when you send no top-level one.","uniqueKey":"metaFacebook.formName","typeLabel":"string"},"adAccountId":{"type":"string","maxLength":64,"example":"act_123456789","uniqueKey":"metaFacebook.adAccountId","typeLabel":"string"},"businessAccountId":{"type":"string","maxLength":64,"uniqueKey":"metaFacebook.businessAccountId","typeLabel":"string"},"sourceAction":{"type":"string","maxLength":64,"example":"Form","uniqueKey":"metaFacebook.sourceAction","typeLabel":"string"},"finalPageName":{"type":"string","maxLength":255,"example":"Thank You","description":"The Facebook/Instagram page the ad ran under. Copied onto the lead.","uniqueKey":"metaFacebook.finalPageName","typeLabel":"string"},"customFields":{"type":"object","additionalProperties":true,"description":"Per-form custom question/answer pairs and any other ad-platform-only fields. Keys are preserved verbatim (non-ASCII safe).","example":{"هل ترغب في حضور هذا المعرض الحصري؟":"نعم","Preferred call time":"Evening"},"uniqueKey":"metaFacebook.customFields","typeLabel":"object"}},"uniqueKey":"metaFacebook","typeLabel":"object"},"quiz":{"type":"object","description":"A dynamic quiz / survey submitted with the lead — for landing pages that ask a set of questions. Unlike every other field in this API, the questions do NOT have to be agreed with Provident in advance: questions and options register themselves the first time they arrive, so a new quiz starts capturing answers with no API change on either side. Answers are searchable in the CRM, shown on the lead, and — for questions Provident maps to a CRM field — used to fill that field on the lead itself.","properties":{"quizKey":{"type":"string","maxLength":128,"description":"Stable identifier for the quiz. REQUIRED — without it the whole `quiz` object is ignored. Keys are scoped to the quiz, so `budget` in quiz A and `budget` in quiz B are independent; you do not need globally unique question keys.","example":"off-plan-investor-2026","uniqueKey":"quiz.quizKey","typeLabel":"string"},"quizName":{"type":"string","maxLength":255,"description":"Display name. Used the first time this `quizKey` is seen.","example":"Off-plan investor quiz","uniqueKey":"quiz.quizName","typeLabel":"string"},"locale":{"type":"string","maxLength":16,"description":"Language the quiz was answered in. Labels are stored per locale so the CRM shows what the visitor actually saw.","example":"ar","uniqueKey":"quiz.locale","typeLabel":"string"},"version":{"type":"string","maxLength":32,"description":"Your version identifier for the quiz, recorded on each answer.","example":"3","uniqueKey":"quiz.version","typeLabel":"string"},"answers":{"type":"array","items":{"type":"object","description":"One answer to one quiz question. `questionKey` (and `optionKey` for dropdowns) are the contract: they are the only language-independent identity an answer has. Labels are display text and change with language and copy edits, so they are never used for matching when a key is present.","properties":{"questionKey":{"type":"string","maxLength":128,"description":"Stable machine key for the question, unique within the quiz. Must be the SAME across languages and stable over time — do not regenerate it when you edit the wording. Without it the answer is keyed off a hash of its label and will not merge with the same question in another language.","example":"budget","uniqueKey":"quiz.answers.items.[INDEX].questionKey","typeLabel":"string"},"questionLabel":{"type":"string","maxLength":512,"description":"The question as shown to the visitor, in the quiz locale.","example":"ما هي ميزانيتك؟","uniqueKey":"quiz.answers.items.[INDEX].questionLabel","typeLabel":"string"},"optionKey":{"oneOf":[{"type":"string","description":"Stable machine key of the chosen option, for select questions. Send an ARRAY for multi-select — each option becomes its own answer record.","maxLength":128,"example":"2m-5m","uniqueKey":"quiz.answers.items.[INDEX].optionKey.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","maxLength":128,"uniqueKey":"quiz.answers.items.[INDEX].optionKey.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"Stable machine key of the chosen option, for select questions. Send an ARRAY for multi-select — each option becomes its own answer record.","example":"2m-5m","uniqueKey":"quiz.answers.items.[INDEX].optionKey.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"quiz.answers.items.[INDEX].optionKey","typeLabel":"string | string[]"},"answerLabel":{"oneOf":[{"type":"string","description":"The answer as shown to the visitor. For a select answer this is the option label; for free text it is the answer itself. Array form pairs positionally with an array `optionKey`.","maxLength":512,"example":"٢-٥ مليون","uniqueKey":"quiz.answers.items.[INDEX].answerLabel.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","maxLength":512,"uniqueKey":"quiz.answers.items.[INDEX].answerLabel.oneOf.1.items.[INDEX]","typeLabel":"string"},"description":"The answer as shown to the visitor. For a select answer this is the option label; for free text it is the answer itself. Array form pairs positionally with an array `optionKey`.","example":"٢-٥ مليون","uniqueKey":"quiz.answers.items.[INDEX].answerLabel.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"quiz.answers.items.[INDEX].answerLabel","typeLabel":"string | string[]"},"value":{"oneOf":[{"type":"string","description":"Machine value when you have one — a number, boolean, or ISO-8601 date string. TRUSTED OVER THE LABEL: sending 2000000 removes any dependence on our parsing of \"٢-٥ مليون\". Free-text numbers are parsed best-effort instead (\"2 million\", \"2,000,000\", \"AED 2M\", \"٢ مليون\" all resolve to 2000000); an unparseable value is kept verbatim and flagged for review rather than dropped.","example":2000000,"uniqueKey":"quiz.answers.items.[INDEX].value.oneOf.0","typeLabel":"string"},{"type":"number","description":"Machine value when you have one — a number, boolean, or ISO-8601 date string. TRUSTED OVER THE LABEL: sending 2000000 removes any dependence on our parsing of \"٢-٥ مليون\". Free-text numbers are parsed best-effort instead (\"2 million\", \"2,000,000\", \"AED 2M\", \"٢ مليون\" all resolve to 2000000); an unparseable value is kept verbatim and flagged for review rather than dropped.","example":2000000,"uniqueKey":"quiz.answers.items.[INDEX].value.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"Machine value when you have one — a number, boolean, or ISO-8601 date string. TRUSTED OVER THE LABEL: sending 2000000 removes any dependence on our parsing of \"٢-٥ مليون\". Free-text numbers are parsed best-effort instead (\"2 million\", \"2,000,000\", \"AED 2M\", \"٢ مليون\" all resolve to 2000000); an unparseable value is kept verbatim and flagged for review rather than dropped.","example":2000000,"uniqueKey":"quiz.answers.items.[INDEX].value.oneOf.2","typeLabel":"boolean"}],"uniqueKey":"quiz.answers.items.[INDEX].value","typeLabel":"string | number | boolean"},"currency":{"type":"string","maxLength":3,"description":"ISO 4217 currency for a monetary answer, when the value does not imply it.","example":"AED","uniqueKey":"quiz.answers.items.[INDEX].currency","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"quiz.answers.items.[INDEX]","typeLabel":"object"},"maxItems":60,"description":"The answers, in the order the questions were asked. Up to 60 per submission register new questions; anything beyond is still recorded and flagged for review, but does not extend the catalogue. A quiz is capped at 100 questions and a question at 200 options.","uniqueKey":"quiz.answers","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"quiz","typeLabel":"object"},"integrationRef":{"oneOf":[{"type":"string","maxLength":128,"description":"Your handle for the specific automation behind this lead — a Make scenario name, a webhook id, a form build. Free text: stored verbatim, never matched against anything, and never reported in `intakeUnresolved`.\n\nIt identifies an INTEGRATION, not a submission, so keep it stable across every lead that automation sends; a per-lead unique id makes it useless for grouping. Values are only distinguished within one sender, so two partners can both use `scenario-1`.\n\nDo NOT put your own name here. The submitting OAuth client is recorded automatically from the access token — there is no field for it, because attribution a sender can write is not attribution.","example":"make:meta-leadgen-eu","uniqueKey":"integrationRef.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":128,"description":"Your handle for the specific automation behind this lead — a Make scenario name, a webhook id, a form build. Free text: stored verbatim, never matched against anything, and never reported in `intakeUnresolved`.\n\nIt identifies an INTEGRATION, not a submission, so keep it stable across every lead that automation sends; a per-lead unique id makes it useless for grouping. Values are only distinguished within one sender, so two partners can both use `scenario-1`.\n\nDo NOT put your own name here. The submitting OAuth client is recorded automatically from the access token — there is no field for it, because attribution a sender can write is not attribution.","example":"make:meta-leadgen-eu","uniqueKey":"integrationRef.oneOf.1","typeLabel":"null"}],"uniqueKey":"integrationRef","typeLabel":"string | null"},"comments":{"type":"array","maxItems":5,"items":{"type":"object","description":"One comment to write onto the lead's thread. Built for relaying a conversation that happened somewhere else — a WhatsApp chat that qualified the enquiry — so the agent reads it where they read everything else about the lead. These are VISIBLE comments, they are not agent activity (posting one never restarts the lead's response clock), @-mentions in the text notify nobody, and they are attributed to your integration rather than to a person.","required":["body"],"properties":{"body":{"type":"string","maxLength":5000,"description":"The comment text. Trimmed. Longer than 5000 characters is truncated rather than rejected; an entry with an empty body is skipped.","example":"Hi, I'm looking for a 2-bed in JVC under 1.3M","isRequired":true,"uniqueKey":"comments.items.[INDEX].body","typeLabel":"string"},"date":{"oneOf":[{"type":"string","format":"date-time","description":"When this comment was SAID — not when you are sending it. This is the timestamp the CRM thread sorts and displays, so a conversation relayed hours later still reads in its real order beside the agent's own notes; the arrival time is recorded separately and never lost. Defaults to now. An unparseable value falls back to now, and so does a date more than 24 hours in the future, so a skewed clock cannot park a message at the top of the thread. A date in the past is always honoured.","example":"2026-09-18T06:10:00.000Z","uniqueKey":"comments.items.[INDEX].date.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When this comment was SAID — not when you are sending it. This is the timestamp the CRM thread sorts and displays, so a conversation relayed hours later still reads in its real order beside the agent's own notes; the arrival time is recorded separately and never lost. Defaults to now. An unparseable value falls back to now, and so does a date more than 24 hours in the future, so a skewed clock cannot park a message at the top of the thread. A date in the past is always honoured.","example":"2026-09-18T06:10:00.000Z","uniqueKey":"comments.items.[INDEX].date.oneOf.1","typeLabel":"null"}],"uniqueKey":"comments.items.[INDEX].date","typeLabel":"string\u003cdate-time> | null"},"type":{"oneOf":[{"type":"string","maxLength":64,"description":"What kind of comment this is, so the CRM can render it as something other than a plain note. Free text today — stored verbatim, matched against nothing — so agree a vocabulary with Provident and keep it stable.","example":"whatsapp_inbound","uniqueKey":"comments.items.[INDEX].type.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"description":"What kind of comment this is, so the CRM can render it as something other than a plain note. Free text today — stored verbatim, matched against nothing — so agree a vocabulary with Provident and keep it stable.","example":"whatsapp_inbound","uniqueKey":"comments.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"comments.items.[INDEX].type","typeLabel":"string | null"},"chatChannel":{"oneOf":[{"type":"string","maxLength":64,"description":"The conversation this message came from, when it came from one. Free text, stored verbatim. Send it even though nothing reads it yet: it is what will let these comments be lifted into a real chat view later.","example":"whatsapp","uniqueKey":"comments.items.[INDEX].chatChannel.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"description":"The conversation this message came from, when it came from one. Free text, stored verbatim. Send it even though nothing reads it yet: it is what will let these comments be lifted into a real chat view later.","example":"whatsapp","uniqueKey":"comments.items.[INDEX].chatChannel.oneOf.1","typeLabel":"null"}],"uniqueKey":"comments.items.[INDEX].chatChannel","typeLabel":"string | null"},"isPinned":{"type":"boolean","default":false,"description":"Pin this comment to the top of the lead's thread. Pinned comments keep their own chronological order among themselves.","example":false,"uniqueKey":"comments.items.[INDEX].isPinned","typeLabel":"boolean"}},"uniqueKey":"comments.items.[INDEX]","typeLabel":"object"},"description":"Comments to write onto the lead's thread, OLDEST FIRST — the first entry in the array is the eldest and appears at the bottom of the CRM timeline. Entries sent without a `date`, and entries sharing the same timestamp, keep the order you sent them in. Maximum 5 per request: anything past the fifth is SKIPPED and reported back as `comments.skipped` rather than failing the request, because failing it would throw away a real customer enquiry over a comment. Send a longer conversation as consecutive PUTs, five at a time, oldest batch first. On an update these are ADDED to what the lead already has.","uniqueKey":"comments","typeLabel":"object[]"},"jobPosition":{"oneOf":[{"type":"string","maxLength":255,"description":"Recruitment funnel: the job position the applicant applied for, as your form wrote it. Free text — stored as sent, never matched against a list, never reported in `intakeUnresolved`. Send it with `\"funnel\": \"Recruitment\"`. Longer values are cut at 255 characters.","example":"Property Consultant","uniqueKey":"jobPosition.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"Recruitment funnel: the job position the applicant applied for, as your form wrote it. Free text — stored as sent, never matched against a list, never reported in `intakeUnresolved`. Send it with `\"funnel\": \"Recruitment\"`. Longer values are cut at 255 characters.","example":"Property Consultant","uniqueKey":"jobPosition.oneOf.1","typeLabel":"null"}],"uniqueKey":"jobPosition","typeLabel":"string | null"},"resumeUrl":{"oneOf":[{"type":"string","maxLength":2048,"description":"Recruitment funnel: a link to the applicant's CV FILE. We download it shortly after responding and keep our own private copy on the lead; your link need only stay reachable for a few minutes.\n\nMust be a public http(s) URL on the default port, without credentials, returning the file itself: PDF, Word (.doc/.docx), RTF, OpenDocument text, PNG or JPEG, at most 10 MB. The type is read from the file's bytes, not your headers. A link that returns a web page fails; Google Drive `/file/d/\u003cid>/view` and Dropbox `?dl=0` links are converted to direct downloads for you. Up to 5 redirects are followed.\n\nA bad link never fails the request — see `resume` in the response. A new link replaces the lead's CV.","example":"https://files.example.com/applications/8812/cv.pdf","uniqueKey":"resumeUrl.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":2048,"description":"Recruitment funnel: a link to the applicant's CV FILE. We download it shortly after responding and keep our own private copy on the lead; your link need only stay reachable for a few minutes.\n\nMust be a public http(s) URL on the default port, without credentials, returning the file itself: PDF, Word (.doc/.docx), RTF, OpenDocument text, PNG or JPEG, at most 10 MB. The type is read from the file's bytes, not your headers. A link that returns a web page fails; Google Drive `/file/d/\u003cid>/view` and Dropbox `?dl=0` links are converted to direct downloads for you. Up to 5 redirects are followed.\n\nA bad link never fails the request — see `resume` in the response. A new link replaces the lead's CV.","example":"https://files.example.com/applications/8812/cv.pdf","uniqueKey":"resumeUrl.oneOf.1","typeLabel":"null"}],"uniqueKey":"resumeUrl","typeLabel":"string | null"}},"additionalProperties":true,"uniqueKey":"","typeLabel":"object"},"examples":{"minimal":{"title":"minimal","value":{"leadPhones":["+971501234567"],"leadFirstName":"John","leadLastName":"Doe"}},"websiteForm":{"title":"websiteForm","value":{"leadPhones":["+971501234567"],"leadEmails":["john.doe@example.com"],"leadFirstName":"John","leadLastName":"Doe","leadType":"Primary","source":"Website","subSource":["Callback Form"],"eventType":"Submit Form","marketingType":"Paid","website":"provident.ae","campaignName":"Spring 2026 Landing Page","developerName":"Sobha Realty","formName":"contact-popup-form","areaOfInterest":"Dubai Marina","propertyTypeInterest":"Apartment","budgetMin":"1000000","budgetMax":"2500000","currency":"AED","initialInquiry":"Looking for a 2BR with sea view, ready Q4.","languages":["English","ar"],"localeCountry":"AE","pageUrl":"https://prov.ae/en/dubai-marina","pathLocale":"en","gclid":"Cj0KCQ...","utmSource":"google","utmMedium":"cpc","utmCampaign":"spring-2026","utmTerm":"dubai marina apartments","utmContent":"hero-cta","integrationRef":"make:meta-leadgen-eu"}},"allFields":{"title":"allFields","description":"The complete surface of the endpoint. Nothing is required except one phone or email; omit fields you do not have rather than sending empty strings or nulls.","value":{"leadPhones":["+971501234567","+971559876543"],"leadEmails":["john.doe@example.com","j.doe@work.example.com"],"leadFirstName":"John","leadMiddleName":"Ahmad","leadSecondName":"A.","leadLastName":"Doe","leadCompanyName":"Acme Real Estate","leadType":"Primary","priority":"High","marketSegment":"Luxury","agentCategory":"A","buyerType":"Investor","areaOfInterest":"Dubai Marina","propertyTypeInterest":"Apartment","budgetMin":"1000000","budgetMax":"2500000","currency":"AED","initialInquiry":"Looking for a 2BR with sea view, ready to move in Q4.","languages":["English","ar"],"listingId":"8f3c1e2a-1122-3344-5566-778899aabbcc","referenceNo":"PR-123456","source":"Website","subSource":["Callback Form","Team Page"],"marketingType":"Paid","eventType":"Submit Form","campaignName":"Spring 2026 Landing Page","advertisingCampaign":"Google Ads — Q3","developerName":"Sobha Realty","website":"provident.ae","pageUrl":"https://prov.ae/en/dubai-marina?utm_source=google\u0026utm_medium=cpc","pathLocale":"en","gclid":"Cj0KCQjw1234567890","fbclid":"IwAR2abcdefghijklmno","utmSource":"google","utmMedium":"cpc","utmCampaign":"spring-2026","utmTerm":"dubai marina apartments","utmContent":"hero-cta","formName":"contact-popup-form","adsetName":"test ww","referrer":"https://sobha-city.provident.ae/?utm_source=Google+Ads","ipAddress":"217.165.113.16","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36","submittedAt":"2026-07-27T13:45:31.728Z","localeCountry":"AE","assignedBy":"agent@providentestate.com","metaFacebook":{"metaLeadId":"7636865386872307975","metaCreatedAt":"2026-05-06T19:38:09.000Z","platform":"facebook","adId":"120000000000","adName":"Marina Launch — Video","adType":"Video","adgroupId":"930000000000","adgroupName":"TARGETED","metaCampaignId":"230000000000","metaCampaignName":"Marina Q2","formId":"550000000000","formName":"Marina Callback","adAccountId":"act_123456789","businessAccountId":"456789123","sourceAction":"Form","finalPageName":"Thank You","customFields":{"هل ترغب في حضور هذا المعرض الحصري؟":"نعم","Preferred call time":"Evening","Ready to buy":"Within 3 months"}},"quiz":{"quizKey":"off-plan-investor-2026","quizName":"Off-plan investor quiz","locale":"ar","version":"3","answers":[{"questionKey":"budget","questionLabel":"ما هي ميزانيتك؟","optionKey":"2m-5m","answerLabel":"٢-٥ مليون","value":2000000,"currency":"AED"},{"questionKey":"purchase_date","questionLabel":"متى ترغب في الشراء؟","value":"2026-12-01"},{"questionKey":"interests","questionLabel":"ما الذي يهمك؟","optionKey":["villa","townhouse"],"answerLabel":["فيلا","تاون هاوس"]}]},"integrationRef":"make:meta-leadgen-eu"}},"metaLeadAd":{"title":"metaLeadAd","value":{"leadPhones":["+971559876543"],"leadEmails":["sara@example.com"],"leadFirstName":"Sara","leadLastName":"Ahmad","leadType":"Primary","source":"Facebook","eventType":"Submit Form","marketingType":"Paid","campaignName":"Marina Q2","marketSegment":"Luxury","agentCategory":"A","languages":["ar"],"metaFacebook":{"metaLeadId":"7636865386872307975","metaCreatedAt":"2026-05-06T19:38:09.000Z","platform":"facebook","adId":"120000000000","adName":"Marina Launch — Video","adType":"Video","adgroupId":"930000000000","adgroupName":"TARGETED","metaCampaignId":"230000000000","metaCampaignName":"Marina Q2","formId":"550000000000","formName":"Marina Callback","adAccountId":"act_123456789","businessAccountId":"456789123","sourceAction":"Form","finalPageName":"Thank You","customFields":{"هل ترغب في حضور هذا المعرض الحصري؟":"نعم","Preferred call time":"Evening"}},"integrationRef":"make:meta-leadgen-eu"}},"quizSubmission":{"title":"quizSubmission","description":"A quiz answered in Arabic. The option keys are identical to the English version of the same quiz, so both resolve to the same answer in reporting.","value":{"leadPhones":["+971501234567"],"leadFirstName":"John","source":"Website","website":"provident.ae","quiz":{"quizKey":"off-plan-investor-2026","quizName":"Off-plan investor quiz","locale":"ar","version":"3","answers":[{"questionKey":"budget","questionLabel":"ما هي ميزانيتك؟","optionKey":"2m-5m","answerLabel":"٢-٥ مليون","value":2000000,"currency":"AED"},{"questionKey":"purchase_date","questionLabel":"متى ترغب في الشراء؟","value":"2026-12-01"},{"questionKey":"interests","questionLabel":"ما الذي يهمك؟","optionKey":["villa","townhouse"],"answerLabel":["فيلا","تاون هاوس"]}]},"integrationRef":"make:meta-leadgen-eu"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"f8d0a990-4958-45e5-b646-0ecf2ead4b7a":{"description":"Accepted. EITHER a new lead (CreatedLead) OR an enquiry merged into an existing one (MergedLead) — branch on `merged` before reading any other field. A CreatedLead body carries many further fields that are not part of this contract.","headers":{"X-RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the counter resets (end of the UTC day).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"A newly created lead (`merged` is false). The response actually carries the whole lead record; only the properties listed here are contractual and safe to depend on.","properties":{"id":{"type":"string","format":"uuid","description":"UUID of the created lead. Store this against your own submission record.","uniqueKey":"oneOf.0.id","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","format":"uuid","description":"UUID of the contact the lead was attached to (matched or newly created).","uniqueKey":"oneOf.0.contactId","typeLabel":"string\u003cuuid>"},"intakeUnresolved":{"oneOf":[{"type":"object","additionalProperties":{"type":"string","uniqueKey":"oneOf.0.intakeUnresolved.oneOf.0.additionalProperties","typeLabel":"string"},"description":"Map of field name → the original value you sent, for every lookup value that could not be matched. `null` when everything resolved. Quiz answers that could not be read appear namespaced as `quiz.\u003cquizKey>.\u003cquestionKey>` — unlike a failed lookup, the answer IS still stored on the lead, and a Provident admin can map the value once so every future submission of it resolves automatically.","example":{"source":"Web-Site","quiz.off-plan-investor-2026.free_budget":"somewhere around a lot"},"uniqueKey":"oneOf.0.intakeUnresolved.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":{"type":"string","uniqueKey":"oneOf.0.intakeUnresolved.oneOf.1.additionalProperties","typeLabel":"string"},"description":"Map of field name → the original value you sent, for every lookup value that could not be matched. `null` when everything resolved. Quiz answers that could not be read appear namespaced as `quiz.\u003cquizKey>.\u003cquestionKey>` — unlike a failed lookup, the answer IS still stored on the lead, and a Provident admin can map the value once so every future submission of it resolves automatically.","example":{"source":"Web-Site","quiz.off-plan-investor-2026.free_budget":"somewhere around a lot"},"uniqueKey":"oneOf.0.intakeUnresolved.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.intakeUnresolved","typeLabel":"object | null"},"needsIntakeReview":{"type":"boolean","description":"`true` when `intakeUnresolved` is non-empty.","uniqueKey":"oneOf.0.needsIntakeReview","typeLabel":"boolean"},"merged":{"type":"boolean","enum":[false],"description":"Always `false` here. `true` means the enquiry was folded into an existing lead — see MergedLead.","uniqueKey":"oneOf.0.merged","typeLabel":"enum\u003cboolean>"},"isRepeatLead":{"type":"boolean","description":"True when this person already had a lead older than the merge window, or a recent lead in a different funnel. The lead is routed and worked normally; this is a marker, not a routing instruction.","uniqueKey":"oneOf.0.isRepeatLead","typeLabel":"boolean"},"repeatOfLeadId":{"oneOf":[{"type":"string","format":"uuid","description":"The earlier lead's id when `isRepeatLead` is true, otherwise null.","uniqueKey":"oneOf.0.repeatOfLeadId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"The earlier lead's id when `isRepeatLead` is true, otherwise null.","uniqueKey":"oneOf.0.repeatOfLeadId.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.repeatOfLeadId","typeLabel":"string\u003cuuid> | null"},"isAgentEnquiry":{"type":"boolean","description":"True when the enquiry was recognised as coming from a competing agent rather than a buyer. The lead is still created and worked; the flag keeps it out of lead-volume and cost-per-lead reporting.","uniqueKey":"oneOf.0.isAgentEnquiry","typeLabel":"boolean"},"agentEnquiryReason":{"oneOf":[{"type":"string","enum":["known_agent","prior_lead","competitor_domain","manual",null],"description":"Why, when `isAgentEnquiry` is true; null otherwise.","uniqueKey":"oneOf.0.agentEnquiryReason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["known_agent","prior_lead","competitor_domain","manual",null],"description":"Why, when `isAgentEnquiry` is true; null otherwise.","uniqueKey":"oneOf.0.agentEnquiryReason.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.agentEnquiryReason","typeLabel":"enum\u003cstring> | null"},"createdAt":{"type":"string","format":"date-time","uniqueKey":"oneOf.0.createdAt","typeLabel":"string\u003cdate-time>"},"assignedTo":{"oneOf":[{"type":"object","description":"The agent the lead landed on. NULL means 'not decided yet' — the routing engine runs after this response is sent — NOT 'nobody'. Reliable only when you sent referenceNo/listingId or assignedBy; otherwise use GET /public/leads/{id}/assignment or the lead.assigned webhook.","required":["id","slug","name","email","phone","whatsappPhone","active"],"properties":{"id":{"type":"string","format":"uuid","description":"Portal user id. The stable, immutable identifier for an agent — key your records on this.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.id","typeLabel":"string\u003cuuid>"},"slug":{"oneOf":[{"type":"string","description":"Website profile segment (/team/\u003cslug>/), or null if not published. Human-readable but admin-editable; `id` is not.","example":"sarah-ahmed","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.slug.oneOf.0","typeLabel":"string"},{"type":"null","description":"Website profile segment (/team/\u003cslug>/), or null if not published. Human-readable but admin-editable; `id` is not.","example":"sarah-ahmed","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.slug.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.slug","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","description":"Display name. Safe to say to a customer.","example":"Sarah Ahmed","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Display name. Safe to say to a customer.","example":"Sarah Ahmed","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.name","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","description":"Work email.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.email.oneOf.0","typeLabel":"string"},{"type":"null","description":"Work email.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.email.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.email","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","description":"Work phone.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.phone.oneOf.0","typeLabel":"string"},{"type":"null","description":"Work phone.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.phone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.phone","typeLabel":"string | null"},"whatsappPhone":{"oneOf":[{"type":"string","description":"The number to open a WhatsApp chat on. Read this field rather than reusing `phone` — they differ for some agents.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.whatsappPhone.oneOf.0","typeLabel":"string"},{"type":"null","description":"The number to open a WhatsApp chat on. Read this field rather than reusing `phone` — they differ for some agents.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.whatsappPhone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.whatsappPhone","typeLabel":"string | null"},"active":{"type":"boolean","description":"False for a deactivated account. Do not route work to them.","isRequired":true,"uniqueKey":"oneOf.0.assignedTo.oneOf.0.active","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.assignedTo.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"oneOf.0.assignedTo.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.assignedTo","typeLabel":"object | null"},"comments":{"oneOf":[{"type":"object","description":"What became of the `comments[]` you sent; null when you sent none.","properties":{"added":{"type":"integer","description":"Comments written to the lead's thread.","example":3,"uniqueKey":"oneOf.0.comments.oneOf.0.added","typeLabel":"integer"},"skipped":{"type":"integer","description":"Comments in the array that were NOT written — past the cap of 5, or empty. READ THIS: these are customer messages that were not kept. Send them again in a follow-up PUT.","example":0,"uniqueKey":"oneOf.0.comments.oneOf.0.skipped","typeLabel":"integer"}},"uniqueKey":"oneOf.0.comments.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"oneOf.0.comments.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.comments","typeLabel":"object | null"},"resume":{"oneOf":[{"type":"object","description":"What became of the `resumeUrl` you sent; null when you sent none.","required":["status","error"],"properties":{"status":{"type":"string","enum":["pending","failed","cleared"],"description":"`pending` — accepted and being downloaded; nothing more to do. `failed` — unusable on sight, see `error`; send a corrected link with PUT. `cleared` — update only: you sent `null` and the CV was removed. A pending download can still fail later; that is recorded on the lead for the recruiter, not reported to you.","example":"pending","isRequired":true,"uniqueKey":"oneOf.0.resume.oneOf.0.status","typeLabel":"enum\u003cstring>"},"error":{"oneOf":[{"type":"string","description":"Why the link was refused when `status` is `failed`; null otherwise.","example":null,"isRequired":true,"uniqueKey":"oneOf.0.resume.oneOf.0.error.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the link was refused when `status` is `failed`; null otherwise.","example":null,"isRequired":true,"uniqueKey":"oneOf.0.resume.oneOf.0.error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.resume.oneOf.0.error","typeLabel":"string | null"}},"uniqueKey":"oneOf.0.resume.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"oneOf.0.resume.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.resume","typeLabel":"object | null"}},"additionalProperties":true,"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"The enquiry was folded into a lead on the same funnel created inside the merge window (~24h) rather than creating a new one; an enquiry for a different funnel always becomes its own lead. The status is still 201 but the body is ONLY these few fields: there is no contactId, intakeUnresolved, needsIntakeReview or createdAt. `id` is a lead you already have — do not record it as a second submission. `assignedTo` is usually populated here (the lead already exists, so its owner is already known).","required":["id","merged","matchedOn"],"properties":{"id":{"type":"string","format":"uuid","description":"UUID of the EXISTING lead the enquiry was folded into.","isRequired":true,"uniqueKey":"oneOf.1.id","typeLabel":"string\u003cuuid>"},"merged":{"type":"boolean","enum":[true],"description":"Always `true` here.","isRequired":true,"uniqueKey":"oneOf.1.merged","typeLabel":"enum\u003cboolean>"},"matchedOn":{"type":"string","enum":["phone","email"],"description":"Which identifier matched the existing lead. Phone is checked before email.","isRequired":true,"uniqueKey":"oneOf.1.matchedOn","typeLabel":"enum\u003cstring>"},"assignedTo":{"oneOf":[{"type":"object","description":"The agent who already owns the lead the enquiry was folded into, or null if it has none.","required":["id","slug","name","email","phone","whatsappPhone","active"],"properties":{"id":{"type":"string","format":"uuid","description":"Portal user id. The stable, immutable identifier for an agent — key your records on this.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.id","typeLabel":"string\u003cuuid>"},"slug":{"oneOf":[{"type":"string","description":"Website profile segment (/team/\u003cslug>/), or null if not published. Human-readable but admin-editable; `id` is not.","example":"sarah-ahmed","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.slug.oneOf.0","typeLabel":"string"},{"type":"null","description":"Website profile segment (/team/\u003cslug>/), or null if not published. Human-readable but admin-editable; `id` is not.","example":"sarah-ahmed","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.slug.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.slug","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","description":"Display name. Safe to say to a customer.","example":"Sarah Ahmed","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Display name. Safe to say to a customer.","example":"Sarah Ahmed","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.name","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","description":"Work email.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.email.oneOf.0","typeLabel":"string"},{"type":"null","description":"Work email.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.email.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.email","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","description":"Work phone.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.phone.oneOf.0","typeLabel":"string"},{"type":"null","description":"Work phone.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.phone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.phone","typeLabel":"string | null"},"whatsappPhone":{"oneOf":[{"type":"string","description":"The number to open a WhatsApp chat on. Read this field rather than reusing `phone` — they differ for some agents.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.whatsappPhone.oneOf.0","typeLabel":"string"},{"type":"null","description":"The number to open a WhatsApp chat on. Read this field rather than reusing `phone` — they differ for some agents.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.whatsappPhone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.whatsappPhone","typeLabel":"string | null"},"active":{"type":"boolean","description":"False for a deactivated account. Do not route work to them.","isRequired":true,"uniqueKey":"oneOf.1.assignedTo.oneOf.0.active","typeLabel":"boolean"}},"uniqueKey":"oneOf.1.assignedTo.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"oneOf.1.assignedTo.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.assignedTo","typeLabel":"object | null"},"comments":{"oneOf":[{"type":"object","description":"Any `comments[]` you sent are written to the SURVIVING lead — the conversation belongs on the lead the customer actually has. Null when you sent none.","properties":{"added":{"type":"integer","description":"Comments written to the lead's thread.","example":3,"uniqueKey":"oneOf.1.comments.oneOf.0.added","typeLabel":"integer"},"skipped":{"type":"integer","description":"Comments in the array that were NOT written — past the cap of 5, or empty. READ THIS: these are customer messages that were not kept. Send them again in a follow-up PUT.","example":0,"uniqueKey":"oneOf.1.comments.oneOf.0.skipped","typeLabel":"integer"}},"uniqueKey":"oneOf.1.comments.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"oneOf.1.comments.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.comments","typeLabel":"object | null"},"resume":{"oneOf":[{"type":"object","description":"A CV you sent is attached to the surviving lead, replacing any it had; null when you sent none.","required":["status","error"],"properties":{"status":{"type":"string","enum":["pending","failed","cleared"],"description":"`pending` — accepted and being downloaded; nothing more to do. `failed` — unusable on sight, see `error`; send a corrected link with PUT. `cleared` — update only: you sent `null` and the CV was removed. A pending download can still fail later; that is recorded on the lead for the recruiter, not reported to you.","example":"pending","isRequired":true,"uniqueKey":"oneOf.1.resume.oneOf.0.status","typeLabel":"enum\u003cstring>"},"error":{"oneOf":[{"type":"string","description":"Why the link was refused when `status` is `failed`; null otherwise.","example":null,"isRequired":true,"uniqueKey":"oneOf.1.resume.oneOf.0.error.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why the link was refused when `status` is `failed`; null otherwise.","example":null,"isRequired":true,"uniqueKey":"oneOf.1.resume.oneOf.0.error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.resume.oneOf.0.error","typeLabel":"string | null"}},"uniqueKey":"oneOf.1.resume.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"oneOf.1.resume.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.resume","typeLabel":"object | null"}},"additionalProperties":false,"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"createdLead":{"title":"createdLead","value":{"id":"a1b2c3d4-5566-7788-99aa-bbccddeeff00","merged":false,"contactId":"0f1e2d3c-4455-6677-8899-aabbccddeeff","intakeUnresolved":{"advertisingCampaign":"Google Ads — Q3"},"needsIntakeReview":true,"isRepeatLead":false,"repeatOfLeadId":null,"isAgentEnquiry":false,"agentEnquiryReason":null,"createdAt":"2026-07-27T06:31:04.512Z","assignedTo":null}},"repeatLead":{"title":"repeatLead","value":{"id":"b2c3d4e5-6677-8899-aabb-ccddeeff0011","merged":false,"contactId":"0f1e2d3c-4455-6677-8899-aabbccddeeff","intakeUnresolved":null,"needsIntakeReview":false,"isRepeatLead":true,"repeatOfLeadId":"a1b2c3d4-5566-7788-99aa-bbccddeeff00","isAgentEnquiry":false,"agentEnquiryReason":null,"createdAt":"2026-07-29T09:02:11.004Z"}},"mergedEnquiry":{"title":"mergedEnquiry","value":{"id":"a1b2c3d4-5566-7788-99aa-bbccddeeff00","merged":true,"matchedOn":"phone"}}},"exampleType":"examples"}},"exampleType":"examples"},"6069840c-3d80-4213-8c32-bfd85f1b89ce":{"description":"Neither a phone nor an email was supplied, or the body was not valid JSON. Do not retry unchanged.","content":{"application/json":{"schema":{"type":"object","description":"Common error envelope used by every endpoint.","properties":{"statusCode":{"type":"integer","example":400,"uniqueKey":"statusCode","typeLabel":"integer"},"code":{"type":"string","description":"Stable machine-readable error code — branch on this, not on `message`.","example":"BAD_REQUEST","uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","items":{"type":"string","uniqueKey":"errors.items.[INDEX]","typeLabel":"string"},"description":"Present on 422 only: one entry per field that failed validation.","uniqueKey":"errors","typeLabel":"string[]"},"details":{"type":"object","additionalProperties":true,"description":"Optional structured extras attached by the failing handler.","uniqueKey":"details","typeLabel":"object"},"path":{"type":"string","example":"/v2/public/leads","uniqueKey":"path","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"noContactPoint":{"title":"noContactPoint","value":{"statusCode":400,"code":"BAD_REQUEST","message":"Provide at least one value in leadPhones or leadEmails","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"}},"invalidJson":{"title":"invalidJson","value":{"statusCode":400,"code":"INVALID_JSON","message":"Invalid JSON payload","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"20dd682c-47b6-4c50-be0d-dda02c1ddc14":{"description":"Missing, invalid, revoked or expired bearer token. Fetch a new token and retry once.","content":{"application/json":{"schema":{"type":"object","description":"Common error envelope used by every endpoint.","properties":{"statusCode":{"type":"integer","example":400,"uniqueKey":"statusCode","typeLabel":"integer"},"code":{"type":"string","description":"Stable machine-readable error code — branch on this, not on `message`.","example":"BAD_REQUEST","uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","items":{"type":"string","uniqueKey":"errors.items.[INDEX]","typeLabel":"string"},"description":"Present on 422 only: one entry per field that failed validation.","uniqueKey":"errors","typeLabel":"string[]"},"details":{"type":"object","additionalProperties":true,"description":"Optional structured extras attached by the failing handler.","uniqueKey":"details","typeLabel":"object"},"path":{"type":"string","example":"/v2/public/leads","uniqueKey":"path","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"missing":{"title":"missing","value":{"statusCode":401,"code":"OAUTH_TOKEN_MISSING","message":"OAuth token missing","path":"/v2/public/leads","timestamp":"2026-07-27T06:28:41.816Z"}},"expired":{"title":"expired","value":{"statusCode":401,"code":"OAUTH_TOKEN_EXPIRED","message":"OAuth access token expired","path":"/v2/public/leads","timestamp":"2026-07-27T06:28:41.816Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"78d6d049-b38a-49ef-9d9c-051f3e0c5ded":{"description":"The caller's IP address is not on the allowlist configured for this client.","content":{"application/json":{"schema":{"type":"object","description":"Common error envelope used by every endpoint.","properties":{"statusCode":{"type":"integer","example":400,"uniqueKey":"statusCode","typeLabel":"integer"},"code":{"type":"string","description":"Stable machine-readable error code — branch on this, not on `message`.","example":"BAD_REQUEST","uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","items":{"type":"string","uniqueKey":"errors.items.[INDEX]","typeLabel":"string"},"description":"Present on 422 only: one entry per field that failed validation.","uniqueKey":"errors","typeLabel":"string[]"},"details":{"type":"object","additionalProperties":true,"description":"Optional structured extras attached by the failing handler.","uniqueKey":"details","typeLabel":"object"},"path":{"type":"string","example":"/v2/public/leads","uniqueKey":"path","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"example":{"statusCode":403,"code":"FORBIDDEN","message":"Access denied. Your IP address (203.0.113.10) is not permitted.","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"},"examples":{"Example":{"title":"Example","value":{"statusCode":403,"code":"FORBIDDEN","message":"Access denied. Your IP address (203.0.113.10) is not permitted.","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"d67bec96-384c-475c-802b-531d97b70021":{"description":"Request quota for this client exceeded. Wait `Retry-After` seconds, then resume.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Seconds until the counter resets (end of the UTC day).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","description":"Common error envelope used by every endpoint.","properties":{"statusCode":{"type":"integer","example":400,"uniqueKey":"statusCode","typeLabel":"integer"},"code":{"type":"string","description":"Stable machine-readable error code — branch on this, not on `message`.","example":"BAD_REQUEST","uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","items":{"type":"string","uniqueKey":"errors.items.[INDEX]","typeLabel":"string"},"description":"Present on 422 only: one entry per field that failed validation.","uniqueKey":"errors","typeLabel":"string[]"},"details":{"type":"object","additionalProperties":true,"description":"Optional structured extras attached by the failing handler.","uniqueKey":"details","typeLabel":"object"},"path":{"type":"string","example":"/v2/public/leads","uniqueKey":"path","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"example":{"statusCode":429,"code":"RATE_LIMITED","message":"Too Many Requests","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"},"examples":{"Example":{"title":"Example","value":{"statusCode":429,"code":"RATE_LIMITED","message":"Too Many Requests","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"4934c5e2-e63a-41bc-b596-fa2d7f2151d2":{"description":"Server-side failure. Retry with exponential backoff.","content":{"application/json":{"schema":{"type":"object","description":"Common error envelope used by every endpoint.","properties":{"statusCode":{"type":"integer","example":400,"uniqueKey":"statusCode","typeLabel":"integer"},"code":{"type":"string","description":"Stable machine-readable error code — branch on this, not on `message`.","example":"BAD_REQUEST","uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","items":{"type":"string","uniqueKey":"errors.items.[INDEX]","typeLabel":"string"},"description":"Present on 422 only: one entry per field that failed validation.","uniqueKey":"errors","typeLabel":"string[]"},"details":{"type":"object","additionalProperties":true,"description":"Optional structured extras attached by the failing handler.","uniqueKey":"details","typeLabel":"object"},"path":{"type":"string","example":"/v2/public/leads","uniqueKey":"path","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"","typeLabel":"object"},"example":{"statusCode":500,"code":"INTERNAL_ERROR","message":"Internal server error","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"},"examples":{"Example":{"title":"Example","value":{"statusCode":500,"code":"INTERNAL_ERROR","message":"Internal server error","path":"/v2/public/leads","timestamp":"2026-07-27T06:31:04.512Z"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"976b45c2-29ce-41b3-a45d-495b4b7a91e7":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Opaque","description":"The `access_token` returned by `POST /oauth2/token`, sent as `Authorization: Bearer \u003caccess_token>`. It is an opaque string, not a JWT.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"7bf50989-7c21-464a-9a4e-ab762558db15":{"url":"https://devapi.prov.ae/v2","description":"Staging / development — build and test here"},"74af751c-6a6f-4aa0-bffc-fbb0a527c885":{"url":"https://prodapi.prov.ae/v2","description":"Production — live leads"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"Opaque","description":"The `access_token` returned by `POST /oauth2/token`, sent as `Authorization: Bearer \u003caccess_token>`. It is an opaque string, not a JWT.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"The `access_token` returned by `POST /oauth2/token`, sent as `Authorization: Bearer \u003caccess_token>`. It is an opaque string, not a JWT.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"provident-estate","siteName":"Provident Lead Intake API","title":"Create a CRM lead - Provident Lead Intake API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T05:51:49.131Z","originalFileLocation":"api-reference/lead-intake/create-a-crm-lead.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a lead in the Provident CRM and attaches it to a contact. Only hard requirement: at least one entry in leadPhones or leadEmails. Contact resolution — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (+971501234567) for reliable matching. Lookup fields (leadType, funnel, source, subSource, eventType, marketingType, campaignName, advertisingCampaign, website, currency, localeCountry, location/locationId, areaOfInterest, propertyTypeInterest, marketSegment, agentCategory, buyerType, languages, assignedBy, distributionType, listingId/referenceNo) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in intakeUnresolved. Which pipeline the lead lands in is funnel. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send Leasing, Show Room, PvH, … for an enquiry that belongs to another business line. Extra fields not defined in this schema are accepted and stored verbatim with the lead rather than rejected. Not idempotent: the same payload posted twice creates two leads. Quiz answers — landing pages that ask a question set can send a quiz object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable questionKey per question and optionKey per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (2 million, 2,000,000, AED 2M, ٢ مليون → 2000000); ambiguous dates like 03/04/2026 are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Provident Lead Intake API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a CRM lead - Provident Lead Intake API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a lead in the Provident CRM and attaches it to a contact. Only hard requirement: at least one entry in leadPhones or leadEmails. Contact resolution — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (+971501234567) for reliable matching. Lookup fields (leadType, funnel, source, subSource, eventType, marketingType, campaignName, advertisingCampaign, website, currency, localeCountry, location/locationId, areaOfInterest, propertyTypeInterest, marketSegment, agentCategory, buyerType, languages, assignedBy, distributionType, listingId/referenceNo) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in intakeUnresolved. Which pipeline the lead lands in is funnel. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send Leasing, Show Room, PvH, … for an enquiry that belongs to another business line. Extra fields not defined in this schema are accepted and stored verbatim with the lead rather than rejected. Not idempotent: the same payload posted twice creates two leads. Quiz answers — landing pages that ask a question set can send a quiz object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable questionKey per question and optionKey per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (2 million, 2,000,000, AED 2M, ٢ مليون → 2000000); ambiguous dates like 03/04/2026 are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Provident Lead Intake API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://provident-estate.mintlify.site/_mintlify/api/og/v2?division=Lead+intake\u0026amp;title=Create+a+CRM+lead\u0026amp;description=Creates+a+lead+in+the+Provident+CRM+and+attaches+it+to+a+contact.%0A%0A**Only+hard+requirement%3A**+at+least+one+entry+in+%60leadPhones%60+or+%60leadEmails%60.%0A%0A**Contact+res\u0026amp;theme=fe9ce653339d0b443bb2cdf8\u0026amp;signature=3df91356cd96cdd34d1e4b72aab1e0021cc25b4fe3eb8a995670827e22142c99\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a CRM lead - Provident Lead Intake API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a lead in the Provident CRM and attaches it to a contact. Only hard requirement: at least one entry in leadPhones or leadEmails. Contact resolution — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (+971501234567) for reliable matching. Lookup fields (leadType, funnel, source, subSource, eventType, marketingType, campaignName, advertisingCampaign, website, currency, localeCountry, location/locationId, areaOfInterest, propertyTypeInterest, marketSegment, agentCategory, buyerType, languages, assignedBy, distributionType, listingId/referenceNo) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in intakeUnresolved. Which pipeline the lead lands in is funnel. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send Leasing, Show Room, PvH, … for an enquiry that belongs to another business line. Extra fields not defined in this schema are accepted and stored verbatim with the lead rather than rejected. Not idempotent: the same payload posted twice creates two leads. Quiz answers — landing pages that ask a question set can send a quiz object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable questionKey per question and optionKey per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (2 million, 2,000,000, AED 2M, ٢ مليون → 2000000); ambiguous dates like 03/04/2026 are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://provident-estate.mintlify.site/_mintlify/api/og/v2?division=Lead+intake\u0026amp;title=Create+a+CRM+lead\u0026amp;description=Creates+a+lead+in+the+Provident+CRM+and+attaches+it+to+a+contact.%0A%0A**Only+hard+requirement%3A**+at+least+one+entry+in+%60leadPhones%60+or+%60leadEmails%60.%0A%0A**Contact+res\u0026amp;theme=fe9ce653339d0b443bb2cdf8\u0026amp;signature=3df91356cd96cdd34d1e4b72aab1e0021cc25b4fe3eb8a995670827e22142c99\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/provident-estate/p7zVt5D_ai6joA4I/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Provident Lead Intake API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2f4960\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/lead-intake/create-a-crm-lead.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.prov.ae/#organization\",\"name\":\"Provident Lead Intake API\",\"url\":\"https://docs.prov.ae\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/provident-estate/rDaG7vP82bnppp3b/logo/light.svg?fit=max\u0026auto=format\u0026n=rDaG7vP82bnppp3b\u0026q=85\u0026s=14fa412d7a470cfd31a4a7a429fd2fe2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.prov.ae#website\",\"name\":\"Provident Lead Intake API\",\"url\":\"https://docs.prov.ae\",\"publisher\":{\"@id\":\"https://docs.prov.ae/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead#webpage\",\"url\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead\",\"name\":\"Create a CRM lead\",\"description\":\"Creates a lead in the Provident CRM and attaches it to a contact. Only hard requirement: at least one entry in leadPhones or leadEmails. Contact resolution — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (+971501234567) for reliable matching. Lookup fields (leadType, funnel, source, subSource, eventType, marketingType, campaignName, advertisingCampaign, website, currency, localeCountry, location/locationId, areaOfInterest, propertyTypeInterest, marketSegment, agentCategory, buyerType, languages, assignedBy, distributionType, listingId/referenceNo) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in intakeUnresolved. Which pipeline the lead lands in is funnel. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send Leasing, Show Room, PvH, … for an enquiry that belongs to another business line. Extra fields not defined in this schema are accepted and stored verbatim with the lead rather than rejected. Not idempotent: the same payload posted twice creates two leads. Quiz answers — landing pages that ask a question set can send a quiz object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable questionKey per question and optionKey per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (2 million, 2,000,000, AED 2M, ٢ مليون → 2000000); ambiguous dates like 03/04/2026 are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.\",\"dateModified\":\"2026-11-13T05:51:49.131Z\",\"isPartOf\":{\"@id\":\"https://docs.prov.ae#website\"},\"breadcrumb\":{\"@id\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Provident Lead Intake API\",\"item\":\"https://docs.prov.ae\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a CRM lead\",\"item\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead#apireference\",\"headline\":\"Create a CRM lead\",\"name\":\"Create a CRM lead\",\"description\":\"Creates a lead in the Provident CRM and attaches it to a contact. Only hard requirement: at least one entry in leadPhones or leadEmails. Contact resolution — an existing contact is matched by phone first, then by email; if nothing matches, a new contact is created from the supplied name/company/phone/email fields. Send phone numbers in E.164 (+971501234567) for reliable matching. Lookup fields (leadType, funnel, source, subSource, eventType, marketingType, campaignName, advertisingCampaign, website, currency, localeCountry, location/locationId, areaOfInterest, propertyTypeInterest, marketSegment, agentCategory, buyerType, languages, assignedBy, distributionType, listingId/referenceNo) are matched case-insensitively after trimming against lists configured in the CRM. An unmatched value never fails the request — the lead is created and the original text is returned in intakeUnresolved. Which pipeline the lead lands in is funnel. Omit it and the lead goes to the main sales pipeline, which is where every lead posted to this API went before the field existed; send Leasing, Show Room, PvH, … for an enquiry that belongs to another business line. Extra fields not defined in this schema are accepted and stored verbatim with the lead rather than rejected. Not idempotent: the same payload posted twice creates two leads. Quiz answers — landing pages that ask a question set can send a quiz object. Its questions and options register themselves on first sight, so a new quiz needs no API change. Send a stable questionKey per question and optionKey per dropdown answer: those are the only language-independent identity an answer has, and without them each language registers as a separate question. Free-text numbers are parsed best-effort (2 million, 2,000,000, AED 2M, ٢ مليون → 2000000); ambiguous dates like 03/04/2026 are deliberately refused rather than guessed. Anything unreadable is kept verbatim and flagged, never dropped.\",\"url\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead\",\"mainEntityOfPage\":{\"@id\":\"https://docs.prov.ae/api-reference/lead-intake/create-a-crm-lead#webpage\"},\"dateModified\":\"2026-11-13T05:51:49.131Z\",\"publisher\":{\"@id\":\"https://docs.prov.ae/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.prov.ae#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Provident Lead Intake API\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Provident Lead Intake API\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/lead-intake/create-a-crm-lead.md","siteName":"Provident Lead Intake API","nav":{"global":null,"tabs":[{"tab":"Guide","pages":[{"title":"Guide","href":"/introduction"}]},{"tab":"API Reference","groups":[{"group":"Authentication","pages":[{"title":"Get an access token (client credentials)","description":"Exchanges your `client_id` and `client_secret` for a short-lived opaque bearer token. `client_credentials` is the only supported grant type.\n\nCache the token in memory for `expires_in` seconds (refresh ~60 seconds early) — token requests count against your rate limit.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /oauth2/token","href":"/api-reference/authentication/get-an-access-token-client-credentials"}]},{"group":"Lead intake","pages":[{"title":"Create a CRM lead","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/leads","href":"/api-reference/lead-intake/create-a-crm-lead"}]},{"group":"Reference data","pages":[{"title":"Locations, developers, property types and statuses","description":"Returns every lookup list in one call. There is no standalone locations endpoint — this is where locations come from.\n\nUse `filters.location.values[].id` as the lead's `locationId` (or the `name` as `location`) and `filters.propertyType.values[].name` as `propertyTypeInterest` so those values resolve instead of landing in `intakeUnresolved`. The UUIDs are the ones accepted by the project list filters.\n\nThese lists change rarely — cache them (a daily refresh is plenty) rather than calling per lead, since reference reads share the lead endpoint's rate limit.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/projects/filters","href":"/api-reference/reference-data/locations-developers-property-types-and-statuses"},{"title":"Search communities and areas","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/locations/search","href":"/api-reference/reference-data/search-communities-and-areas"},{"title":"Get one community or area","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/locations/{id}","href":"/api-reference/reference-data/get-one-community-or-area"},{"title":"List developers","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/developers","href":"/api-reference/reference-data/list-developers"},{"title":"Search developers","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/developers/search","href":"/api-reference/reference-data/search-developers"},{"title":"Get one developer","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/developers/{id}","href":"/api-reference/reference-data/get-one-developer"},{"title":"List published projects","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/projects","href":"/api-reference/reference-data/list-published-projects"},{"title":"Published projects inside a bounding box","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/projects/map","href":"/api-reference/reference-data/published-projects-inside-a-bounding-box"},{"title":"Get one published project","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/projects/{id}","href":"/api-reference/reference-data/get-one-published-project"},{"title":"List project statuses","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/project-statuses","href":"/api-reference/reference-data/list-project-statuses"}]},{"group":"Lead follow-up","pages":[{"title":"Update a lead — details that arrive later","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json put /public/leads/{id}","href":"/api-reference/lead-follow-up/update-a-lead-—-details-that-arrive-later"},{"title":"Update a lead (alias of PUT)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /public/leads/{id}","href":"/api-reference/lead-follow-up/update-a-lead-alias-of-put"},{"title":"Who a lead was assigned to","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /public/leads/{id}/assignment","href":"/api-reference/lead-follow-up/who-a-lead-was-assigned-to"},{"title":"Record the agent's response time on a lead","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/leads/{id}/response-time","href":"/api-reference/lead-follow-up/record-the-agents-response-time-on-a-lead"}]},{"group":"Do Not Call Registry","pages":[{"title":"Check numbers against the Do Not Call Registry","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/dncr/check","href":"/api-reference/do-not-call-registry/check-numbers-against-the-do-not-call-registry"}]},{"group":"Phone screening","pages":[{"title":"Screen numbers against the broker register","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/phone-screening/brokers","href":"/api-reference/phone-screening/screen-numbers-against-the-broker-register"},{"title":"Screen numbers against Provident staff","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/phone-screening/employees","href":"/api-reference/phone-screening/screen-numbers-against-provident-staff"},{"title":"Screen numbers for DNCR, other agents, and our staff","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/phone-screening/check","href":"/api-reference/phone-screening/screen-numbers-for-dncr-other-agents-and-our-staff"}]},{"group":"WhatsApp check","pages":[{"title":"Check whether numbers are on WhatsApp","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /public/whatsapp-check","href":"/api-reference/whatsapp-check/check-whether-numbers-are-on-whatsapp"}]}]}]},"basePath":"","title":"Create a CRM lead - Provident Lead Intake API","buildId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","deploymentId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-NXj-Rqjv.js","utils-m0thOP-_.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-D13EKcfm.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema--XTdfsEb.js","snippetPresets-D3s4lmAH.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-ChURybxL.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DL8CiXq2.js","shallow-DI2-YB2E.js","getApiPlaygroundDisplay-DxbW7b_y.js","CodeSnippet-CiNYS0pP.js","CodeSnippets-BT87bThu.js","Page-DSpdRuhM.js","getPastedJson-F_g_IrFQ.js","icon-CCIG5BAs.js","MethodPill-DY3E0jwx.js","DuplicateIcon-BN88xnEg.js","createIcon-VCCc5HO5.js","DynamicMarkdown-CaSwclgK.js","SectionHeading-DXV8nWhc.js","axios-vUo_bRtp.js","Markdown-CV32Re6G.js","clsx-5ydLOnhV.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-pFDdfjRe.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BUGO5bPJ.js"]}