curl --request POST \
--url https://api.example.com/v1/custom-products \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"name": "<string>",
"productKey": "<string>",
"metadata": {},
"isDefault": true,
"featureAccess": [
{
"featureKey": "<string>",
"hasAccess": true,
"limit": 1,
"isUnlimited": true
}
]
}
'import requests
url = "https://api.example.com/v1/custom-products"
payload = {
"name": "<string>",
"productKey": "<string>",
"metadata": {},
"isDefault": True,
"featureAccess": [
{
"featureKey": "<string>",
"hasAccess": True,
"limit": 1,
"isUnlimited": True
}
]
}
headers = {
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
productKey: '<string>',
metadata: {},
isDefault: true,
featureAccess: [{featureKey: '<string>', hasAccess: true, limit: 1, isUnlimited: true}]
})
};
fetch('https://api.example.com/v1/custom-products', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/custom-products",
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' => '<string>',
'productKey' => '<string>',
'metadata' => [
],
'isDefault' => true,
'featureAccess' => [
[
'featureKey' => '<string>',
'hasAccess' => true,
'limit' => 1,
'isUnlimited' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/custom-products"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"productKey\": \"<string>\",\n \"metadata\": {},\n \"isDefault\": true,\n \"featureAccess\": [\n {\n \"featureKey\": \"<string>\",\n \"hasAccess\": true,\n \"limit\": 1,\n \"isUnlimited\": true\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/custom-products")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"productKey\": \"<string>\",\n \"metadata\": {},\n \"isDefault\": true,\n \"featureAccess\": [\n {\n \"featureKey\": \"<string>\",\n \"hasAccess\": true,\n \"limit\": 1,\n \"isUnlimited\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/custom-products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"productKey\": \"<string>\",\n \"metadata\": {},\n \"isDefault\": true,\n \"featureAccess\": [\n {\n \"featureKey\": \"<string>\",\n \"hasAccess\": true,\n \"limit\": 1,\n \"isUnlimited\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"key": "<string>",
"name": "<string>",
"isDefault": true,
"version": 123,
"stripeProductId": "<string>",
"metadata": {},
"prices": [
{
"id": "<string>",
"stripePriceId": "<string>",
"currency": "<string>",
"unitAmount": 123,
"recurringInterval": "<string>",
"recurringIntervalCount": 123,
"isActive": true,
"isDefault": true
}
],
"featureAccess": [
{
"featureKey": "<string>",
"name": "<string>",
"hasAccess": true,
"limit": 123,
"isUnlimited": true
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Create Custom Product
Create a custom product, optionally with its complete feature access configuration and as the default product.
curl --request POST \
--url https://api.example.com/v1/custom-products \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '
{
"name": "<string>",
"productKey": "<string>",
"metadata": {},
"isDefault": true,
"featureAccess": [
{
"featureKey": "<string>",
"hasAccess": true,
"limit": 1,
"isUnlimited": true
}
]
}
'import requests
url = "https://api.example.com/v1/custom-products"
payload = {
"name": "<string>",
"productKey": "<string>",
"metadata": {},
"isDefault": True,
"featureAccess": [
{
"featureKey": "<string>",
"hasAccess": True,
"limit": 1,
"isUnlimited": True
}
]
}
headers = {
"x-api-key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
productKey: '<string>',
metadata: {},
isDefault: true,
featureAccess: [{featureKey: '<string>', hasAccess: true, limit: 1, isUnlimited: true}]
})
};
fetch('https://api.example.com/v1/custom-products', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/custom-products",
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' => '<string>',
'productKey' => '<string>',
'metadata' => [
],
'isDefault' => true,
'featureAccess' => [
[
'featureKey' => '<string>',
'hasAccess' => true,
'limit' => 1,
'isUnlimited' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <x-api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/custom-products"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"productKey\": \"<string>\",\n \"metadata\": {},\n \"isDefault\": true,\n \"featureAccess\": [\n {\n \"featureKey\": \"<string>\",\n \"hasAccess\": true,\n \"limit\": 1,\n \"isUnlimited\": true\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<x-api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/custom-products")
.header("x-api-key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"productKey\": \"<string>\",\n \"metadata\": {},\n \"isDefault\": true,\n \"featureAccess\": [\n {\n \"featureKey\": \"<string>\",\n \"hasAccess\": true,\n \"limit\": 1,\n \"isUnlimited\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/custom-products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"productKey\": \"<string>\",\n \"metadata\": {},\n \"isDefault\": true,\n \"featureAccess\": [\n {\n \"featureKey\": \"<string>\",\n \"hasAccess\": true,\n \"limit\": 1,\n \"isUnlimited\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"key": "<string>",
"name": "<string>",
"isDefault": true,
"version": 123,
"stripeProductId": "<string>",
"metadata": {},
"prices": [
{
"id": "<string>",
"stripePriceId": "<string>",
"currency": "<string>",
"unitAmount": 123,
"recurringInterval": "<string>",
"recurringIntervalCount": 123,
"isActive": true,
"isDefault": true
}
],
"featureAccess": [
{
"featureKey": "<string>",
"name": "<string>",
"hasAccess": true,
"limit": 123,
"isUnlimited": true
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Headers
API key from your PriceOS dashboard.
Body
Custom product name.
Stable custom product key.
Custom product metadata.
Show child attributes
Show child attributes
Whether to make this the default custom product.
Complete desired feature access configuration for the product.
Show child attributes
Show child attributes
Response
Custom product created
Product.
Product ID.
Product key.
Product name.
Product type.
stripe, custom Whether this is the default custom product.
Product version number.
Stripe product ID (Stripe products only).
Custom product metadata (custom products only).
Show child attributes
Show child attributes
Stripe prices linked to the product.
Show child attributes
Show child attributes
Feature access entries configured for this product.
Show child attributes
Show child attributes