CRM
Create CRM task
Create a new CRM task linked to a contact and emit a task_created activity event
POST
/
api
/
v1
/
crm
/
tasks
curl -X POST "https://api.sayvy.ai/api/v1/crm/tasks" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}'
import requests
url = "https://api.sayvy.ai/api/v1/crm/tasks"
payload = {
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/crm/tasks", {
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
body: JSON.stringify({
contact_id: "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
title: "Send updated contract agreement",
description: "Include annual billing terms and SLA addendum.",
due_at: "2026-10-15T17:00:00Z",
assignee_id: "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
})
});
const data = await response.json();
console.log(data);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String jsonPayload = """
{
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"due_at": "2026-10-15T17:00:00Z"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/crm/tasks"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"id": "e4b9d107-1b4e-4f32-8df6-96cbef3e6801",
"organization_id": "00000000-0000-0000-0000-000000000001",
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"status": "pending",
"created_by_type": "user",
"created_by_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"completed_at": null,
"created_at": "2026-10-07T16:30:00Z",
"updated_at": "2026-10-07T16:30:00Z",
"contact": {
"id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"name": "Jane Doe",
"phone_number": "+14155550199"
}
}
{
"detail": "Contact not found"
}
{
"detail": "Unauthorized"
}
Create a new follow-up task or reminder linked to an existing contact. Creating a task automatically emits a
task_created audit event on the contact’s activity timeline.
Authentication
This endpoint requires Bearer token authentication.Authorization: Bearer <token>
| Header | Type | Required | Description | Format |
|---|---|---|---|---|
Authorization | string | Yes | Scoped organization API key or Bearer JWT token | Bearer <token> |
Input parameters
string
required
Bearer token for authentication. Format:
Bearer <token>.string
required
UUID of the existing contact this task is associated with. Example:
7b8f9e2a-4c1d-48ef-9123-bcde456789ab.string
required
Task title or summary action item (maximum 255 characters). Example:
Review customer custom pricing request.string
Detailed task description, conversation context, or instructions.
string
Target completion deadline in ISO 8601 format (e.g.
2026-10-15T15:00:00Z).string
UUID of the team member assigned to execute the task.
Response Fields
string
Generated UUID identifier of the created task.
string
Organization UUID.
string
Associated contact UUID.
string
Task title.
string
Detailed description or
null.string
Due timestamp in ISO 8601 format, or
null.string
Assigned user UUID or
null.string
Initialized state:
pending.string
Actor type that initiated the task (
user).string
UUID of the creating user.
string
Timestamp of completion (
null upon creation).string
ISO 8601 creation timestamp.
string
ISO 8601 modification timestamp.
object
Linked contact summary (
id, name, phone_number).curl -X POST "https://api.sayvy.ai/api/v1/crm/tasks" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}'
import requests
url = "https://api.sayvy.ai/api/v1/crm/tasks"
payload = {
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/crm/tasks", {
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
body: JSON.stringify({
contact_id: "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
title: "Send updated contract agreement",
description: "Include annual billing terms and SLA addendum.",
due_at: "2026-10-15T17:00:00Z",
assignee_id: "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
})
});
const data = await response.json();
console.log(data);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String jsonPayload = """
{
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"due_at": "2026-10-15T17:00:00Z"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/crm/tasks"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"id": "e4b9d107-1b4e-4f32-8df6-96cbef3e6801",
"organization_id": "00000000-0000-0000-0000-000000000001",
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"status": "pending",
"created_by_type": "user",
"created_by_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"completed_at": null,
"created_at": "2026-10-07T16:30:00Z",
"updated_at": "2026-10-07T16:30:00Z",
"contact": {
"id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"name": "Jane Doe",
"phone_number": "+14155550199"
}
}
{
"detail": "Contact not found"
}
{
"detail": "Unauthorized"
}
‹ PreviousNext ›
Get task
GET /api/v1/crm/tasks/{task_id}
Was this page helpful?
⌘I
curl -X POST "https://api.sayvy.ai/api/v1/crm/tasks" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}'
import requests
url = "https://api.sayvy.ai/api/v1/crm/tasks"
payload = {
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/crm/tasks", {
method: "POST",
headers: {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
body: JSON.stringify({
contact_id: "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
title: "Send updated contract agreement",
description: "Include annual billing terms and SLA addendum.",
due_at: "2026-10-15T17:00:00Z",
assignee_id: "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d"
})
});
const data = await response.json();
console.log(data);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String jsonPayload = """
{
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"due_at": "2026-10-15T17:00:00Z"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/crm/tasks"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"id": "e4b9d107-1b4e-4f32-8df6-96cbef3e6801",
"organization_id": "00000000-0000-0000-0000-000000000001",
"contact_id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"title": "Send updated contract agreement",
"description": "Include annual billing terms and SLA addendum.",
"due_at": "2026-10-15T17:00:00Z",
"assignee_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"status": "pending",
"created_by_type": "user",
"created_by_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"completed_at": null,
"created_at": "2026-10-07T16:30:00Z",
"updated_at": "2026-10-07T16:30:00Z",
"contact": {
"id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"name": "Jane Doe",
"phone_number": "+14155550199"
}
}
{
"detail": "Contact not found"
}
{
"detail": "Unauthorized"
}