Update a lead
/v1/leads/{lead_id}Updates the fields you send and leaves the rest unchanged. An email is saved trimmed and lowercased. Changing the email or LinkedIn URL to one another lead already has answers 409 LEAD_ALREADY_EXISTS, and to one on your do-not-contact list answers 409 LEAD_SUPPRESSED.
Fields sent as null are ignored, so this endpoint can't clear a field. custom_fields replaces the lead's whole custom fields object rather than merging into it.
Headers
AuthorizationstringRequiredBearerfollowed by a space and your API key, for exampleBearer vk_….
Path parameters
lead_idstring · uuidRequiredID of the lead.
Request body
annual_revenueinteger or nullCompany annual revenue in dollars
≥ 0Example5000000companystring or nullCompany name
at most 2,000 charactersExample"Acme Corp"company_websitestring or nullLead's company website URL
at most 2,000 charactersExample"https://acmecorp.com"custom_fieldsobject or nullCustom fields as key-value pairs
emailstring · email or nullLead's email address
at most 2,000 charactersExample"sarah.johnson@acmecorp.com"employeesinteger or nullNumber of employees at the company
≥ 0Example150first_namestring or nullLead's first name
at most 2,000 charactersExample"Sarah"industrystring or nullIndustry sector
at most 2,000 charactersExample"Technology"last_namestring or nullLead's last name
at most 2,000 charactersExample"Johnson"linkedin_urlstring or nullLead's LinkedIn profile URL
at most 2,000 charactersExample"https://linkedin.com/in/sarahjohnson"phone_numberstring or nullPhone number
at most 2,000 charactersExample"+1-555-123-4567"qualification_scorenumber or nullLead qualification score (0-100)
Example85.5titlestring or nullJob title
at most 2,000 charactersExample"VP of Sales"
Response
200
messagestringRequiredSuccess message
leadobjectRequiredUpdated lead details
Show 17 child attributesHide child attributes
idstringRequiredLead UUID
Example"a1b2c3d4-e5f6-7890-abcd-ef1234567890"created_atstring · date-timeRequiredWhen the lead was created
Example"2024-01-15T10:30:00+00:00"annual_revenueinteger or nullCompany annual revenue in dollars
Example5000000companystring or nullCompany name
Example"Acme Corp"company_websitestring or nullLead's company website URL
Example"https://acmecorp.com"custom_fieldsobject or nullCustom fields as key-value pairs
delivered_atstring · date-time or nullWhen a lead-database result was delivered to your workspace; null for leads from other sources
Example"2026-09-01T09:00:00+00:00"emailstring or nullLead's email address
Example"sarah.johnson@acmecorp.com"employeesinteger or nullNumber of employees at the company
Example150first_namestring or nullLead's first name
Example"Sarah"industrystring or nullIndustry sector
Example"Technology"last_namestring or nullLead's last name
Example"Johnson"linkedin_urlstring or nullLead's LinkedIn profile URL
Example"https://linkedin.com/in/sarahjohnson"phone_numberstring or nullPhone number
Example"+1-555-123-4567"qualification_scorenumber or nullLead qualification score (0-100)
Example85.5sourcestring or nullWhere the lead came from:
lead_databasefor a licensed lead-database result,csvfor an upload,manualfor one entered by hand,linkedin_searchfor a LinkedIn search; null for leads recorded before sources were trackedExample"lead_database"titlestring or nullJob title
Example"VP of Sales"
successbooleanDefaulttrue
Errors
Errors share one JSON body: success, error, message, optional details, and request_id.
| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_ERROR | The request didn't match the endpoint's schema: a missing or malformed field, a bad query parameter, or a value out of range. |
| 400 | NO_UPDATES | The update request contained no fields to change. |
| 401 | UNAUTHORIZED | The |
| 401 | API_KEY_EXPIRED | The API key is past its expiry date. Create a new key in the Victoria AI app. |
| 403 | INSUFFICIENT_SCOPE | The API key doesn't have the scope this endpoint requires, such as |
| 403 | ORGANIZATION_DEACTIVATED | The organization that owns this API key has been deactivated. |
| 404 | LEAD_NOT_FOUND | No lead with this ID exists in your organization. |
| 404 | NOT_FOUND | No endpoint matches the path. A resource ID in the path that isn't a valid UUID also answers |
| 409 | LEAD_ALREADY_EXISTS | A lead with the same email or LinkedIn URL already exists in your organization. From Create a lead, this means the request named no |
| 409 | LEAD_SUPPRESSED | The contact is on your organization's do-not-contact list, so the lead wasn't created, enrolled or updated. |
| 413 | PAYLOAD_TOO_LARGE | The request body is larger than 1 MB. |
| 429 | RATE_LIMITED | Too many requests for this API key: more than 100 a minute to one endpoint, or 600 a minute in total. Retry after the number of seconds in the |
| 500 | INTERNAL_ERROR | Something failed on our side. The response never includes internal details; quote its |
| 503 | UPSTREAM_TIMEOUT | A service the API depends on timed out. The request is safe to retry. |
| 503 | AUTH_UNAVAILABLE | The API key couldn't be checked because the authentication service was unavailable. The request is safe to retry. |
Response headers
| Header | Description |
|---|---|
X-Request-ID | Correlation ID for the request, also returned as |
RateLimit-Limit | Requests allowed to this endpoint per minute. |
RateLimit-Remaining | Requests you can still send to this endpoint right now. |
RateLimit-Reset | Seconds until the endpoint's full limit is available again. |
Retry-After | On a |