Propiedades del contacto
Campos personalizados de los contactos, con tipo y valor predeterminado.
Las propiedades son los campos personalizados de los contactos, como plan, ciudad o fecha de nacimiento. Define la clave y el tipo una sola vez; después, usa la clave en properties al crear o actualizar contactos, en las importaciones y en los campos de los formularios. Cada equipo puede tener hasta 100 propiedades. En los endpoints con {id}, puedes usar el ID o la clave.
Las propiedades también entran en el lote de contactos y en los filtros de los segmentos dinámicos (cada tipo tiene sus propios operadores). Si eliminas una propiedad que usa un formulario, el formulario sigue recibiendo respuestas, pero la respuesta de ese campo deja de guardarse en el contacto.
#Tipos y conversión
| Tipo | Valores aceptados | Se guarda como |
|---|---|---|
string | Texto, hasta 1.000 caracteres. | Texto, sin espacios en los extremos. |
number | 42, "42", "1234,56" o "1234.56". | Número entero o decimal. |
boolean | true/false, "sim"/"não", "yes"/"no", "1"/"0", "on"/"off". | true o false. |
date | "2024-03-18", "18/03/2024" u otra fecha reconocible. | AAAA-MM-DD. |
Un valor vacío (null o "") borra la propiedad del contacto. Los valores que no se pueden convertir generan 422.
#Listar propiedades
GET/contact-properties
Parámetros de consulta
limitintegerDe 1 a 100. Predeterminado: 20.afterstringCursor de la página siguiente.beforestringCursor de la página anterior.
cURL
curl https://api.postal.so/contact-properties \
-H "Authorization: Bearer $POSTAL_API_KEY"
Node.js
const response = await fetch('https://api.postal.so/contact-properties', {
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
},
});
const data = await response.json();
Python
import os
import requests
response = requests.get(
"https://api.postal.so/contact-properties",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->get('contact-properties', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);
$data = json_decode($response->getBody(), true);
{
"object": "list",
"has_more": false,
"data": [
{
"object": "contact_property",
"id": "019a1d80-5d6e-7f80-8a9b-0c1d2e3f4a5b",
"key": "plan",
"type": "string",
"fallback_value": "free",
"created_at": "2026-10-20T09:00:00.000000Z",
"updated_at": "2026-10-20T09:00:00.000000Z"
}
]
}
#Crear una propiedad
POST/contact-properties
La clave y el tipo no pueden cambiar después, porque los contactos ya guardan valores de ese tipo.
Cuerpo de la solicitud
keystringobligatorioLetras minúsculas, números y_, empezando por letra, hasta 64 caracteres. No puede serid,email,external_id,user_id,first_name,last_name,unsubscribed,created_at,updated_at,properties,segments,topics,tagsnisource.typestringobligatoriostring,number,booleanodate.fallback_valuestring | number | boolean | nullValor que se usa cuando el contacto no tiene la propiedad (por ejemplo, al personalizar envíos).
Errores
- 422
validation_errorClave no válida, reservada o ya usada, tipo no válido, valor predeterminado incompatible con el tipo, o el equipo ya tiene 100 propiedades.
cURL
curl -X POST https://api.postal.so/contact-properties \
-H "Authorization: Bearer $POSTAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"key": "plan",
"type": "string",
"fallback_value": "free"
}'
Node.js
const response = await fetch('https://api.postal.so/contact-properties', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
key: 'plan',
type: 'string',
fallback_value: 'free',
}),
});
const data = await response.json();
Python
import os
import requests
response = requests.post(
"https://api.postal.so/contact-properties",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
json={
"key": "plan",
"type": "string",
"fallback_value": "free",
},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->post('contact-properties', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
'json' => [
'key' => 'plan',
'type' => 'string',
'fallback_value' => 'free',
],
]);
$data = json_decode($response->getBody(), true);
{
"object": "contact_property",
"id": "019a1d80-5d6e-7f80-8a9b-0c1d2e3f4a5b"
}
#Obtener una propiedad
GET/contact-properties/{id}
Parámetros de ruta
idstringobligatorioID o clave.
Errores
- 404
not_foundEl recurso no existe o es de otro equipo.
cURL
curl https://api.postal.so/contact-properties/plan \
-H "Authorization: Bearer $POSTAL_API_KEY"
Node.js
const response = await fetch('https://api.postal.so/contact-properties/plan', {
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
},
});
const data = await response.json();
Python
import os
import requests
response = requests.get(
"https://api.postal.so/contact-properties/plan",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->get('contact-properties/plan', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);
$data = json_decode($response->getBody(), true);
{
"object": "contact_property",
"id": "019a1d80-5d6e-7f80-8a9b-0c1d2e3f4a5b",
"key": "plan",
"type": "string",
"fallback_value": "free",
"created_at": "2026-10-20T09:00:00.000000Z",
"updated_at": "2026-10-20T09:00:00.000000Z"
}
#Actualizar una propiedad
PATCH/contact-properties/{id}
Solo puede cambiar el valor predeterminado. Enviar key o type genera 422.
Parámetros de ruta
idstringobligatorioID o clave.
Cuerpo de la solicitud
fallback_valuestring | number | boolean | nullNuevo valor predeterminado;nulllo quita.
Errores
- 422
validation_errorAlgún campo no es válido. El mensaje indica cuál. - 404
not_foundEl recurso no existe o es de otro equipo.
cURL
curl -X PATCH https://api.postal.so/contact-properties/plan \
-H "Authorization: Bearer $POSTAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fallback_value": "pro"
}'
Node.js
const response = await fetch('https://api.postal.so/contact-properties/plan', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
fallback_value: 'pro',
}),
});
const data = await response.json();
Python
import os
import requests
response = requests.patch(
"https://api.postal.so/contact-properties/plan",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
json={
"fallback_value": "pro",
},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->patch('contact-properties/plan', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
'json' => [
'fallback_value' => 'pro',
],
]);
$data = json_decode($response->getBody(), true);
{
"object": "contact_property",
"id": "019a1d80-5d6e-7f80-8a9b-0c1d2e3f4a5b"
}
#Eliminar una propiedad
DELETE/contact-properties/{id}
Quita la definición al instante; los valores que tenían los contactos se borran en segundo plano.
Parámetros de ruta
idstringobligatorioID o clave.
Errores
- 404
not_foundEl recurso no existe o es de otro equipo.
cURL
curl -X DELETE https://api.postal.so/contact-properties/plan \
-H "Authorization: Bearer $POSTAL_API_KEY"
Node.js
const response = await fetch('https://api.postal.so/contact-properties/plan', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
},
});
const data = await response.json();
Python
import os
import requests
response = requests.delete(
"https://api.postal.so/contact-properties/plan",
headers={"Authorization": f"Bearer {os.environ['POSTAL_API_KEY']}"},
timeout=10,
)
data = response.json()
PHP
$client = new \GuzzleHttp\Client(['base_uri' => 'https://api.postal.so']);
$response = $client->delete('contact-properties/plan', [
'headers' => ['Authorization' => 'Bearer '.getenv('POSTAL_API_KEY')],
]);
$data = json_decode($response->getBody(), true);
{
"object": "contact_property",
"id": "019a1d80-5d6e-7f80-8a9b-0c1d2e3f4a5b",
"deleted": true
}