Create an Event
curl --request POST \
--url https://public-api.stora.co/2025-09/timeline/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source": {
"id": "tsrc_126b43585fea94ad"
},
"template": {
"id": "aetpl_6b92d7693eb7e8e9"
},
"contact": {
"id": "con_9bc5a9d2d8302840"
},
"site": {
"id": "site_14b419f1096013f1"
},
"description": "CRM deal moved to Negotiation stage",
"external": {
"id": "deal_98442",
"url": "https://crm.example.com/deals/98442"
},
"variables": {
"deal_name": "10x10 Unit — 12 months",
"previous_state": "Qualified",
"new_state": "Negotiation"
}
}
'import requests
url = "https://public-api.stora.co/2025-09/timeline/events"
payload = {
"source": { "id": "tsrc_126b43585fea94ad" },
"template": { "id": "aetpl_6b92d7693eb7e8e9" },
"contact": { "id": "con_9bc5a9d2d8302840" },
"site": { "id": "site_14b419f1096013f1" },
"description": "CRM deal moved to Negotiation stage",
"external": {
"id": "deal_98442",
"url": "https://crm.example.com/deals/98442"
},
"variables": {
"deal_name": "10x10 Unit — 12 months",
"previous_state": "Qualified",
"new_state": "Negotiation"
}
}
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({
source: {id: 'tsrc_126b43585fea94ad'},
template: {id: 'aetpl_6b92d7693eb7e8e9'},
contact: {id: 'con_9bc5a9d2d8302840'},
site: {id: 'site_14b419f1096013f1'},
description: 'CRM deal moved to Negotiation stage',
external: {id: 'deal_98442', url: 'https://crm.example.com/deals/98442'},
variables: {
deal_name: '10x10 Unit — 12 months',
previous_state: 'Qualified',
new_state: 'Negotiation'
}
})
};
fetch('https://public-api.stora.co/2025-09/timeline/events', 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://public-api.stora.co/2025-09/timeline/events",
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([
'source' => [
'id' => 'tsrc_126b43585fea94ad'
],
'template' => [
'id' => 'aetpl_6b92d7693eb7e8e9'
],
'contact' => [
'id' => 'con_9bc5a9d2d8302840'
],
'site' => [
'id' => 'site_14b419f1096013f1'
],
'description' => 'CRM deal moved to Negotiation stage',
'external' => [
'id' => 'deal_98442',
'url' => 'https://crm.example.com/deals/98442'
],
'variables' => [
'deal_name' => '10x10 Unit — 12 months',
'previous_state' => 'Qualified',
'new_state' => 'Negotiation'
]
]),
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://public-api.stora.co/2025-09/timeline/events"
payload := strings.NewReader("{\n \"source\": {\n \"id\": \"tsrc_126b43585fea94ad\"\n },\n \"template\": {\n \"id\": \"aetpl_6b92d7693eb7e8e9\"\n },\n \"contact\": {\n \"id\": \"con_9bc5a9d2d8302840\"\n },\n \"site\": {\n \"id\": \"site_14b419f1096013f1\"\n },\n \"description\": \"CRM deal moved to Negotiation stage\",\n \"external\": {\n \"id\": \"deal_98442\",\n \"url\": \"https://crm.example.com/deals/98442\"\n },\n \"variables\": {\n \"deal_name\": \"10x10 Unit — 12 months\",\n \"previous_state\": \"Qualified\",\n \"new_state\": \"Negotiation\"\n }\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://public-api.stora.co/2025-09/timeline/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source\": {\n \"id\": \"tsrc_126b43585fea94ad\"\n },\n \"template\": {\n \"id\": \"aetpl_6b92d7693eb7e8e9\"\n },\n \"contact\": {\n \"id\": \"con_9bc5a9d2d8302840\"\n },\n \"site\": {\n \"id\": \"site_14b419f1096013f1\"\n },\n \"description\": \"CRM deal moved to Negotiation stage\",\n \"external\": {\n \"id\": \"deal_98442\",\n \"url\": \"https://crm.example.com/deals/98442\"\n },\n \"variables\": {\n \"deal_name\": \"10x10 Unit — 12 months\",\n \"previous_state\": \"Qualified\",\n \"new_state\": \"Negotiation\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/timeline/events")
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 \"source\": {\n \"id\": \"tsrc_126b43585fea94ad\"\n },\n \"template\": {\n \"id\": \"aetpl_6b92d7693eb7e8e9\"\n },\n \"contact\": {\n \"id\": \"con_9bc5a9d2d8302840\"\n },\n \"site\": {\n \"id\": \"site_14b419f1096013f1\"\n },\n \"description\": \"CRM deal moved to Negotiation stage\",\n \"external\": {\n \"id\": \"deal_98442\",\n \"url\": \"https://crm.example.com/deals/98442\"\n },\n \"variables\": {\n \"deal_name\": \"10x10 Unit — 12 months\",\n \"previous_state\": \"Qualified\",\n \"new_state\": \"Negotiation\"\n }\n}"
response = http.request(request)
puts response.read_body{
"event": {
"id": "aevt_327151655672f2cc",
"contact": {
"id": "con_9bc5a9d2d8302840"
},
"created_at": "2025-02-22T14:41:00Z",
"creator": {
"id": "app_99b90b9d208a137b"
},
"description": "CRM deal moved to Negotiation stage",
"external": {
"id": "deal_98442",
"url": "https://crm.example.com/deals/98442"
},
"invoice": null,
"site": {
"id": "site_14b419f1096013f1"
},
"source": {
"id": "tsrc_126b43585fea94ad"
},
"subscription": null,
"template": {
"id": "aetpl_6b92d7693eb7e8e9"
},
"tenancy": null,
"unit": null,
"unit_type": null,
"updated_at": "2025-02-22T14:41:00Z",
"variables": {
"deal_name": "10x10 Unit — 12 months",
"previous_state": "Qualified",
"new_state": "Negotiation"
}
},
"meta": {
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"curies": [
{
"name": "bo",
"href": "https://app.stora.test{rel}",
"templated": true,
"title": "Backoffice"
},
{
"name": "sf",
"href": "https://acme.stora.test{rel}",
"templated": true,
"title": "Storefront"
}
]
}
}{
"error": {
"code": "invalid_content",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "The request body content is not valid.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}Timeline / Events
Create an Event
Create a new timeline event from an external source.
Check the template you want to use to see which required pre-defined variables it includes. Custom variables are not enforced on creation.
Required authorization scope: public.timeline_event:write
POST
/
2025-09
/
timeline
/
events
Create an Event
curl --request POST \
--url https://public-api.stora.co/2025-09/timeline/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source": {
"id": "tsrc_126b43585fea94ad"
},
"template": {
"id": "aetpl_6b92d7693eb7e8e9"
},
"contact": {
"id": "con_9bc5a9d2d8302840"
},
"site": {
"id": "site_14b419f1096013f1"
},
"description": "CRM deal moved to Negotiation stage",
"external": {
"id": "deal_98442",
"url": "https://crm.example.com/deals/98442"
},
"variables": {
"deal_name": "10x10 Unit — 12 months",
"previous_state": "Qualified",
"new_state": "Negotiation"
}
}
'import requests
url = "https://public-api.stora.co/2025-09/timeline/events"
payload = {
"source": { "id": "tsrc_126b43585fea94ad" },
"template": { "id": "aetpl_6b92d7693eb7e8e9" },
"contact": { "id": "con_9bc5a9d2d8302840" },
"site": { "id": "site_14b419f1096013f1" },
"description": "CRM deal moved to Negotiation stage",
"external": {
"id": "deal_98442",
"url": "https://crm.example.com/deals/98442"
},
"variables": {
"deal_name": "10x10 Unit — 12 months",
"previous_state": "Qualified",
"new_state": "Negotiation"
}
}
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({
source: {id: 'tsrc_126b43585fea94ad'},
template: {id: 'aetpl_6b92d7693eb7e8e9'},
contact: {id: 'con_9bc5a9d2d8302840'},
site: {id: 'site_14b419f1096013f1'},
description: 'CRM deal moved to Negotiation stage',
external: {id: 'deal_98442', url: 'https://crm.example.com/deals/98442'},
variables: {
deal_name: '10x10 Unit — 12 months',
previous_state: 'Qualified',
new_state: 'Negotiation'
}
})
};
fetch('https://public-api.stora.co/2025-09/timeline/events', 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://public-api.stora.co/2025-09/timeline/events",
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([
'source' => [
'id' => 'tsrc_126b43585fea94ad'
],
'template' => [
'id' => 'aetpl_6b92d7693eb7e8e9'
],
'contact' => [
'id' => 'con_9bc5a9d2d8302840'
],
'site' => [
'id' => 'site_14b419f1096013f1'
],
'description' => 'CRM deal moved to Negotiation stage',
'external' => [
'id' => 'deal_98442',
'url' => 'https://crm.example.com/deals/98442'
],
'variables' => [
'deal_name' => '10x10 Unit — 12 months',
'previous_state' => 'Qualified',
'new_state' => 'Negotiation'
]
]),
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://public-api.stora.co/2025-09/timeline/events"
payload := strings.NewReader("{\n \"source\": {\n \"id\": \"tsrc_126b43585fea94ad\"\n },\n \"template\": {\n \"id\": \"aetpl_6b92d7693eb7e8e9\"\n },\n \"contact\": {\n \"id\": \"con_9bc5a9d2d8302840\"\n },\n \"site\": {\n \"id\": \"site_14b419f1096013f1\"\n },\n \"description\": \"CRM deal moved to Negotiation stage\",\n \"external\": {\n \"id\": \"deal_98442\",\n \"url\": \"https://crm.example.com/deals/98442\"\n },\n \"variables\": {\n \"deal_name\": \"10x10 Unit — 12 months\",\n \"previous_state\": \"Qualified\",\n \"new_state\": \"Negotiation\"\n }\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://public-api.stora.co/2025-09/timeline/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source\": {\n \"id\": \"tsrc_126b43585fea94ad\"\n },\n \"template\": {\n \"id\": \"aetpl_6b92d7693eb7e8e9\"\n },\n \"contact\": {\n \"id\": \"con_9bc5a9d2d8302840\"\n },\n \"site\": {\n \"id\": \"site_14b419f1096013f1\"\n },\n \"description\": \"CRM deal moved to Negotiation stage\",\n \"external\": {\n \"id\": \"deal_98442\",\n \"url\": \"https://crm.example.com/deals/98442\"\n },\n \"variables\": {\n \"deal_name\": \"10x10 Unit — 12 months\",\n \"previous_state\": \"Qualified\",\n \"new_state\": \"Negotiation\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/timeline/events")
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 \"source\": {\n \"id\": \"tsrc_126b43585fea94ad\"\n },\n \"template\": {\n \"id\": \"aetpl_6b92d7693eb7e8e9\"\n },\n \"contact\": {\n \"id\": \"con_9bc5a9d2d8302840\"\n },\n \"site\": {\n \"id\": \"site_14b419f1096013f1\"\n },\n \"description\": \"CRM deal moved to Negotiation stage\",\n \"external\": {\n \"id\": \"deal_98442\",\n \"url\": \"https://crm.example.com/deals/98442\"\n },\n \"variables\": {\n \"deal_name\": \"10x10 Unit — 12 months\",\n \"previous_state\": \"Qualified\",\n \"new_state\": \"Negotiation\"\n }\n}"
response = http.request(request)
puts response.read_body{
"event": {
"id": "aevt_327151655672f2cc",
"contact": {
"id": "con_9bc5a9d2d8302840"
},
"created_at": "2025-02-22T14:41:00Z",
"creator": {
"id": "app_99b90b9d208a137b"
},
"description": "CRM deal moved to Negotiation stage",
"external": {
"id": "deal_98442",
"url": "https://crm.example.com/deals/98442"
},
"invoice": null,
"site": {
"id": "site_14b419f1096013f1"
},
"source": {
"id": "tsrc_126b43585fea94ad"
},
"subscription": null,
"template": {
"id": "aetpl_6b92d7693eb7e8e9"
},
"tenancy": null,
"unit": null,
"unit_type": null,
"updated_at": "2025-02-22T14:41:00Z",
"variables": {
"deal_name": "10x10 Unit — 12 months",
"previous_state": "Qualified",
"new_state": "Negotiation"
}
},
"meta": {
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"curies": [
{
"name": "bo",
"href": "https://app.stora.test{rel}",
"templated": true,
"title": "Backoffice"
},
{
"name": "sf",
"href": "https://acme.stora.test{rel}",
"templated": true,
"title": "Storefront"
}
]
}
}{
"error": {
"code": "invalid_content",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "The request body content is not valid.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}Authorizations
BearerOAuth2
Bearer Token necessary to use API
Query Parameters
This endpoint supports expandable responses. For more, see the documentation page.
Body
application/json
Create Event Request
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
⌘I