curl --request POST \
--url https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"default": true
}
'import requests
url = "https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish"
payload = { "default": True }
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({default: true})
};
fetch('https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish', 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-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish",
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([
'default' => true
]),
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://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish"
payload := strings.NewReader("{\n \"default\": true\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://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish")
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 \"default\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"productId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 123,
"billingCycle": "weekly",
"basePrice": "<string>",
"status": "draft",
"isDefault": true,
"publishedAt": "2023-11-07T05:31:56Z",
"commitmentAmount": "<string>",
"commitmentResets": true,
"consumptionFloor": "<string>",
"grants": [
{
"meter": "<string>",
"amount": "<string>",
"on": "cycle"
}
]
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>",
"resource": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>",
"errors": [
{
"field": "<string>",
"value": "<string>",
"constraint": "<string>",
"description": "<string>"
}
]
}Publish a version
Publishes a draft version. From here on its pricing is fixed and the product can be sold. By default the published version becomes the product’s default (what a buyer gets when nothing names another one) and a first payment link is created.
Send {"default": false} to publish an offer instead: the version is sellable, but only through a payment link created with productVersionId. Use it to run a promotional price alongside the standard one without it showing up in your storefront. This only works once the product already has a default version; before that, the response is 422.
curl --request POST \
--url https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"default": true
}
'import requests
url = "https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish"
payload = { "default": True }
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({default: true})
};
fetch('https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish', 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-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish",
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([
'default' => true
]),
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://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish"
payload := strings.NewReader("{\n \"default\": true\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://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"default\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.beinfi.com/products/{productID}/versions/{versionID}/publish")
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 \"default\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"productId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": 123,
"billingCycle": "weekly",
"basePrice": "<string>",
"status": "draft",
"isDefault": true,
"publishedAt": "2023-11-07T05:31:56Z",
"commitmentAmount": "<string>",
"commitmentResets": true,
"consumptionFloor": "<string>",
"grants": [
{
"meter": "<string>",
"amount": "<string>",
"on": "cycle"
}
]
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>",
"resource": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>"
}{
"message": "<string>",
"error_code": "internal_error",
"tracer_id": "<string>",
"errors": [
{
"field": "<string>",
"value": "<string>",
"constraint": "<string>",
"description": "<string>"
}
]
}Authorizations
Your account's secret key: Authorization: Bearer sk_test_… or sk_live_…. Server-side only.
Headers
A unique key per operation (a UUID works). Retrying with the same key returns the original response.
Path Parameters
Product ID.
Product version ID.
Body
Optional. With no body, the version is published as the default.
true (or omitted) makes this the product's default version. false publishes it as an offer, sold only by a link that names it.
Response
The published version.
A product version: a snapshot of its pricing. A published version never changes; to change the price, create another.
Sequential version number (1, 2, 3…).
weekly, monthly or annual; null for non-recurring products.
weekly, monthly, annual, null Base price as a decimal string; null for a usage-only product.
draft (editable), published (sellable, fixed pricing) or archived.
draft, published, archived Whether this is the version a buyer gets when nothing names another. A published version with isDefault: false is an offer: it is only sold through a payment link created with productVersionId.
Minimum charged per cycle, as a decimal string; null when there is none.
true: the unused minimum is lost at cycle close. false: it rolls over.
Balance below which usage recording is refused. See VersionConsumption.floor.
Usage credits the version grants.
Show child attributes
Show child attributes