taliiq
App
Taliiq

Contacts

Namespaced Contacts for CRM integrations

Download OpenAPI JSON

Live API testing

Paste a tq_live_… key from Settings → API Keys. Requests are sent through this docs server to /api/v1/… (no browser CORS). The key is kept in sessionStorage only.

Base URL: https://api.taliiq.com — set $TALIIQ_API_KEY to a key from Settings → API Keys in the dashboard.

List contacts

GET/api/v1/contacts/contacts.list · scope: contacts:read

Lists organization contacts. Pass namespace and external_id to resolve one namespaced identity.

curl -X GET 'https://api.taliiq.com/api/v1/contacts/?q=&namespace=&external_id=&limit=50' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/contacts/?q=&namespace=&external_id=&limit=50"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY"
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.taliiq.com/api/v1/contacts/?q=&namespace=&external_id=&limit=50", {
  method: "GET",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/contacts/?q=&namespace=&external_id=&limit=50

Get contact

GET/api/v1/contacts/{contact_id}/contacts.get · scope: contacts:read
curl -X GET 'https://api.taliiq.com/api/v1/contacts/{contact_id}/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/contacts/{contact_id}/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY"
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.taliiq.com/api/v1/contacts/{contact_id}/", {
  method: "GET",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/contacts/{id}/

Resolve contact

GET/api/v1/contacts/resolve/contacts.resolve · scope: contacts:read

Resolve by Taliiq contact UUID or namespaced external identity.

curl -X GET 'https://api.taliiq.com/api/v1/contacts/resolve/?contact_id=&namespace=crm&external_id=customer-42' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/contacts/resolve/?contact_id=&namespace=crm&external_id=customer-42"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY"
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.taliiq.com/api/v1/contacts/resolve/?contact_id=&namespace=crm&external_id=customer-42", {
  method: "GET",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/contacts/resolve/?contact_id=&namespace=crm&external_id=customer-42

Upsert contact

POST/api/v1/contacts/contacts.upsert · scope: contacts:write

Creates or updates a Contact and its namespaced external identity. The same request can be safely retried with Idempotency-Key.

curl -X POST 'https://api.taliiq.com/api/v1/contacts/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY' \
  -H 'Idempotency-Key: unique-key-per-contact-write' \
  -H 'Content-Type: application/json' \
  -d '{"namespace":"crm","external_id":"customer-42","phone_e164":"+201234567890","first_name":"Sara"}'
import requests

url = "https://api.taliiq.com/api/v1/contacts/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY",
  "Idempotency-Key": "unique-key-per-contact-write",
  "Content-Type": "application/json"
}
payload = {
  "namespace": "crm",
  "external_id": "customer-42",
  "phone_e164": "+201234567890",
  "first_name": "Sara"
}

response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.taliiq.com/api/v1/contacts/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY",
    "Idempotency-Key": "unique-key-per-contact-write",
    "Content-Type": "application/json"
},
  body: JSON.stringify({"namespace":"crm","external_id":"customer-42","phone_e164":"+201234567890","first_name":"Sara"}),
});

console.log(await response.json());

Try it live

/api/proxy/v1/contacts/

The legacy external_id field remains in responses during deprecation. New CRM integrations should use external_identities with an explicit namespace.

Delete contact

DELETE/api/v1/contacts/{contact_id}/contacts.delete · scope: contacts:write

Permanently deletes a Contact and its sources/external identities. Returns 403 forbidden when Zero Data Retention blocks writes.

curl -X DELETE 'https://api.taliiq.com/api/v1/contacts/{contact_id}/' \
  -H 'Authorization: Bearer $TALIIQ_API_KEY'
import requests

url = "https://api.taliiq.com/api/v1/contacts/{contact_id}/"
headers = {
  "Authorization": "Bearer $TALIIQ_API_KEY"
}

response = requests.delete(url, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.taliiq.com/api/v1/contacts/{contact_id}/", {
  method: "DELETE",
  headers: {
    "Authorization": "Bearer $TALIIQ_API_KEY"
},
});

console.log(await response.json());

Try it live

/api/proxy/v1/contacts/{id}/