import { Crevio } from "@crevio/sdk";
const crevio = new Crevio({
apiKey: process.env["CREVIO_API_KEY"] ?? "",
});
async function run() {
const result = await crevio.products.create({
images: [
"file_abc123",
],
});
console.log(result);
}
run();curl --request POST \
--url https://api.crevio.co/v1/products \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"metadata": {}
}'import requests
url = "https://api.crevio.co/v1/products"
payload = { "metadata": {} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({metadata: {}})
};
fetch('https://api.crevio.co/v1/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.crevio.co/v1/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([
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.crevio.co/v1/products"
payload := strings.NewReader("{\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.crevio.co/v1/products")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.crevio.co/v1/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"name": "<string>",
"slug": "<string>",
"status": "draft",
"description": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"metadata": {},
"body_html": "<string>",
"button_cta": "<string>",
"url": "<string>",
"available_from": "2023-11-07T05:31:56Z",
"available_until": "2023-11-07T05:31:56Z",
"published_at": "2023-11-07T05:31:56Z",
"reviews_count": 123,
"average_rating": 123,
"media_gallery": [
{
"id": "<string>",
"type": "<string>",
"category": "image",
"url": "<string>"
}
],
"price_variants": [
{
"id": "<string>",
"object": "<string>",
"name": "<string>",
"amount": 123,
"amount_type": "free",
"billing_type": "subscription",
"recurring_interval": "day",
"interval_count": 123,
"installment_count": 123,
"setup_fee_amount": 123,
"trial_period_days": 123,
"revoke_after_days": 123,
"quantity_available": 123,
"archived": true,
"position": 123,
"hidden": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"currency": "<string>",
"discounted_from_amount": 123,
"minimum_amount": 123,
"maximum_amount": 123,
"preset_amount": 123,
"waitlist": true,
"purchase_url": "<string>",
"product": "<string>",
"benefits": [
"<string>"
]
}
],
"seo": "<string>",
"reviews": [
{
"id": "<string>",
"object": "<string>",
"rating": 123,
"customer_name": "<string>",
"content": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"customer_image_url": "<string>"
}
]
}{
"error": {
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request was malformed or contained invalid parameters"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "You did not provide an API key."
}
}{
"error": {
"type": "invalid_request_error",
"code": "forbidden",
"message": "You do not have permission to perform this action"
}
}{
"error": {
"type": "validation_error",
"code": "validation_failed",
"message": "Email is required",
"errors": {
"email": [
"can't be blank"
]
}
}
}{
"error": {
"type": "invalid_request_error",
"code": "rate_limit_exceeded",
"message": "Too many requests. Please retry later."
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "An unexpected error occurred"
}
}Create product
Creates a new product. A product can’t be set to active until it has at least one price variant — create it as draft (the default), add a price variant via POST /price_variants, then PATCH the product to active.
import { Crevio } from "@crevio/sdk";
const crevio = new Crevio({
apiKey: process.env["CREVIO_API_KEY"] ?? "",
});
async function run() {
const result = await crevio.products.create({
images: [
"file_abc123",
],
});
console.log(result);
}
run();curl --request POST \
--url https://api.crevio.co/v1/products \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '{
"metadata": {}
}'import requests
url = "https://api.crevio.co/v1/products"
payload = { "metadata": {} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({metadata: {}})
};
fetch('https://api.crevio.co/v1/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.crevio.co/v1/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([
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.crevio.co/v1/products"
payload := strings.NewReader("{\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.crevio.co/v1/products")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.crevio.co/v1/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "<string>",
"name": "<string>",
"slug": "<string>",
"status": "draft",
"description": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"metadata": {},
"body_html": "<string>",
"button_cta": "<string>",
"url": "<string>",
"available_from": "2023-11-07T05:31:56Z",
"available_until": "2023-11-07T05:31:56Z",
"published_at": "2023-11-07T05:31:56Z",
"reviews_count": 123,
"average_rating": 123,
"media_gallery": [
{
"id": "<string>",
"type": "<string>",
"category": "image",
"url": "<string>"
}
],
"price_variants": [
{
"id": "<string>",
"object": "<string>",
"name": "<string>",
"amount": 123,
"amount_type": "free",
"billing_type": "subscription",
"recurring_interval": "day",
"interval_count": 123,
"installment_count": 123,
"setup_fee_amount": 123,
"trial_period_days": 123,
"revoke_after_days": 123,
"quantity_available": 123,
"archived": true,
"position": 123,
"hidden": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"currency": "<string>",
"discounted_from_amount": 123,
"minimum_amount": 123,
"maximum_amount": 123,
"preset_amount": 123,
"waitlist": true,
"purchase_url": "<string>",
"product": "<string>",
"benefits": [
"<string>"
]
}
],
"seo": "<string>",
"reviews": [
{
"id": "<string>",
"object": "<string>",
"rating": 123,
"customer_name": "<string>",
"content": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"customer_image_url": "<string>"
}
]
}{
"error": {
"type": "invalid_request_error",
"code": "bad_request",
"message": "The request was malformed or contained invalid parameters"
}
}{
"error": {
"type": "invalid_request_error",
"code": "authentication_required",
"message": "You did not provide an API key."
}
}{
"error": {
"type": "invalid_request_error",
"code": "forbidden",
"message": "You do not have permission to perform this action"
}
}{
"error": {
"type": "validation_error",
"code": "validation_failed",
"message": "Email is required",
"errors": {
"email": [
"can't be blank"
]
}
}
}{
"error": {
"type": "invalid_request_error",
"code": "rate_limit_exceeded",
"message": "Too many requests. Please retry later."
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "An unexpected error occurred"
}
}Authorizations
API key in the format: Bearer {api_token}
Headers
Makes this write safe to retry: a repeat with the same key replays the first response instead of creating a second resource. Scoped to the account, remembered for 24 hours; reusing a key with a different payload is an error.
255Body
Set of key-value pairs you can attach to the object — store your own system's IDs or grouping labels. Keys max 40 chars (up to 50 keys), values stored as strings max 500 chars. On update, keys merge individually; set a key to null or "" to remove it. Echoed back on reads and in webhook payloads.
Show child attributes
Show child attributes
Response
Product created
draft, active, archived Show child attributes
Show child attributes
Show child attributes
Show child attributes
ID by default, full object when expanded
Show child attributes
Show child attributes
Was this page helpful?

