curl --request POST \
--url https://{subdomain}.mihu.ai/api/v1/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "John",
"surname": "Doe",
"email": "john.doe@example.com",
"phone_number": "+12345678901",
"number_type": "mobile",
"country_code": "US",
"timezone": "America/New_York",
"primary_language": "en",
"preferred_contact_channel": "email",
"preferred_contact_time": "Morning",
"status": "Active"
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/contacts"
payload = {
"name": "John",
"surname": "Doe",
"email": "john.doe@example.com",
"phone_number": "+12345678901",
"number_type": "mobile",
"country_code": "US",
"timezone": "America/New_York",
"primary_language": "en",
"preferred_contact_channel": "email",
"preferred_contact_time": "Morning",
"status": "Active"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'John',
surname: 'Doe',
email: 'john.doe@example.com',
phone_number: '+12345678901',
number_type: 'mobile',
country_code: 'US',
timezone: 'America/New_York',
primary_language: 'en',
preferred_contact_channel: 'email',
preferred_contact_time: 'Morning',
status: 'Active'
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.mihu.ai/api/v1/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'John',
'surname' => 'Doe',
'email' => 'john.doe@example.com',
'phone_number' => '+12345678901',
'number_type' => 'mobile',
'country_code' => 'US',
'timezone' => 'America/New_York',
'primary_language' => 'en',
'preferred_contact_channel' => 'email',
'preferred_contact_time' => 'Morning',
'status' => 'Active'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{subdomain}.mihu.ai/api/v1/contacts"
payload := strings.NewReader("{\n \"name\": \"John\",\n \"surname\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"phone_number\": \"+12345678901\",\n \"number_type\": \"mobile\",\n \"country_code\": \"US\",\n \"timezone\": \"America/New_York\",\n \"primary_language\": \"en\",\n \"preferred_contact_channel\": \"email\",\n \"preferred_contact_time\": \"Morning\",\n \"status\": \"Active\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{subdomain}.mihu.ai/api/v1/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"John\",\n \"surname\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"phone_number\": \"+12345678901\",\n \"number_type\": \"mobile\",\n \"country_code\": \"US\",\n \"timezone\": \"America/New_York\",\n \"primary_language\": \"en\",\n \"preferred_contact_channel\": \"email\",\n \"preferred_contact_time\": \"Morning\",\n \"status\": \"Active\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"John\",\n \"surname\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"phone_number\": \"+12345678901\",\n \"number_type\": \"mobile\",\n \"country_code\": \"US\",\n \"timezone\": \"America/New_York\",\n \"primary_language\": \"en\",\n \"preferred_contact_channel\": \"email\",\n \"preferred_contact_time\": \"Morning\",\n \"status\": \"Active\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Contact created successfully",
"data": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"surname": "<string>",
"email": "<string>",
"phone_number": "<string>",
"number_type": "<string>",
"country_code": "<string>",
"timezone": "<string>",
"primary_language": "<string>",
"preferred_contact_channel": "<string>",
"preferred_contact_time": "<string>",
"status": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"success": false,
"message": "A contact with this email or phone number already exists",
"data": [
"<unknown>"
]
}{
"success": false,
"message": "Validation errors",
"data": [
"<unknown>"
]
}{
"success": false,
"message": "An unexpected error occurred",
"data": [
"<unknown>"
]
}Create a new contact
Creates a contact record that agents and campaigns can use for conversations, calls, SMS, WhatsApp, and segmentation. Provide profile fields such as name, email, phone number, country code, timezone, language, preferred channel, and status. The response returns the created contact with its UUID for future API calls.
Custom fields: any custom field key registered via POST /api/v1/contacts/fields can be sent as a top-level body property (string value). Use GET /api/v1/contacts/fields to discover available keys. Unknown keys return 422 with the offending key listed. In responses, every active custom field is returned as a top-level key — fields with no value appear as an empty string.
curl --request POST \
--url https://{subdomain}.mihu.ai/api/v1/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "John",
"surname": "Doe",
"email": "john.doe@example.com",
"phone_number": "+12345678901",
"number_type": "mobile",
"country_code": "US",
"timezone": "America/New_York",
"primary_language": "en",
"preferred_contact_channel": "email",
"preferred_contact_time": "Morning",
"status": "Active"
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/contacts"
payload = {
"name": "John",
"surname": "Doe",
"email": "john.doe@example.com",
"phone_number": "+12345678901",
"number_type": "mobile",
"country_code": "US",
"timezone": "America/New_York",
"primary_language": "en",
"preferred_contact_channel": "email",
"preferred_contact_time": "Morning",
"status": "Active"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'John',
surname: 'Doe',
email: 'john.doe@example.com',
phone_number: '+12345678901',
number_type: 'mobile',
country_code: 'US',
timezone: 'America/New_York',
primary_language: 'en',
preferred_contact_channel: 'email',
preferred_contact_time: 'Morning',
status: 'Active'
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{subdomain}.mihu.ai/api/v1/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'John',
'surname' => 'Doe',
'email' => 'john.doe@example.com',
'phone_number' => '+12345678901',
'number_type' => 'mobile',
'country_code' => 'US',
'timezone' => 'America/New_York',
'primary_language' => 'en',
'preferred_contact_channel' => 'email',
'preferred_contact_time' => 'Morning',
'status' => 'Active'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{subdomain}.mihu.ai/api/v1/contacts"
payload := strings.NewReader("{\n \"name\": \"John\",\n \"surname\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"phone_number\": \"+12345678901\",\n \"number_type\": \"mobile\",\n \"country_code\": \"US\",\n \"timezone\": \"America/New_York\",\n \"primary_language\": \"en\",\n \"preferred_contact_channel\": \"email\",\n \"preferred_contact_time\": \"Morning\",\n \"status\": \"Active\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{subdomain}.mihu.ai/api/v1/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"John\",\n \"surname\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"phone_number\": \"+12345678901\",\n \"number_type\": \"mobile\",\n \"country_code\": \"US\",\n \"timezone\": \"America/New_York\",\n \"primary_language\": \"en\",\n \"preferred_contact_channel\": \"email\",\n \"preferred_contact_time\": \"Morning\",\n \"status\": \"Active\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"John\",\n \"surname\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"phone_number\": \"+12345678901\",\n \"number_type\": \"mobile\",\n \"country_code\": \"US\",\n \"timezone\": \"America/New_York\",\n \"primary_language\": \"en\",\n \"preferred_contact_channel\": \"email\",\n \"preferred_contact_time\": \"Morning\",\n \"status\": \"Active\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Contact created successfully",
"data": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"surname": "<string>",
"email": "<string>",
"phone_number": "<string>",
"number_type": "<string>",
"country_code": "<string>",
"timezone": "<string>",
"primary_language": "<string>",
"preferred_contact_channel": "<string>",
"preferred_contact_time": "<string>",
"status": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"success": false,
"message": "A contact with this email or phone number already exists",
"data": [
"<unknown>"
]
}{
"success": false,
"message": "Validation errors",
"data": [
"<unknown>"
]
}{
"success": false,
"message": "An unexpected error occurred",
"data": [
"<unknown>"
]
}Authorizations
Use a Bearer token to access these API endpoints. Example: "Bearer {your-token}"
Body
"John"
"Doe"
"john.doe@example.com"
"+12345678901"
"mobile"
"US"
"America/New_York"
"en"
"email"
"Morning"
Active, Inactive "Active"
Response
Created
Indicates whether the request completed successfully. True for successful responses; false for documented error responses.
true
Human-readable response message. Safe to display in logs or simple client notifications; use structured fields for program logic.
"Contact created successfully"
Show child attributes
Show child attributes
