Create a custom field
curl --request POST \
--url https://api.minimo.it/public/v1/custom-fields \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info"
}
'import requests
url = "https://api.minimo.it/public/v1/custom-fields"
payload = {
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info"
}
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({
key: 'COMPANY_SIZE',
displayName: 'Company Size',
type: 'text',
category: 'Company Info'
})
};
fetch('https://api.minimo.it/public/v1/custom-fields', 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://api.minimo.it/public/v1/custom-fields",
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([
'key' => 'COMPANY_SIZE',
'displayName' => 'Company Size',
'type' => 'text',
'category' => 'Company Info'
]),
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://api.minimo.it/public/v1/custom-fields"
payload := strings.NewReader("{\n \"key\": \"COMPANY_SIZE\",\n \"displayName\": \"Company Size\",\n \"type\": \"text\",\n \"category\": \"Company Info\"\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://api.minimo.it/public/v1/custom-fields")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"COMPANY_SIZE\",\n \"displayName\": \"Company Size\",\n \"type\": \"text\",\n \"category\": \"Company Info\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.minimo.it/public/v1/custom-fields")
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 \"key\": \"COMPANY_SIZE\",\n \"displayName\": \"Company Size\",\n \"type\": \"text\",\n \"category\": \"Company Info\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 1,
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info",
"visibility": true,
"source": "Manual"
}
}{
"error": "Missing required fields"
}{
"error": "Custom field with key \"COMPANY_SIZE\" already exists"
}Custom Fields
Create Custom Field
Create a new custom field to store additional contact data
POST
/
public
/
v1
/
custom-fields
Create a custom field
curl --request POST \
--url https://api.minimo.it/public/v1/custom-fields \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info"
}
'import requests
url = "https://api.minimo.it/public/v1/custom-fields"
payload = {
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info"
}
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({
key: 'COMPANY_SIZE',
displayName: 'Company Size',
type: 'text',
category: 'Company Info'
})
};
fetch('https://api.minimo.it/public/v1/custom-fields', 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://api.minimo.it/public/v1/custom-fields",
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([
'key' => 'COMPANY_SIZE',
'displayName' => 'Company Size',
'type' => 'text',
'category' => 'Company Info'
]),
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://api.minimo.it/public/v1/custom-fields"
payload := strings.NewReader("{\n \"key\": \"COMPANY_SIZE\",\n \"displayName\": \"Company Size\",\n \"type\": \"text\",\n \"category\": \"Company Info\"\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://api.minimo.it/public/v1/custom-fields")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"COMPANY_SIZE\",\n \"displayName\": \"Company Size\",\n \"type\": \"text\",\n \"category\": \"Company Info\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.minimo.it/public/v1/custom-fields")
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 \"key\": \"COMPANY_SIZE\",\n \"displayName\": \"Company Size\",\n \"type\": \"text\",\n \"category\": \"Company Info\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 1,
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info",
"visibility": true,
"source": "Manual"
}
}{
"error": "Missing required fields"
}{
"error": "Custom field with key \"COMPANY_SIZE\" already exists"
}Custom fields allow you to define and organize additional attributes for your contacts beyond the standard fields
(email, phone, name).
Use Cases
- Lead qualification: Store lead score, source, or stage
- Segmentation: Categorize contacts by industry, plan, or region
- Personalization: Store preferences for personalized messaging
- Integration sync: Map external CRM fields to Minimo
Field Types
| Type | Description |
|---|---|
text | Free text input |
number | Numeric value |
boolean | True/false |
date | Date value |
datetime | Date and time |
select | Single selection from options |
json | JSON object |
Best Practices
Use Consistent Naming
Use Consistent Naming
Use
SNAKE_CASE for keys (e.g., COMPANY_SIZE, LEAD_SOURCE). Keys are automatically uppercased.Organize with Categories
Organize with Categories
Group related fields using categories like “Company Info”, “Lead Data”, “Preferences” for better organization.
Plan Field Types
Plan Field Types
Choose the right type for your data. Use
number for numeric values, date for dates, and select for predefined options.Common Errors
| Error | Cause | Solution |
|---|---|---|
key already exists | Duplicate key in account | Use a different key name |
validation_error | Missing required fields | Include key, displayName, and type |
unauthorized | Invalid API key | Check Authorization header |
Code Examples
JavaScript
JavaScript
const response = await fetch('https://api.minimo.it/public/v1/custom-fields', {
method: 'POST',
headers: {
'Authorization': 'Bearer mn-YOUR_CLIENT_ID-YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
key: 'LEAD_SOURCE',
displayName: 'Lead Source',
type: 'select',
category: 'Lead Data'
})
});
const { data } = await response.json();
console.log(data);
Python
Python
import requests
headers = {
'Authorization': 'Bearer mn-YOUR_CLIENT_ID-YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.minimo.it/public/v1/custom-fields',
headers=headers,
json={
'key': 'LEAD_SOURCE',
'displayName': 'Lead Source',
'type': 'select',
'category': 'Lead Data'
}
)
print(response.json())
Related Endpoints
- List Custom Fields: Retrieve all custom fields
- Create or Update Contact: Create and update contacts with custom field values
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Unique identifier (will be uppercased)
Example:
"COMPANY_SIZE"
Human-readable label
Example:
"Company Size"
Field type
Available options:
text, number, boolean, date, datetime, select, json Example:
"text"
Category for grouping fields
Example:
"Company Info"
Acceptable values for select/enum types
Additional metadata
Whether field is visible in UI
Response
Custom field created successfully
Show child attributes
Show child attributes
Example:
{
"id": 1,
"key": "COMPANY_SIZE",
"displayName": "Company Size",
"type": "text",
"category": "Company Info",
"visibility": true,
"source": "Manual"
}