curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Studio membership",
"description": "Access to weekly classes.",
"metadata": {
"tier": "standard"
},
"active": false
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}"
payload = {
"name": "Studio membership",
"description": "Access to weekly classes.",
"metadata": { "tier": "standard" },
"active": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Studio membership',
description: 'Access to weekly classes.',
metadata: {tier: 'standard'},
active: false
})
};
fetch('https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}', 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://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Studio membership',
'description' => 'Access to weekly classes.',
'metadata' => [
'tier' => 'standard'
],
'active' => false
]),
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://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}"
payload := strings.NewReader("{\n \"name\": \"Studio membership\",\n \"description\": \"Access to weekly classes.\",\n \"metadata\": {\n \"tier\": \"standard\"\n },\n \"active\": false\n}")
req, _ := http.NewRequest("PUT", 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.put("https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Studio membership\",\n \"description\": \"Access to weekly classes.\",\n \"metadata\": {\n \"tier\": \"standard\"\n },\n \"active\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Studio membership\",\n \"description\": \"Access to weekly classes.\",\n \"metadata\": {\n \"tier\": \"standard\"\n },\n \"active\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "prod_T7mK2p9Q4r6S8v",
"name": "Studio membership",
"description": "Access to weekly classes.",
"active": true,
"images": [
"https://example.com/membership.jpg"
],
"metadata": {
"category": "membership"
},
"livemode": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Update Stripe product
Updates the product identified by product_id. Changes only the fields you send. Anything you leave out keeps its current value. Sending null has the same effect.
Uses the Stripe account selected by the app’s stored credentials. Live keys select the live catalog and test keys select the test catalog. Products and prices belong to that Stripe account, so multiple apps configured with the same account share the same catalog. Check livemode on each returned product or price to see which catalog the call used.
Requires write access to the app. Workspace viewers cannot call this operation.
curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Studio membership",
"description": "Access to weekly classes.",
"metadata": {
"tier": "standard"
},
"active": false
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}"
payload = {
"name": "Studio membership",
"description": "Access to weekly classes.",
"metadata": { "tier": "standard" },
"active": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Studio membership',
description: 'Access to weekly classes.',
metadata: {tier: 'standard'},
active: false
})
};
fetch('https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}', 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://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Studio membership',
'description' => 'Access to weekly classes.',
'metadata' => [
'tier' => 'standard'
],
'active' => false
]),
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://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}"
payload := strings.NewReader("{\n \"name\": \"Studio membership\",\n \"description\": \"Access to weekly classes.\",\n \"metadata\": {\n \"tier\": \"standard\"\n },\n \"active\": false\n}")
req, _ := http.NewRequest("PUT", 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.put("https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Studio membership\",\n \"description\": \"Access to weekly classes.\",\n \"metadata\": {\n \"tier\": \"standard\"\n },\n \"active\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/payments/stripe/products/{product_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Studio membership\",\n \"description\": \"Access to weekly classes.\",\n \"metadata\": {\n \"tier\": \"standard\"\n },\n \"active\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "prod_T7mK2p9Q4r6S8v",
"name": "Studio membership",
"description": "Access to weekly classes.",
"active": true,
"images": [
"https://example.com/membership.jpg"
],
"metadata": {
"category": "membership"
},
"livemode": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Path Parameters
Stripe product ID in the configured account.
ID of the Base44 app.
Body
Request to update a Stripe product.
New product name. Leave it out to keep the current value. Sending null has the same effect. Defaults to null.
"Studio membership"
New product description. Leave it out to keep the current value. Sending null has the same effect. Defaults to null.
"Access to weekly classes."
Metadata to store, as string key-value pairs. Stripe's metadata rules limit it to 50 keys, 40 characters per key, and 500 characters per value. Defaults to null. Leave it out to keep the current value. Sending null has the same effect.
{ "tier": "standard" }
Whether the product is active. Leave it out to keep the current value. Sending null has the same effect. Defaults to null.
false
Response
The operation result.
A product in the Stripe account configured for the app.
Stripe product ID.
"prod_T7mK2p9Q4r6S8v"
Product name.
"Studio membership"
Product description, or null when none is set.
"Access to weekly classes."
Whether the product is active.
true
Product image URLs. Neither Create nor Update Stripe product takes an images field, so this stays empty unless you add images directly in the Stripe dashboard for the account these credentials point to.
["https://example.com/membership.jpg"]
Metadata stored on the product.
{ "category": "membership" }
true when the product is in the live catalog, false when it's in the test catalog.
false
Was this page helpful?