Create a Deal
curl --request POST \
--url https://public-api.stora.co/2025-09/deals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Acme Corp Storage",
"contact": {
"id": "con_1234567890abcdef"
},
"stage": {
"id": "dstg_127b3057d5df338e"
},
"line_items": [
{
"type": "unit_type",
"item": {
"id": "utype_f18fc91387cdf710"
}
},
{
"type": "protection",
"item": {
"id": "plvl_e8f3ad0a07e47566"
}
}
]
}
'import requests
url = "https://public-api.stora.co/2025-09/deals"
payload = {
"name": "Acme Corp Storage",
"contact": { "id": "con_1234567890abcdef" },
"stage": { "id": "dstg_127b3057d5df338e" },
"line_items": [
{
"type": "unit_type",
"item": { "id": "utype_f18fc91387cdf710" }
},
{
"type": "protection",
"item": { "id": "plvl_e8f3ad0a07e47566" }
}
]
}
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({
name: 'Acme Corp Storage',
contact: {id: 'con_1234567890abcdef'},
stage: {id: 'dstg_127b3057d5df338e'},
line_items: [
{type: 'unit_type', item: {id: 'utype_f18fc91387cdf710'}},
{type: 'protection', item: {id: 'plvl_e8f3ad0a07e47566'}}
]
})
};
fetch('https://public-api.stora.co/2025-09/deals', 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/deals",
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([
'name' => 'Acme Corp Storage',
'contact' => [
'id' => 'con_1234567890abcdef'
],
'stage' => [
'id' => 'dstg_127b3057d5df338e'
],
'line_items' => [
[
'type' => 'unit_type',
'item' => [
'id' => 'utype_f18fc91387cdf710'
]
],
[
'type' => 'protection',
'item' => [
'id' => 'plvl_e8f3ad0a07e47566'
]
]
]
]),
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/deals"
payload := strings.NewReader("{\n \"name\": \"Acme Corp Storage\",\n \"contact\": {\n \"id\": \"con_1234567890abcdef\"\n },\n \"stage\": {\n \"id\": \"dstg_127b3057d5df338e\"\n },\n \"line_items\": [\n {\n \"type\": \"unit_type\",\n \"item\": {\n \"id\": \"utype_f18fc91387cdf710\"\n }\n },\n {\n \"type\": \"protection\",\n \"item\": {\n \"id\": \"plvl_e8f3ad0a07e47566\"\n }\n }\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/deals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Acme Corp Storage\",\n \"contact\": {\n \"id\": \"con_1234567890abcdef\"\n },\n \"stage\": {\n \"id\": \"dstg_127b3057d5df338e\"\n },\n \"line_items\": [\n {\n \"type\": \"unit_type\",\n \"item\": {\n \"id\": \"utype_f18fc91387cdf710\"\n }\n },\n {\n \"type\": \"protection\",\n \"item\": {\n \"id\": \"plvl_e8f3ad0a07e47566\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/deals")
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 \"name\": \"Acme Corp Storage\",\n \"contact\": {\n \"id\": \"con_1234567890abcdef\"\n },\n \"stage\": {\n \"id\": \"dstg_127b3057d5df338e\"\n },\n \"line_items\": [\n {\n \"type\": \"unit_type\",\n \"item\": {\n \"id\": \"utype_f18fc91387cdf710\"\n }\n },\n {\n \"type\": \"protection\",\n \"item\": {\n \"id\": \"plvl_e8f3ad0a07e47566\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"deal": {
"id": "deal_a1b2c3d4e5f67890",
"assignee": null,
"contact": {
"id": "con_1234567890abcdef"
},
"created_at": "2025-02-22T14:41:00Z",
"creator": {
"id": "app_99b90b9d208a137b"
},
"line_items": [
{
"item": {
"id": "plvl_e8f3ad0a07e47566"
},
"quantity": 1,
"type": "protection"
},
{
"item": {
"id": "utype_f18fc91387cdf710"
},
"quantity": 1,
"type": "unit_type"
}
],
"lost_reason": null,
"metadata": {},
"name": "Acme Corp Storage",
"note": null,
"site": null,
"stage": {
"id": "dstg_127b3057d5df338e"
},
"starts_at": null,
"status": "open",
"updated_at": "2025-02-22T14:41:00Z",
"value_estimate": null
},
"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": "resource_not_found",
"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 Contact was not found.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_content",
"details": [
{
"message": "must contain at most one item per type",
"pointer": "/line_items"
}
],
"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"
}
}Deals
Create a Deal
Create a new deal.
Required authorization scope: public.deal:write
POST
/
2025-09
/
deals
Create a Deal
curl --request POST \
--url https://public-api.stora.co/2025-09/deals \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Acme Corp Storage",
"contact": {
"id": "con_1234567890abcdef"
},
"stage": {
"id": "dstg_127b3057d5df338e"
},
"line_items": [
{
"type": "unit_type",
"item": {
"id": "utype_f18fc91387cdf710"
}
},
{
"type": "protection",
"item": {
"id": "plvl_e8f3ad0a07e47566"
}
}
]
}
'import requests
url = "https://public-api.stora.co/2025-09/deals"
payload = {
"name": "Acme Corp Storage",
"contact": { "id": "con_1234567890abcdef" },
"stage": { "id": "dstg_127b3057d5df338e" },
"line_items": [
{
"type": "unit_type",
"item": { "id": "utype_f18fc91387cdf710" }
},
{
"type": "protection",
"item": { "id": "plvl_e8f3ad0a07e47566" }
}
]
}
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({
name: 'Acme Corp Storage',
contact: {id: 'con_1234567890abcdef'},
stage: {id: 'dstg_127b3057d5df338e'},
line_items: [
{type: 'unit_type', item: {id: 'utype_f18fc91387cdf710'}},
{type: 'protection', item: {id: 'plvl_e8f3ad0a07e47566'}}
]
})
};
fetch('https://public-api.stora.co/2025-09/deals', 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/deals",
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([
'name' => 'Acme Corp Storage',
'contact' => [
'id' => 'con_1234567890abcdef'
],
'stage' => [
'id' => 'dstg_127b3057d5df338e'
],
'line_items' => [
[
'type' => 'unit_type',
'item' => [
'id' => 'utype_f18fc91387cdf710'
]
],
[
'type' => 'protection',
'item' => [
'id' => 'plvl_e8f3ad0a07e47566'
]
]
]
]),
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/deals"
payload := strings.NewReader("{\n \"name\": \"Acme Corp Storage\",\n \"contact\": {\n \"id\": \"con_1234567890abcdef\"\n },\n \"stage\": {\n \"id\": \"dstg_127b3057d5df338e\"\n },\n \"line_items\": [\n {\n \"type\": \"unit_type\",\n \"item\": {\n \"id\": \"utype_f18fc91387cdf710\"\n }\n },\n {\n \"type\": \"protection\",\n \"item\": {\n \"id\": \"plvl_e8f3ad0a07e47566\"\n }\n }\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/deals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Acme Corp Storage\",\n \"contact\": {\n \"id\": \"con_1234567890abcdef\"\n },\n \"stage\": {\n \"id\": \"dstg_127b3057d5df338e\"\n },\n \"line_items\": [\n {\n \"type\": \"unit_type\",\n \"item\": {\n \"id\": \"utype_f18fc91387cdf710\"\n }\n },\n {\n \"type\": \"protection\",\n \"item\": {\n \"id\": \"plvl_e8f3ad0a07e47566\"\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/deals")
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 \"name\": \"Acme Corp Storage\",\n \"contact\": {\n \"id\": \"con_1234567890abcdef\"\n },\n \"stage\": {\n \"id\": \"dstg_127b3057d5df338e\"\n },\n \"line_items\": [\n {\n \"type\": \"unit_type\",\n \"item\": {\n \"id\": \"utype_f18fc91387cdf710\"\n }\n },\n {\n \"type\": \"protection\",\n \"item\": {\n \"id\": \"plvl_e8f3ad0a07e47566\"\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"deal": {
"id": "deal_a1b2c3d4e5f67890",
"assignee": null,
"contact": {
"id": "con_1234567890abcdef"
},
"created_at": "2025-02-22T14:41:00Z",
"creator": {
"id": "app_99b90b9d208a137b"
},
"line_items": [
{
"item": {
"id": "plvl_e8f3ad0a07e47566"
},
"quantity": 1,
"type": "protection"
},
{
"item": {
"id": "utype_f18fc91387cdf710"
},
"quantity": 1,
"type": "unit_type"
}
],
"lost_reason": null,
"metadata": {},
"name": "Acme Corp Storage",
"note": null,
"site": null,
"stage": {
"id": "dstg_127b3057d5df338e"
},
"starts_at": null,
"status": "open",
"updated_at": "2025-02-22T14:41:00Z",
"value_estimate": null
},
"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": "resource_not_found",
"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 Contact was not found.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_content",
"details": [
{
"message": "must contain at most one item per type",
"pointer": "/line_items"
}
],
"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 Deal Request
The name of the deal
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Free-text note for the deal. Displayed under 'Deal value estimate' in Backoffice.
The intended move-in date
Set of key-value pairs for storing additional information on the deal. Learn more about metadata.
Show child attributes
Show child attributes
List of line items for the deal. At most one item per type is allowed.
Maximum array length:
2Deal Unit Type Line Item
- Option 1
- Option 2
Show child attributes
Show child attributes
Was this page helpful?
⌘I