Tasks
Retrieve a Single Task by Id #
|
Sample Object
{
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": null,
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_completed_by": null,
"details": "",
"comments": [],
"event": null,
"task_created_by": {
"id": "11111111-2222-4333-8444-555555555555",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.invalid"
},
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z",
"integration_metadata_field_1": "",
"integration_metadata_field_2": "",
"integration_metadata_field_3": "",
"integration_metadata_field_4": "",
"integration_metadata_field_5": ""
} |
Retrieves information about a specific task (using the "id" parameter).
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| id | Number | Yes |
Id of the specific task that you would like to retrieve.
|
|
| $result_format | String | No |
Pass in "array" to get the task inside a JSON array (a list with one item).
|
|
| $on_error_return_empty_result | Boolean | No |
default: false
|
For a missing or invalid task id, or a task not found, return HTTP 200 with {} (or [] when $result_format=array). Authentication, rate-limit and unexpected server errors keep their normal HTTP status.
|
Code Samples
curl -X GET "https://api.exhibitday.com/v1/tasks/info?id=12345" -H "api_key: YOUR_API_KEY"
const response = await fetch("https://api.exhibitday.com/v1/tasks/info?" + new URLSearchParams({ "id": "12345" }), {
method: "GET",
headers: { "api_key": "YOUR_API_KEY" }
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.get(
"https://api.exhibitday.com/v1/tasks/info",
headers={"api_key": "YOUR_API_KEY"},
params={"id": 12345},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.GetAsync("https://api.exhibitday.com/v1/tasks/info?id=12345");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks/info?id=12345"))
.header("api_key", "YOUR_API_KEY")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks/info?id=12345');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY'],
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks/info?id=12345')
request = Net::HTTP::Get.new(uri)
request['api_key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.exhibitday.com/v1/tasks/info?id=12345", nil)
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
GET /v1/tasks/info - HTTP 200
{
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": null,
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_completed_by": null,
"details": "",
"comments": [],
"event": null,
"task_created_by": {
"id": "11111111-2222-4333-8444-555555555555",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.invalid"
},
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z",
"integration_metadata_field_1": "",
"integration_metadata_field_2": "",
"integration_metadata_field_3": "",
"integration_metadata_field_4": "",
"integration_metadata_field_5": ""
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"id":12345}.
Retrieve Tasks #
|
This method retrieves tasks in your workspace based on various filter criteria. The filter parameters for this method work in conjunction on an “AND-basis”. For example, if you pass in the value “true” for filter_by_no_due_date and value “12345” for filter_by_event_id, you’ll get back all the tasks with no due date for the event that has an Id of 12345. Also, you can only pass in one value for each filter parameter; this means that you can’t pass in “12345, 56789” as the value for the filter_by_event_id filter parameter expecting to get back all the tasks for the two events 12345 and 56789.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| filter_by_event_id | Number | No |
Only include tasks from this given event.
|
|
| filter_by_general_tasks_only | Boolean | No |
default: false
|
Only include general tasks (tasks on the main task board that do not belong to a particular event). Note: this filter cannot be used in conjunction with the filter_by_event_id filter.
|
| filter_by_incomplete_only | Boolean | No |
default: false
|
If you pass in the value "true" for this parameter, the result will only include tasks that are NOT marked as Completed.
|
| filter_by_completed_only | Boolean | No |
default: false
|
If you pass in the value "true" for this parameter, the result will only include tasks that are marked as Completed.
|
| filter_by_no_due_date | Boolean | No |
default: false
|
If you pass in the value "true" for this parameter, the result will only include tasks that do not have a due date set.
|
| filter_by_due_date_greater_than_or_equal_to | Date | No |
Only include tasks that have a due date greater than or equal to the value passed in for this filter parameter. Use this date format: YYYY-MM-DD. You can also pass in "today", "yesterday" or "tomorrow" (based on your workspace's time zone). Note: this filter cannot be used in conjunction with the filter_by_no_due_date filter.
|
|
| filter_by_due_date_smaller_than_or_equal_to | Date | No |
Only include tasks that have a due date smaller than or equal to the value passed in for this filter parameter. Use this date format: YYYY-MM-DD. You can also pass in "today", "yesterday" or "tomorrow" (based on your workspace's time zone). Note: this filter cannot be used in conjunction with the filter_by_no_due_date filter.
|
|
| filter_by_has_assignee | Boolean | No |
default: false
|
Only include tasks that have an assignee. Unassigned tasks will get excluded.
|
| filter_by_assignee_user_id | String | No |
Only include tasks that are assigned to this user. You can get a list of UserIds in your workspace from the /v1/references/users_and_resources endpoint. Note: If you want to retrieve the tasks that are unassigned, include this parameter and pass in the word "null" as the value for it.
|
|
| filter_by_task_name_contains_text | String | No |
Only include tasks that have the given text in the task Name. For example: If you want to retrieve all the tasks that have the word “order” in the task Name field, pass in the value “order” for the filter_by_task_name_contains_text parameter. Note: this text search is not case-sensitive.
|
|
| filter_by_integration_metadata_field_1 | String | No |
max length: 3000
|
Only include tasks that have their integration_metadata_field_1 property equal to the value you pass in for this parameter. Note: A task's integration_metadata_field_1 property is an integration-specific text field only accessible via the ExhibitDay API. This field is typically used to store metadata or information about a particular task (e.g., the "external id" of the task from another system you're integrating with).
|
| filter_by_integration_metadata_field_2 | String | No |
max length: 3000
|
Only include tasks that have their integration_metadata_field_2 property equal to the value you pass in for this parameter. Note: A task's integration_metadata_field_2 property is an integration-specific text field only accessible via the ExhibitDay API. This field is typically used to store metadata or information about a particular task (e.g., the "external id" of the task from another system you're integrating with).
|
| filter_by_integration_metadata_field_3 | String | No |
max length: 3000
|
Only include tasks that have their integration_metadata_field_3 property equal to the value you pass in for this parameter. Note: A task's integration_metadata_field_3 property is an integration-specific text field only accessible via the ExhibitDay API. This field is typically used to store metadata or information about a particular task (e.g., the "external id" of the task from another system you're integrating with).
|
| filter_by_integration_metadata_field_4 | String | No |
max length: 3000
|
Only include tasks that have their integration_metadata_field_4 property equal to the value you pass in for this parameter. Note: A task's integration_metadata_field_4 property is an integration-specific text field only accessible via the ExhibitDay API. This field is typically used to store metadata or information about a particular task (e.g., the "external id" of the task from another system you're integrating with).
|
| filter_by_integration_metadata_field_5 | String | No |
max length: 3000
|
Only include tasks that have their integration_metadata_field_5 property equal to the value you pass in for this parameter. Note: A task's integration_metadata_field_5 property is an integration-specific text field only accessible via the ExhibitDay API. This field is typically used to store metadata or information about a particular task (e.g., the "external id" of the task from another system you're integrating with).
|
| hydrate_task_comments | Boolean | No |
default: false
|
Include the comments collection for each task in the result set. Note: hydrating the comments collection for each task in the results will naturally yield a larger response size and response time. Set the value for this parameter to true only if you need to include the list of comments for each task in the result set.
|
| filter_by_completer_user_id | String | No |
Only include the tasks that were completed by this user. Use the user's id from /v1/references/users_and_resources. You can only pass in one id.
|
|
| $result_sort | String | No |
Sorts the tasks by when they were added or last updated. Accepted values: create_timestamp_asc, create_timestamp_desc, last_update_timestamp_asc, last_update_timestamp_desc. Without this parameter, tasks are grouped by event (in event start date order) and listed in their task board order within each event.
|
|
| $return_task_lites | Boolean | No |
default: false
|
Return a shorter version of each task (id, exhibitday_url, display_rank, name, due_date, assignee_user_id, is_completed, completion time and user, the event, created by, created and last update timestamps, and the integration metadata fields). Use it for faster responses when you only need to identify tasks. Note: task comments are not included in these shorter tasks. In them the completion time is named task_completed_timestamp_est, but it is UTC like every other timestamp (the same value as task_completed_timestamp in the full task).
|
| filter_by_last_update_timestamp_greater_than_or_equal_to | String | No |
Only include tasks that were added or changed on or after this date and time, for example 2026-10-14T18:30:00 (a date alone, such as 2026-10-14, means midnight). Responses give task_last_update_timestamp in UTC (it ends in Z), and that value can be passed back unchanged; a value without an offset is read as US Eastern time, and any other offset (e.g., 2026-10-14T18:30:00-04:00) is converted. To sync changes, process and save every page before advancing the cursor. Save the latest task_last_update_timestamp you receive and pass it in next time (tasks changed at exactly that time come back again, upsert every returned record by id, including boundary records). Deleted tasks are not returned. Any other value is rejected with an error.
|
|
| $limit | Number | No |
The most tasks to return (a whole number of 1 or more). Use it with $offset to read a long list in pages: total_records in the response counts every matching task and has_more is true while more pages follow (the X-Total-Count header carries the total too). Without $limit, every matching task is returned.
|
|
| $offset | Number | No |
How many tasks to skip before the first one returned (a whole number; 0 by default). For the next page, add the number of tasks you received to $offset.
|
|
| $result_format | String | No |
Pass in "array" to get the results as a plain JSON array (without records_found, total_records, has_more and list_type; the X-Total-Count header still gives the total), or "wrapped_in_array" to get the usual response inside a JSON array.
|
|
| $on_error_return_empty_result | Boolean | No |
default: false
|
For this endpoint's ID, filter or paging validation errors, return HTTP 200 with no matching records in the selected result format. Authentication, rate-limit and unexpected server errors keep their normal HTTP status.
|
Code Samples
curl -X GET "https://api.exhibitday.com/v1/tasks" -H "api_key: YOUR_API_KEY"
const response = await fetch("https://api.exhibitday.com/v1/tasks", {
method: "GET",
headers: { "api_key": "YOUR_API_KEY" }
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.get(
"https://api.exhibitday.com/v1/tasks",
headers={"api_key": "YOUR_API_KEY"},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.GetAsync("https://api.exhibitday.com/v1/tasks");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks"))
.header("api_key", "YOUR_API_KEY")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY'],
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks')
request = Net::HTTP::Get.new(uri)
request['api_key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.exhibitday.com/v1/tasks", nil)
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
GET /v1/tasks - HTTP 200
{
"records_found": 1,
"total_records": 1,
"has_more": false,
"list_type": "task",
"list_data": [
{
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": null,
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_completed_by": null,
"details": "",
"comments": null,
"event": null,
"task_created_by": {
"id": "11111111-2222-4333-8444-555555555555",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.invalid"
},
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z",
"integration_metadata_field_1": "",
"integration_metadata_field_2": "",
"integration_metadata_field_3": "",
"integration_metadata_field_4": "",
"integration_metadata_field_5": ""
}
]
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. No query/body parameters are sent (the API key remains a header).
Add a Task #
|
The response will contain an object representing the newly added task.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| name | String | Yes |
max length: 400
|
The name/short description of the task.
|
| event_id | Number | No |
The id of the event you would like to add the task under. If this value is not provided, the task will be added as a general (non-event-specific) task in your workspace (under the main Task Board).
|
|
| task_section_id | Number | No |
The id of the event task section that the task should be placed under. Leave this value blank if you don't want to place/categorize the task under a specific event task section. Note: you can get a list of available Task Section Ids for a given event using the /v1/events/info endpoint.
|
|
| is_completed | Boolean | No |
default: false
|
Boolean representing whether or not the task has been completed: true or false (also accepted: yes/no, 1/0, completed/incomplete). Any other value is rejected with an error.
|
| due_date | Date | No |
Task due date (format: YYYY-MM-DD).
|
|
| assignee_user_id | String | No |
The id of the user you would like to assign the task to. If you want the task to be unassigned, leave the value for this parameter blank. To get a list of all the user ids in your workspace, use the /v1/references/users_and_resources API endpoint. Users that can have tasks assigned to them will have their can_have_tasks_assigned property set to true.
|
|
| details | String | No |
The details/description of the task. Send plain text: it is stored HTML-encoded and returned as HTML, so a < b comes back as a < b and each line break as <br/>. Details written in the web app editor come back as that editor rich-text HTML.
|
|
| integration_metadata_field_1 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_2 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_3 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_4 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_5 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
Code Samples
curl -X POST https://api.exhibitday.com/v1/tasks -H "api_key: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"name\":\"Sample task\"}"
const response = await fetch("https://api.exhibitday.com/v1/tasks", {
method: "POST",
headers: { "api_key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ "name": "Sample task" })
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.post(
"https://api.exhibitday.com/v1/tasks",
headers={"api_key": "YOUR_API_KEY"},
json={"name": "Sample task"},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using System.Net.Http.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.PostAsync("https://api.exhibitday.com/v1/tasks",
JsonContent.Create(new { name = "Sample task" }));
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks"))
.header("api_key", "YOUR_API_KEY")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"name\":\"Sample task\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"name":"Sample task"}',
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks')
request = Net::HTTP::Post.new(uri)
request['api_key'] = 'YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = '{"name":"Sample task"}'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.exhibitday.com/v1/tasks", strings.NewReader("{\"name\":\"Sample task\"}"))
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
request.Header.Set("Content-Type", "application/json")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
POST /v1/tasks - HTTP 200
{
"id": 23456,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=23456",
"event_task_section_id": null,
"event_task_section": null,
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_completed_by": null,
"details": "",
"comments": [],
"event": null,
"task_created_by": {
"id": "ExhibitDay API",
"first_name": "ExhibitDay",
"last_name": "API",
"email": ""
},
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z",
"integration_metadata_field_1": "",
"integration_metadata_field_2": "",
"integration_metadata_field_3": "",
"integration_metadata_field_4": "",
"integration_metadata_field_5": ""
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"name":"Sample task"}.
Delete a Task #
|
Permanently deletes a task. It cannot be undone.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| id | Number | Yes |
The id of the task you would like to delete.
|
Code Samples
curl -X DELETE "https://api.exhibitday.com/v1/tasks?id=12345" -H "api_key: YOUR_API_KEY"
const response = await fetch("https://api.exhibitday.com/v1/tasks?" + new URLSearchParams({ "id": "12345" }), {
method: "DELETE",
headers: { "api_key": "YOUR_API_KEY" }
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.delete(
"https://api.exhibitday.com/v1/tasks",
headers={"api_key": "YOUR_API_KEY"},
params={"id": 12345},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.DeleteAsync("https://api.exhibitday.com/v1/tasks?id=12345");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks?id=12345"))
.header("api_key", "YOUR_API_KEY")
.method("DELETE", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks?id=12345');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY'],
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks?id=12345')
request = Net::HTTP::Delete.new(uri)
request['api_key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
request, err := http.NewRequest("DELETE", "https://api.exhibitday.com/v1/tasks?id=12345", nil)
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
DELETE /v1/tasks - HTTP 200
{
"status_code": 200,
"status": "OK",
"message": "Task Deleted",
"errors": []
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"id":12345}.
Update a Task #
|
To update a task, only pass in the properties that you want to update. To clear a property that supports clearing, pass in null; an empty value leaves the property unchanged (the warnings property in the response names any such parameters). If the update is successful, the message property in the response will contain a list of task properties that were actually changed.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| id | Number | Yes |
The Id of the task you would like to update.
|
|
| name | String | No |
max length: 400
|
The name/short description of the task.
|
| event_id | Number | No |
The id of the event you would like to move the task to. To make it a general task (one that is not under any event), pass in null. A moved task is placed at the top of its new task list and taken out of its task section; to place it under one of the new event's task sections, also pass in task_section_id. Links between the task and items of its previous event are removed. A task cannot be moved into or out of an event whose tasks are locked.
|
|
| task_section_id | Number | No |
The id of the event task section that the task should be placed under. If you don't want to place/categorize the task under a specific event task section, pass in the value "null" for this parameter. Note: you can get a list of available Task Section Ids for a given event using the /v1/events/info endpoint.
|
|
| is_completed | Boolean | No |
Boolean representing whether or not the task has been completed: true or false (also accepted: yes/no, 1/0, completed/incomplete). Any other value is rejected with an error.
|
|
| due_date | Date | No |
Task due date in YYYY-MM-DD format. To remove the due date, pass in null (JSON null or the string "null"). Omit this parameter, or pass in an empty value, to leave the due date unchanged.
|
|
| assignee_user_id | String | No |
The User Id of the user you would like to assign the task to. If you want the task to be unassigned, pass in the value "null" for this parameter. To get a list of all the User Ids in your workspace, use the /v1/references/users_and_resources API endpoint; users who can have tasks assigned to them will have their can_have_tasks_assigned property set to true.
|
|
| details | String | No |
The details/description of the task. Send plain text: it is stored HTML-encoded and returned as HTML, so a < b comes back as a < b and each line break as <br/>. Details written in the web app editor come back as that editor rich-text HTML. To clear this field, pass in null (JSON null or the string "null").
|
|
| integration_metadata_field_1 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_2 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_3 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_4 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
| integration_metadata_field_5 | String | No |
max length: 3000
|
This is an integration-specific text field only accessible via the ExhibitDay API. This field can be used to store whatever metadata or information you'd like about a particular task. For example, you can use it to store the "external id" of the task (from another system you're integrating with). Or, you can use it to store the last sync timestamp. Note: when you retrieve a list of tasks (using the /v1/tasks endpoint), you can filter down the results by the value of this field.
|
Code Samples
curl -X PATCH https://api.exhibitday.com/v1/tasks -H "api_key: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"id\":12345,\"name\":\"Updated task name\"}"
const response = await fetch("https://api.exhibitday.com/v1/tasks", {
method: "PATCH",
headers: { "api_key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ "id": 12345, "name": "Updated task name" })
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.patch(
"https://api.exhibitday.com/v1/tasks",
headers={"api_key": "YOUR_API_KEY"},
json={"id": 12345, "name": "Updated task name"},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using System.Net.Http.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.PatchAsync("https://api.exhibitday.com/v1/tasks",
JsonContent.Create(new { id = 12345, name = "Updated task name" }));
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks"))
.header("api_key", "YOUR_API_KEY")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("{\"id\":12345,\"name\":\"Updated task name\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"id":12345,"name":"Updated task name"}',
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks')
request = Net::HTTP::Patch.new(uri)
request['api_key'] = 'YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = '{"id":12345,"name":"Updated task name"}'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PATCH", "https://api.exhibitday.com/v1/tasks", strings.NewReader("{\"id\":12345,\"name\":\"Updated task name\"}"))
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
request.Header.Set("Content-Type", "application/json")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
PATCH /v1/tasks - HTTP 200
{
"status_code": 200,
"status": "OK",
"message": "Task Update Successful. Task properties that were changed: name",
"errors": []
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"id":12345,"name":"Updated task name"}.
Retrieve Task Comments #
|
This method retrieves task comments in your workspace based on various filter criteria. The filter parameters for this method work in conjunction on an “AND-basis”. For example, if you pass in the value “12345” for filter_by_event_id, you’ll get back the comments of all the tasks of the event that has an Id of 12345, and if you pass in a task id for filter_by_task_id, you’ll get back the comments of that task only. You can only pass in one value for each filter parameter. If you don’t pass in any filter, all the task comments in your workspace are returned.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| filter_by_event_id | Number | No |
Only include task comments for tasks from this given event.
|
|
| filter_by_task_id | Number | No |
Only include task comments for this specific task.
|
|
| hydrate_task | Boolean | No |
default: false
|
Include the task object for each task comment in the result set. Note: hydrating the task object for each task comment in the results will naturally yield a larger response size and response time. Set the value for this parameter to true only if you need to include the task object for each comment in the result set.
|
| filter_by_commenter_user_id | String | No |
Only include the comments made by this user. Use the user's id from /v1/references/users_and_resources.
|
|
| $result_sort | String | No |
Sorts the comments by when they were added or last updated. Accepted values: create_timestamp_asc, create_timestamp_desc, last_update_timestamp_asc, last_update_timestamp_desc. Without this parameter, comments are grouped by task (in the same order as the Retrieve Tasks method) and listed oldest first within each task.
|
|
| filter_by_last_update_timestamp_greater_than_or_equal_to | String | No |
Only include task comments that were added or changed on or after this date and time, for example 2026-10-14T18:30:00 (a date alone, such as 2026-10-14, means midnight). Responses give comment_last_update_timestamp in UTC (it ends in Z), and that value can be passed back unchanged; a value without an offset is read as US Eastern time, and any other offset (e.g., 2026-10-14T18:30:00-04:00) is converted. To sync changes, process and save every page before advancing the cursor. Save the latest comment_last_update_timestamp you receive and pass it in next time (task comments changed at exactly that time come back again, upsert every returned record by id, including boundary records). Deleted task comments are not returned. Any other value is rejected with an error.
|
|
| $limit | Number | No |
The most task comments to return (a whole number of 1 or more). Use it with $offset to read a long list in pages: total_records in the response counts every matching task comment and has_more is true while more pages follow (the X-Total-Count header carries the total too). Without $limit, every matching task comment is returned.
|
|
| $offset | Number | No |
How many task comments to skip before the first one returned (a whole number; 0 by default). For the next page, add the number of task comments you received to $offset.
|
|
| $result_format | String | No |
Pass in "array" to get the results as a plain JSON array (without records_found, total_records, has_more and list_type; the X-Total-Count header still gives the total), or "wrapped_in_array" to get the usual response inside a JSON array.
|
Code Samples
curl -X GET "https://api.exhibitday.com/v1/tasks/comments" -H "api_key: YOUR_API_KEY"
const response = await fetch("https://api.exhibitday.com/v1/tasks/comments", {
method: "GET",
headers: { "api_key": "YOUR_API_KEY" }
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.get(
"https://api.exhibitday.com/v1/tasks/comments",
headers={"api_key": "YOUR_API_KEY"},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.GetAsync("https://api.exhibitday.com/v1/tasks/comments");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks/comments"))
.header("api_key", "YOUR_API_KEY")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks/comments');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY'],
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks/comments')
request = Net::HTTP::Get.new(uri)
request['api_key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.exhibitday.com/v1/tasks/comments", nil)
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
GET /v1/tasks/comments - HTTP 200
{
"records_found": 1,
"total_records": 1,
"has_more": false,
"list_type": "task_comment",
"list_data": [
{
"id": 12345,
"comment": "Sample comment",
"comment_created_timestamp": "2026-10-28T16:00:00Z",
"comment_last_update_timestamp": "2026-10-28T16:00:00Z",
"commenter": {
"id": "11111111-2222-4333-8444-555555555555",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.invalid"
},
"event_id": null,
"task_id": 12345,
"task": {
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": "Uncategorized",
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z"
}
}
]
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. No query/body parameters are sent (the API key remains a header).
Retrieve a Single Task Comment by Id #
|
Sample Object
{
"id": 12345,
"comment": "Sample comment",
"comment_created_timestamp": "2026-10-28T16:00:00Z",
"comment_last_update_timestamp": "2026-10-28T16:00:00Z",
"commenter": {
"id": "11111111-2222-4333-8444-555555555555",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.invalid"
},
"event_id": null,
"task_id": 12345,
"task": {
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": "Uncategorized",
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z"
}
} |
Retrieves information about a specific task comment (using the "id" parameter).
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| id | Number | Yes |
Id of the specific task comment that you would like to retrieve.
|
Code Samples
curl -X GET "https://api.exhibitday.com/v1/tasks/comment?id=12345" -H "api_key: YOUR_API_KEY"
const response = await fetch("https://api.exhibitday.com/v1/tasks/comment?" + new URLSearchParams({ "id": "12345" }), {
method: "GET",
headers: { "api_key": "YOUR_API_KEY" }
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.get(
"https://api.exhibitday.com/v1/tasks/comment",
headers={"api_key": "YOUR_API_KEY"},
params={"id": 12345},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.GetAsync("https://api.exhibitday.com/v1/tasks/comment?id=12345");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks/comment?id=12345"))
.header("api_key", "YOUR_API_KEY")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks/comment?id=12345');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY'],
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks/comment?id=12345')
request = Net::HTTP::Get.new(uri)
request['api_key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.exhibitday.com/v1/tasks/comment?id=12345", nil)
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
GET /v1/tasks/comment - HTTP 200
{
"id": 12345,
"comment": "Sample comment",
"comment_created_timestamp": "2026-10-28T16:00:00Z",
"comment_last_update_timestamp": "2026-10-28T16:00:00Z",
"commenter": {
"id": "11111111-2222-4333-8444-555555555555",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@example.invalid"
},
"event_id": null,
"task_id": 12345,
"task": {
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": "Uncategorized",
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z"
}
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"id":12345}.
Add a Comment to a Task #
|
The response will contain an object representing the newly added task comment.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| task_id | Number | Yes |
The id of the task you would like to add the comment to.
|
|
| comment | String | Yes |
The text of the comment you would like to add. Only accepts plain text. Any HTML tags will be stripped. Newline characters are displayed as line breaks in ExhibitDay and remain newline characters in API responses. Accepts up to 15,000 characters (some symbols count as two characters).
|
Code Samples
curl -X POST https://api.exhibitday.com/v1/tasks/comment -H "api_key: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"task_id\":12345,\"comment\":\"Sample comment\"}"
const response = await fetch("https://api.exhibitday.com/v1/tasks/comment", {
method: "POST",
headers: { "api_key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ "task_id": 12345, "comment": "Sample comment" })
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.post(
"https://api.exhibitday.com/v1/tasks/comment",
headers={"api_key": "YOUR_API_KEY"},
json={"task_id": 12345, "comment": "Sample comment"},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using System.Net.Http.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.PostAsync("https://api.exhibitday.com/v1/tasks/comment",
JsonContent.Create(new { task_id = 12345, comment = "Sample comment" }));
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks/comment"))
.header("api_key", "YOUR_API_KEY")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"task_id\":12345,\"comment\":\"Sample comment\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks/comment');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"task_id":12345,"comment":"Sample comment"}',
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks/comment')
request = Net::HTTP::Post.new(uri)
request['api_key'] = 'YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = '{"task_id":12345,"comment":"Sample comment"}'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.exhibitday.com/v1/tasks/comment", strings.NewReader("{\"task_id\":12345,\"comment\":\"Sample comment\"}"))
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
request.Header.Set("Content-Type", "application/json")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
POST /v1/tasks/comment - HTTP 200
{
"id": 23456,
"comment": "Sample comment",
"comment_created_timestamp": "2026-10-28T16:00:00Z",
"comment_last_update_timestamp": "2026-10-28T16:00:00Z",
"commenter": {
"id": "ExhibitDay API",
"first_name": "ExhibitDay",
"last_name": "API",
"email": ""
},
"event_id": null,
"task_id": 12345,
"task": {
"id": 12345,
"exhibitday_url": "https://www.exhibitday.com/Workspace/TaskView/98765?tid=12345",
"event_task_section_id": null,
"event_task_section": "Uncategorized",
"display_rank": 0,
"name": "Sample task",
"due_date": null,
"assignee": null,
"is_completed": false,
"task_completed_timestamp": null,
"task_created_timestamp": "2026-10-28T16:00:00Z",
"task_last_update_timestamp": "2026-10-28T16:00:00Z"
}
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"task_id":12345,"comment":"Sample comment"}.
Update a Task Comment #
|
Updates the text of a given comment on a task. A comment cannot be moved to another task.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| id | Number | Yes |
The Id of the task comment you would like to update.
|
|
| comment | String | Yes |
The text that will replace the existing comment, including any formatting previously applied in ExhibitDay. Only accepts plain text. Any HTML tags will be stripped. Newline characters are displayed as line breaks in ExhibitDay and remain newline characters in API responses. Accepts up to 15,000 characters (some symbols count as two characters). A comment cannot be blank: an empty value (or null) is rejected with an error.
|
Code Samples
curl -X PATCH https://api.exhibitday.com/v1/tasks/comment -H "api_key: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"id\":12345,\"comment\":\"Updated comment\"}"
const response = await fetch("https://api.exhibitday.com/v1/tasks/comment", {
method: "PATCH",
headers: { "api_key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ "id": 12345, "comment": "Updated comment" })
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.patch(
"https://api.exhibitday.com/v1/tasks/comment",
headers={"api_key": "YOUR_API_KEY"},
json={"id": 12345, "comment": "Updated comment"},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using System.Net.Http.Json;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.PatchAsync("https://api.exhibitday.com/v1/tasks/comment",
JsonContent.Create(new { id = 12345, comment = "Updated comment" }));
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks/comment"))
.header("api_key", "YOUR_API_KEY")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("{\"id\":12345,\"comment\":\"Updated comment\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks/comment');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"id":12345,"comment":"Updated comment"}',
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks/comment')
request = Net::HTTP::Patch.new(uri)
request['api_key'] = 'YOUR_API_KEY'
request['Content-Type'] = 'application/json'
request.body = '{"id":12345,"comment":"Updated comment"}'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PATCH", "https://api.exhibitday.com/v1/tasks/comment", strings.NewReader("{\"id\":12345,\"comment\":\"Updated comment\"}"))
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
request.Header.Set("Content-Type", "application/json")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
PATCH /v1/tasks/comment - HTTP 200
{
"status_code": 200,
"status": "OK",
"message": "Task Comment Update Successful. Task comment updated via API.",
"errors": []
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"id":12345,"comment":"Updated comment"}.
Delete a Task Comment #
|
Permanently deletes a task comment. It cannot be undone.
Parameters
| Name | Type | Required? | Details | Description |
| api_key | String | Yes |
|
|
| id | Number | Yes |
The Id of the task comment you would like to delete.
|
Code Samples
curl -X DELETE "https://api.exhibitday.com/v1/tasks/comment?id=12345" -H "api_key: YOUR_API_KEY"
const response = await fetch("https://api.exhibitday.com/v1/tasks/comment?" + new URLSearchParams({ "id": "12345" }), {
method: "DELETE",
headers: { "api_key": "YOUR_API_KEY" }
});
const data = await response.json();
console.log(response.status, data);
import requests
response = requests.delete(
"https://api.exhibitday.com/v1/tasks/comment",
headers={"api_key": "YOUR_API_KEY"},
params={"id": 12345},
)
print(response.status_code, response.json())
using System;
using System.Net.Http;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("api_key", "YOUR_API_KEY");
var response = await client.DeleteAsync("https://api.exhibitday.com/v1/tasks/comment?id=12345");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ExhibitDayExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.exhibitday.com/v1/tasks/comment?id=12345"))
.header("api_key", "YOUR_API_KEY")
.method("DELETE", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
<?php
$curl = curl_init('https://api.exhibitday.com/v1/tasks/comment?id=12345');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['api_key: YOUR_API_KEY'],
]);
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException(curl_error($curl));
}
echo curl_getinfo($curl, CURLINFO_HTTP_CODE) . PHP_EOL . $response;
curl_close($curl);
require 'net/http'
require 'uri'
uri = URI('https://api.exhibitday.com/v1/tasks/comment?id=12345')
request = Net::HTTP::Delete.new(uri)
request['api_key'] = 'YOUR_API_KEY'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
request, err := http.NewRequest("DELETE", "https://api.exhibitday.com/v1/tasks/comment?id=12345", nil)
if err != nil { log.Fatal(err) }
request.Header.Set("api_key", "YOUR_API_KEY")
response, err := (&http.Client{}).Do(request)
if err != nil { log.Fatal(err) }
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil { log.Fatal(err) }
fmt.Printf("%d %s\n", response.StatusCode, body)
}
Example HTTP response body (JSON)
DELETE /v1/tasks/comment - HTTP 200
{
"status_code": 200,
"status": "OK",
"message": "Task Comment Deleted",
"errors": []
}
Note: Illustrative response. Assume the identified records exist in an illustrative workspace and the request succeeds. Generated IDs, related records and timestamps are illustrative. Item links use illustrative workspace 98765 and the DTO's configured application host (an illustrative production-host fallback is used only if absent). Timestamps are illustrative values formatted by the current API serializer; they do not establish the timezone semantics of stored timestamps. The default response representation is shown; documented options can select another shape. Reference labels are illustrative; assume the workspace uses the standard participation types with no custom choices. Request inputs: {"id":12345}.