curl --request POST \
--url https://app.revve.ai/api/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"phoneNumber": "+84775352590",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Jane Doe",
"email": "[email protected]",
"companyName": "<string>",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phoneNumber: '+84775352590',
teamId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: 'Jane Doe',
email: '[email protected]',
companyName: '<string>',
campaignId: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.revve.ai/api/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.revve.ai/api/contacts"
payload = {
"phoneNumber": "+84775352590",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Jane Doe",
"email": "[email protected]",
"companyName": "<string>",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"message": "Contact 123e4567-e89b-12d3-a456-426614174000 created successfully",
"contactId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "Contact existed"
}{
"error": "Invalid API key"
}{
"error": "Internal server error"
}Create a contact
Creates a contact in your team. Any keys beyond the standard fields are stored as custom contact properties. If campaignId is provided, the new contact is also enrolled into that campaign on a best-effort basis — enrollment failures are logged but do not fail this request, so verify enrollment separately for critical flows. (POST /api/campaigns/contact-enrollments also creates the contact and attempts enrollment in one call; enrollment there is likewise best-effort.) The target campaign must be active.
Duplicate contacts (same identifying fields within the team) are rejected with 400 Contact existed.
curl --request POST \
--url https://app.revve.ai/api/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"phoneNumber": "+84775352590",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Jane Doe",
"email": "[email protected]",
"companyName": "<string>",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
phoneNumber: '+84775352590',
teamId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
name: 'Jane Doe',
email: '[email protected]',
companyName: '<string>',
campaignId: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://app.revve.ai/api/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.revve.ai/api/contacts"
payload = {
"phoneNumber": "+84775352590",
"teamId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Jane Doe",
"email": "[email protected]",
"companyName": "<string>",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"message": "Contact 123e4567-e89b-12d3-a456-426614174000 created successfully",
"contactId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "Contact existed"
}{
"error": "Invalid API key"
}{
"error": "Internal server error"
}Authorizations
Pass your team's API key as a Bearer token: Authorization: Bearer YOUR_API_KEY. Find your API key in the dashboard under Settings. The key must belong to the same team as the teamId in the request body.
Body
The contact's phone number. Required.
"+84775352590"
Your team ID. Must match the team the API key belongs to.
Full name.
"Jane Doe"
Optional. Enrolls the created contact into this active campaign (best-effort — a failed enrollment does not fail the request).
Any additional keys are stored as custom contact properties.