curl --request POST \
--url https://api.reply.io/v3/tasks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"startAt": "2023-11-07T05:31:56Z",
"dueTo": "2023-11-07T05:31:56Z",
"template": {
"body": "<string>",
"subject": "<string>",
"attachmentIdList": [
123
]
},
"contactId": 123
}
'import requests
url = "https://api.reply.io/v3/tasks"
payload = {
"startAt": "2023-11-07T05:31:56Z",
"dueTo": "2023-11-07T05:31:56Z",
"template": {
"body": "<string>",
"subject": "<string>",
"attachmentIdList": [123]
},
"contactId": 123
}
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({
startAt: '2023-11-07T05:31:56Z',
dueTo: '2023-11-07T05:31:56Z',
template: {body: JSON.stringify('<string>'), subject: '<string>', attachmentIdList: [123]},
contactId: 123
})
};
fetch('https://api.reply.io/v3/tasks', 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.reply.io/v3/tasks",
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([
'startAt' => '2023-11-07T05:31:56Z',
'dueTo' => '2023-11-07T05:31:56Z',
'template' => [
'body' => '<string>',
'subject' => '<string>',
'attachmentIdList' => [
123
]
],
'contactId' => 123
]),
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.reply.io/v3/tasks"
payload := strings.NewReader("{\n \"startAt\": \"2023-11-07T05:31:56Z\",\n \"dueTo\": \"2023-11-07T05:31:56Z\",\n \"template\": {\n \"body\": \"<string>\",\n \"subject\": \"<string>\",\n \"attachmentIdList\": [\n 123\n ]\n },\n \"contactId\": 123\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.reply.io/v3/tasks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"startAt\": \"2023-11-07T05:31:56Z\",\n \"dueTo\": \"2023-11-07T05:31:56Z\",\n \"template\": {\n \"body\": \"<string>\",\n \"subject\": \"<string>\",\n \"attachmentIdList\": [\n 123\n ]\n },\n \"contactId\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/tasks")
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 \"startAt\": \"2023-11-07T05:31:56Z\",\n \"dueTo\": \"2023-11-07T05:31:56Z\",\n \"template\": {\n \"body\": \"<string>\",\n \"subject\": \"<string>\",\n \"attachmentIdList\": [\n 123\n ]\n },\n \"contactId\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"contactId": 123,
"taskType": "toDo",
"status": "new",
"linkedInTaskType": "message",
"sequenceId": 123,
"sequenceStepId": 123,
"sequenceStepDisplayName": "<string>",
"assignedUserId": 123,
"creationSource": "user",
"createdAt": "2023-11-07T05:31:56Z",
"startAt": "2023-11-07T05:31:56Z",
"dueTo": "2023-11-07T05:31:56Z",
"finishedAt": "2023-11-07T05:31:56Z",
"isFailed": true,
"isScheduled": true,
"template": {
"body": "<string>",
"subject": "<string>",
"attachmentIdList": [
123
]
},
"content": {
"body": "<string>",
"subject": "<string>"
},
"deliveryInfo": {
"email": "<string>",
"phoneNumber": "<string>",
"linkedInUrl": "<string>"
}
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/taskType",
"detail": "'taskType' is required."
},
{
"pointer": "/contactId",
"detail": "'contactId' must be a positive integer."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ManageTask] are denied for userId 123.",
"code": "task.forbidden"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Retry after 60 seconds."
}Create a task
tasks:write scope (or a broader one that includes it).
Create a task of your own. taskType, startAt, dueTo, and a template body are required; contactId for every type but toDo.
curl --request POST \
--url https://api.reply.io/v3/tasks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"startAt": "2023-11-07T05:31:56Z",
"dueTo": "2023-11-07T05:31:56Z",
"template": {
"body": "<string>",
"subject": "<string>",
"attachmentIdList": [
123
]
},
"contactId": 123
}
'import requests
url = "https://api.reply.io/v3/tasks"
payload = {
"startAt": "2023-11-07T05:31:56Z",
"dueTo": "2023-11-07T05:31:56Z",
"template": {
"body": "<string>",
"subject": "<string>",
"attachmentIdList": [123]
},
"contactId": 123
}
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({
startAt: '2023-11-07T05:31:56Z',
dueTo: '2023-11-07T05:31:56Z',
template: {body: JSON.stringify('<string>'), subject: '<string>', attachmentIdList: [123]},
contactId: 123
})
};
fetch('https://api.reply.io/v3/tasks', 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.reply.io/v3/tasks",
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([
'startAt' => '2023-11-07T05:31:56Z',
'dueTo' => '2023-11-07T05:31:56Z',
'template' => [
'body' => '<string>',
'subject' => '<string>',
'attachmentIdList' => [
123
]
],
'contactId' => 123
]),
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.reply.io/v3/tasks"
payload := strings.NewReader("{\n \"startAt\": \"2023-11-07T05:31:56Z\",\n \"dueTo\": \"2023-11-07T05:31:56Z\",\n \"template\": {\n \"body\": \"<string>\",\n \"subject\": \"<string>\",\n \"attachmentIdList\": [\n 123\n ]\n },\n \"contactId\": 123\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.reply.io/v3/tasks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"startAt\": \"2023-11-07T05:31:56Z\",\n \"dueTo\": \"2023-11-07T05:31:56Z\",\n \"template\": {\n \"body\": \"<string>\",\n \"subject\": \"<string>\",\n \"attachmentIdList\": [\n 123\n ]\n },\n \"contactId\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/tasks")
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 \"startAt\": \"2023-11-07T05:31:56Z\",\n \"dueTo\": \"2023-11-07T05:31:56Z\",\n \"template\": {\n \"body\": \"<string>\",\n \"subject\": \"<string>\",\n \"attachmentIdList\": [\n 123\n ]\n },\n \"contactId\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"contactId": 123,
"taskType": "toDo",
"status": "new",
"linkedInTaskType": "message",
"sequenceId": 123,
"sequenceStepId": 123,
"sequenceStepDisplayName": "<string>",
"assignedUserId": 123,
"creationSource": "user",
"createdAt": "2023-11-07T05:31:56Z",
"startAt": "2023-11-07T05:31:56Z",
"dueTo": "2023-11-07T05:31:56Z",
"finishedAt": "2023-11-07T05:31:56Z",
"isFailed": true,
"isScheduled": true,
"template": {
"body": "<string>",
"subject": "<string>",
"attachmentIdList": [
123
]
},
"content": {
"body": "<string>",
"subject": "<string>"
},
"deliveryInfo": {
"email": "<string>",
"phoneNumber": "<string>",
"linkedInUrl": "<string>"
}
}{
"title": "Validation failed",
"status": 400,
"detail": "The request body contains validation errors.",
"errors": [
{
"pointer": "/taskType",
"detail": "'taskType' is required."
},
{
"pointer": "/contactId",
"detail": "'contactId' must be a positive integer."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Forbidden",
"status": 403,
"detail": "Feature scopes [ManageTask] are denied for userId 123.",
"code": "task.forbidden"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Retry after 60 seconds."
}Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Body
Request body for creating a new task.
Task type. Must be a valid enum value.
Possible values: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp.
toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp Task start time. Must be on or after 2015-01-01.
Task due time. Must be after startAt.
Task content template. Body is required.
Show child attributes
Show child attributes
Contact (prospect) ID to associate with the task. Required for template variable rendering.
LinkedIn action subtype. Only applicable for LinkedIn tasks (taskType=linkedIn). Must be a valid enum value when provided.
Possible values: message, connect, inMail, viewProfile.
message, connect, inMail, viewProfile Response
Task created successfully.
Full task detail returned by GET by ID, Create, and Update endpoints.
Task ID.
Associated contact (prospect) ID.
Task type.
Possible values: toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp.
toDo, call, meeting, linkedIn, manualEmail, sms, whatsApp Task status.
Possible values: new, finished, cancelled, archived, sequenceDetached.
new, finished, cancelled, archived, sequenceDetached LinkedIn action subtype. Only present for LinkedIn tasks.
Possible values: message, connect, inMail, viewProfile.
message, connect, inMail, viewProfile Sequence ID if this task was created by a sequence.
Sequence step ID. Available when the ExtendedFilterInTasks feature is enabled.
Human-readable sequence step name (e.g. "Step 2 - Email").
ID of the user this task is assigned to.
How the task was created.
Possible values: user, sequence, meeting.
user, sequence, meeting When the task was created.
Task start time. When isScheduled is true, this is the scheduled execution time.
Task due time.
When the task was completed. Null for active tasks.
Whether the task execution failed.
Whether the task is scheduled for automatic execution.
Raw task template. For active tasks, may contain {{variable}} placeholders.
For finished tasks, contains the final content (raw version is no longer available).
Show child attributes
Show child attributes
Rendered content with variables resolved. Only populated when includeContent=true query parameter is set.
Null by default.
Show child attributes
Show child attributes
Delivery target information. Populated for ManualEmail (email), Call/SMS (phone), and LinkedIn (URL) tasks. Null for ToDo, Meeting, and WhatsApp tasks.
Show child attributes
Show child attributes