Create a Line Item
curl --request POST \
--url https://public-api.stora.co/2025-09/orders/{order_id}/line_items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "unit_type",
"quantity": 1,
"price": {
"amount": 1999
},
"item": {
"id": "utype_3b3aed5cca33b11d"
}
}
'import requests
url = "https://public-api.stora.co/2025-09/orders/{order_id}/line_items"
payload = {
"type": "unit_type",
"quantity": 1,
"price": { "amount": 1999 },
"item": { "id": "utype_3b3aed5cca33b11d" }
}
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({
type: 'unit_type',
quantity: 1,
price: {amount: 1999},
item: {id: 'utype_3b3aed5cca33b11d'}
})
};
fetch('https://public-api.stora.co/2025-09/orders/{order_id}/line_items', 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/orders/{order_id}/line_items",
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([
'type' => 'unit_type',
'quantity' => 1,
'price' => [
'amount' => 1999
],
'item' => [
'id' => 'utype_3b3aed5cca33b11d'
]
]),
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/orders/{order_id}/line_items"
payload := strings.NewReader("{\n \"type\": \"unit_type\",\n \"quantity\": 1,\n \"price\": {\n \"amount\": 1999\n },\n \"item\": {\n \"id\": \"utype_3b3aed5cca33b11d\"\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/orders/{order_id}/line_items")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"unit_type\",\n \"quantity\": 1,\n \"price\": {\n \"amount\": 1999\n },\n \"item\": {\n \"id\": \"utype_3b3aed5cca33b11d\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/orders/{order_id}/line_items")
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 \"type\": \"unit_type\",\n \"quantity\": 1,\n \"price\": {\n \"amount\": 1999\n },\n \"item\": {\n \"id\": \"utype_3b3aed5cca33b11d\"\n }\n}"
response = http.request(request)
puts response.read_body{
"line_item": {
"id": "olitm_216f3087ddaf1234",
"created_at": "2025-02-22T14:41:00Z",
"discount_total": {
"amount": 1000,
"currency": "GBP",
"formatted": "£10.00"
},
"item": {
"id": "utype_3b3aed5cca33b11d"
},
"price": {
"amount": 1999,
"currency": "GBP",
"formatted": "£19.99"
},
"quantity": 1,
"tax": {
"amount": 0,
"currency": "GBP",
"formatted": "£0.00"
},
"total": {
"amount": 1999,
"currency": "GBP",
"formatted": "£19.99"
},
"total_excluding_tax": {
"amount": 1999,
"currency": "GBP",
"formatted": "£19.99"
},
"type": "unit_type",
"updated_at": "2025-02-22T14:41:00Z"
},
"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": "conflict",
"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 order must be in the draft status to modify its line items. The current status is completed.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_content",
"details": [
{
"message": "Missing item ID",
"pointer": "/item/id"
}
],
"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"
}
}Orders / Line Items
Create a Line Item
Create a new line item for the order. Create a new line item can be done only when the order is in draft status.
Required authorization scope: public.order:write
POST
/
2025-09
/
orders
/
{order_id}
/
line_items
Create a Line Item
curl --request POST \
--url https://public-api.stora.co/2025-09/orders/{order_id}/line_items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "unit_type",
"quantity": 1,
"price": {
"amount": 1999
},
"item": {
"id": "utype_3b3aed5cca33b11d"
}
}
'import requests
url = "https://public-api.stora.co/2025-09/orders/{order_id}/line_items"
payload = {
"type": "unit_type",
"quantity": 1,
"price": { "amount": 1999 },
"item": { "id": "utype_3b3aed5cca33b11d" }
}
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({
type: 'unit_type',
quantity: 1,
price: {amount: 1999},
item: {id: 'utype_3b3aed5cca33b11d'}
})
};
fetch('https://public-api.stora.co/2025-09/orders/{order_id}/line_items', 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/orders/{order_id}/line_items",
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([
'type' => 'unit_type',
'quantity' => 1,
'price' => [
'amount' => 1999
],
'item' => [
'id' => 'utype_3b3aed5cca33b11d'
]
]),
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/orders/{order_id}/line_items"
payload := strings.NewReader("{\n \"type\": \"unit_type\",\n \"quantity\": 1,\n \"price\": {\n \"amount\": 1999\n },\n \"item\": {\n \"id\": \"utype_3b3aed5cca33b11d\"\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/orders/{order_id}/line_items")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"unit_type\",\n \"quantity\": 1,\n \"price\": {\n \"amount\": 1999\n },\n \"item\": {\n \"id\": \"utype_3b3aed5cca33b11d\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/orders/{order_id}/line_items")
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 \"type\": \"unit_type\",\n \"quantity\": 1,\n \"price\": {\n \"amount\": 1999\n },\n \"item\": {\n \"id\": \"utype_3b3aed5cca33b11d\"\n }\n}"
response = http.request(request)
puts response.read_body{
"line_item": {
"id": "olitm_216f3087ddaf1234",
"created_at": "2025-02-22T14:41:00Z",
"discount_total": {
"amount": 1000,
"currency": "GBP",
"formatted": "£10.00"
},
"item": {
"id": "utype_3b3aed5cca33b11d"
},
"price": {
"amount": 1999,
"currency": "GBP",
"formatted": "£19.99"
},
"quantity": 1,
"tax": {
"amount": 0,
"currency": "GBP",
"formatted": "£0.00"
},
"total": {
"amount": 1999,
"currency": "GBP",
"formatted": "£19.99"
},
"total_excluding_tax": {
"amount": 1999,
"currency": "GBP",
"formatted": "£19.99"
},
"type": "unit_type",
"updated_at": "2025-02-22T14:41:00Z"
},
"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": "conflict",
"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 order must be in the draft status to modify its line items. The current status is completed.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_content",
"details": [
{
"message": "Missing item ID",
"pointer": "/item/id"
}
],
"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"
}
}This endpoint is changing in a breaking way as we restructure how Protection Levels work. Contact us at api_support@stora.co and read this guide before starting any integration.
Authorizations
BearerOAuth2
Bearer Token necessary to use API
Path Parameters
The ID of the order
Query Parameters
This endpoint supports expandable responses. For more, see the documentation page.
Body
application/json
Was this page helpful?