curl -X POST https://acme.orgo.space/api/v1/products \
-H "Api-Token: $ORGO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Annual Membership 2026",
"isFee": true,
"hasSubscription": true,
"monthPeriod": 12,
"customMinPrice": 5000
}'
await fetch("https://acme.orgo.space/api/v1/products", {
method: "POST",
headers: {
"Api-Token": process.env.ORGO_API_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Annual Membership 2026",
isFee: true,
hasSubscription: true,
monthPeriod: 12,
customMinPrice: 5000,
}),
});
$client->post('/api/v1/products', [
'headers' => ['Api-Token' => getenv('ORGO_API_TOKEN')],
'json' => [
'name' => 'Annual Membership 2026',
'isFee' => true,
'hasSubscription' => true,
'monthPeriod' => 12,
'customMinPrice' => 5000,
],
]);
import requests
url = "https://app.orgo.space/api/v1/products"
payload = {
"name": "Annual Membership 2026",
"description": "Full membership for the calendar year — includes voting rights, event access, and member newsletter.",
"isFee": True,
"isExternal": False,
"hasSubscription": True,
"monthPeriod": 12,
"cycleDay": 15,
"cycleMonth": 1,
"maxDate": "2026-12-31T23:59:59+00:00",
"customMinPrice": 5000,
"hasCustomPriceValue": False,
"logo": "https://cdn.orgo.space/products/membership-2026.png"
}
headers = {
"Api-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.orgo.space/api/v1/products"
payload := strings.NewReader("{\n \"name\": \"Annual Membership 2026\",\n \"description\": \"Full membership for the calendar year — includes voting rights, event access, and member newsletter.\",\n \"isFee\": true,\n \"isExternal\": false,\n \"hasSubscription\": true,\n \"monthPeriod\": 12,\n \"cycleDay\": 15,\n \"cycleMonth\": 1,\n \"maxDate\": \"2026-12-31T23:59:59+00:00\",\n \"customMinPrice\": 5000,\n \"hasCustomPriceValue\": false,\n \"logo\": \"https://cdn.orgo.space/products/membership-2026.png\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Token", "<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://app.orgo.space/api/v1/products")
.header("Api-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Annual Membership 2026\",\n \"description\": \"Full membership for the calendar year — includes voting rights, event access, and member newsletter.\",\n \"isFee\": true,\n \"isExternal\": false,\n \"hasSubscription\": true,\n \"monthPeriod\": 12,\n \"cycleDay\": 15,\n \"cycleMonth\": 1,\n \"maxDate\": \"2026-12-31T23:59:59+00:00\",\n \"customMinPrice\": 5000,\n \"hasCustomPriceValue\": false,\n \"logo\": \"https://cdn.orgo.space/products/membership-2026.png\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.orgo.space/api/v1/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Annual Membership 2026\",\n \"description\": \"Full membership for the calendar year — includes voting rights, event access, and member newsletter.\",\n \"isFee\": true,\n \"isExternal\": false,\n \"hasSubscription\": true,\n \"monthPeriod\": 12,\n \"cycleDay\": 15,\n \"cycleMonth\": 1,\n \"maxDate\": \"2026-12-31T23:59:59+00:00\",\n \"customMinPrice\": 5000,\n \"hasCustomPriceValue\": false,\n \"logo\": \"https://cdn.orgo.space/products/membership-2026.png\"\n}"
response = http.request(request)
puts response.read_body{
"id": 22,
"uuid": "01938d8e-c2f4-7c2a-b8e1-3f7a9b8c4f99",
"name": "Annual Membership 2026",
"description": "Full membership for the calendar year — includes voting rights, event access, and member newsletter.",
"status": "DRAFT",
"isFee": true,
"hasSubscription": true,
"monthPeriod": 12,
"currency": "USD",
"customMinPrice": 5000,
"productPrices": [],
"dateCreated": "2026-01-15T10:30:00+00:00"
}Create a product
Creates a new product and syncs it to Stripe. Automatically generates slug, slugGo, and slugEnGo identifiers. For fee-type products, sets the local center default fee product if not already configured. For donation-type products, registers as the tenant default donation product if none exists. For manual invoice products, configures internal invoice settings. Requires FINANCIAL_TENANT or FINANCIAL_LOCAL permission.
curl -X POST https://acme.orgo.space/api/v1/products \
-H "Api-Token: $ORGO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Annual Membership 2026",
"isFee": true,
"hasSubscription": true,
"monthPeriod": 12,
"customMinPrice": 5000
}'
await fetch("https://acme.orgo.space/api/v1/products", {
method: "POST",
headers: {
"Api-Token": process.env.ORGO_API_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "Annual Membership 2026",
isFee: true,
hasSubscription: true,
monthPeriod: 12,
customMinPrice: 5000,
}),
});
$client->post('/api/v1/products', [
'headers' => ['Api-Token' => getenv('ORGO_API_TOKEN')],
'json' => [
'name' => 'Annual Membership 2026',
'isFee' => true,
'hasSubscription' => true,
'monthPeriod' => 12,
'customMinPrice' => 5000,
],
]);
import requests
url = "https://app.orgo.space/api/v1/products"
payload = {
"name": "Annual Membership 2026",
"description": "Full membership for the calendar year — includes voting rights, event access, and member newsletter.",
"isFee": True,
"isExternal": False,
"hasSubscription": True,
"monthPeriod": 12,
"cycleDay": 15,
"cycleMonth": 1,
"maxDate": "2026-12-31T23:59:59+00:00",
"customMinPrice": 5000,
"hasCustomPriceValue": False,
"logo": "https://cdn.orgo.space/products/membership-2026.png"
}
headers = {
"Api-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.orgo.space/api/v1/products"
payload := strings.NewReader("{\n \"name\": \"Annual Membership 2026\",\n \"description\": \"Full membership for the calendar year — includes voting rights, event access, and member newsletter.\",\n \"isFee\": true,\n \"isExternal\": false,\n \"hasSubscription\": true,\n \"monthPeriod\": 12,\n \"cycleDay\": 15,\n \"cycleMonth\": 1,\n \"maxDate\": \"2026-12-31T23:59:59+00:00\",\n \"customMinPrice\": 5000,\n \"hasCustomPriceValue\": false,\n \"logo\": \"https://cdn.orgo.space/products/membership-2026.png\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Token", "<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://app.orgo.space/api/v1/products")
.header("Api-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Annual Membership 2026\",\n \"description\": \"Full membership for the calendar year — includes voting rights, event access, and member newsletter.\",\n \"isFee\": true,\n \"isExternal\": false,\n \"hasSubscription\": true,\n \"monthPeriod\": 12,\n \"cycleDay\": 15,\n \"cycleMonth\": 1,\n \"maxDate\": \"2026-12-31T23:59:59+00:00\",\n \"customMinPrice\": 5000,\n \"hasCustomPriceValue\": false,\n \"logo\": \"https://cdn.orgo.space/products/membership-2026.png\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.orgo.space/api/v1/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Annual Membership 2026\",\n \"description\": \"Full membership for the calendar year — includes voting rights, event access, and member newsletter.\",\n \"isFee\": true,\n \"isExternal\": false,\n \"hasSubscription\": true,\n \"monthPeriod\": 12,\n \"cycleDay\": 15,\n \"cycleMonth\": 1,\n \"maxDate\": \"2026-12-31T23:59:59+00:00\",\n \"customMinPrice\": 5000,\n \"hasCustomPriceValue\": false,\n \"logo\": \"https://cdn.orgo.space/products/membership-2026.png\"\n}"
response = http.request(request)
puts response.read_body{
"id": 22,
"uuid": "01938d8e-c2f4-7c2a-b8e1-3f7a9b8c4f99",
"name": "Annual Membership 2026",
"description": "Full membership for the calendar year — includes voting rights, event access, and member newsletter.",
"status": "DRAFT",
"isFee": true,
"hasSubscription": true,
"monthPeriod": 12,
"currency": "USD",
"customMinPrice": 5000,
"productPrices": [],
"dateCreated": "2026-01-15T10:30:00+00:00"
}Authorizations
Server-to-server authentication. Generate a token in the admin UI at
Settings → Developers → API Access. Send the raw token in the
Api-Token header — there is no Bearer prefix.
Tokens can be marked read-only at creation time, in which case the API
rejects any non-GET request with 403 Forbidden.
Body
The new Product resource
"/api/v1/local_centers/1"
"/api/v1/tenants/1"
"/api/v1/events/1"
["/api/v1/product_price_variations/1"]
Response
Product resource created
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

