curl --request PUT \
--url https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"included": true,
"currency": "USD",
"face_value_minor": 1000,
"rate": "2"
}
'import requests
url = "https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}"
payload = {
"included": True,
"currency": "USD",
"face_value_minor": 1000,
"rate": "2"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({included: true, currency: 'USD', face_value_minor: 1000, rate: '2'})
};
fetch('https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}', 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.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}",
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([
'included' => true,
'currency' => 'USD',
'face_value_minor' => 1000,
'rate' => '2'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <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.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}"
payload := strings.NewReader("{\n \"included\": true,\n \"currency\": \"USD\",\n \"face_value_minor\": 1000,\n \"rate\": \"2\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<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.put("https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"included\": true,\n \"currency\": \"USD\",\n \"face_value_minor\": 1000,\n \"rate\": \"2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"included\": true,\n \"currency\": \"USD\",\n \"face_value_minor\": 1000,\n \"rate\": \"2\"\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2026-09-01T10:30:00Z",
"currency": "USD",
"face_value_minor": 1000,
"fulfillment_product_id": "550e8400-e29b-41d4-a716-446655440002",
"id": "550e8400-e29b-41d4-a716-446655440000",
"included": true,
"rate": "2",
"reward_source_id": "550e8400-e29b-41d4-a716-446655440001",
"updated_at": "2026-09-01T10:30:00Z"
}{
"code": "bad_request",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Invalid request parameters"
}{
"code": "unauthorized",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Missing or invalid credentials"
}{
"code": "forbidden",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Insufficient permissions for this action"
}{
"code": "not_found",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Resource not found"
}{
"code": "conflict",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Resource already exists or state conflict"
}{
"code": "unsupported_media_type",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Content-Type must be application/json"
}{
"code": "unprocessable",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Business rule violation"
}{
"code": "internal_error",
"message": "An internal error occurred"
}Set product settings
Replace a reward source’s settings for one product.
curl --request PUT \
--url https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"included": true,
"currency": "USD",
"face_value_minor": 1000,
"rate": "2"
}
'import requests
url = "https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}"
payload = {
"included": True,
"currency": "USD",
"face_value_minor": 1000,
"rate": "2"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({included: true, currency: 'USD', face_value_minor: 1000, rate: '2'})
};
fetch('https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}', 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.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}",
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([
'included' => true,
'currency' => 'USD',
'face_value_minor' => 1000,
'rate' => '2'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <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.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}"
payload := strings.NewReader("{\n \"included\": true,\n \"currency\": \"USD\",\n \"face_value_minor\": 1000,\n \"rate\": \"2\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<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.put("https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"included\": true,\n \"currency\": \"USD\",\n \"face_value_minor\": 1000,\n \"rate\": \"2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/programs/{programId}/reward-sources/{sourceId}/product-settings/{productId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"included\": true,\n \"currency\": \"USD\",\n \"face_value_minor\": 1000,\n \"rate\": \"2\"\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2026-09-01T10:30:00Z",
"currency": "USD",
"face_value_minor": 1000,
"fulfillment_product_id": "550e8400-e29b-41d4-a716-446655440002",
"id": "550e8400-e29b-41d4-a716-446655440000",
"included": true,
"rate": "2",
"reward_source_id": "550e8400-e29b-41d4-a716-446655440001",
"updated_at": "2026-09-01T10:30:00Z"
}{
"code": "bad_request",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Invalid request parameters"
}{
"code": "unauthorized",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Missing or invalid credentials"
}{
"code": "forbidden",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Insufficient permissions for this action"
}{
"code": "not_found",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Resource not found"
}{
"code": "conflict",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Resource already exists or state conflict"
}{
"code": "unsupported_media_type",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Content-Type must be application/json"
}{
"code": "unprocessable",
"details": {
"expected": "uuid",
"field": "asset_id",
"fields": [
{
"expected": "<unknown>",
"field": "amount",
"message": "This field is required",
"reason": "required",
"received": "-10.00"
}
],
"reason": "invalid",
"received": "not-a-uuid"
},
"message": "Business rule violation"
}{
"code": "internal_error",
"message": "An internal error occurred"
}included: true includes it even when it does not match the source’s category or country filters. included: false excludes it under either policy.
This request replaces the product’s settings. Include every override you want to retain; omitted rate, face_value_minor, and currency overrides are cleared.
Set both face_value_minor and currency to offer a fixed-value UNIT_BASED reward. The value and currency must be supported by the product.
Without face_value_minor, the reward is AMOUNT_BASED and accepts the product’s supported values, even if those values are a fixed list. Set currency alone to restrict that variable-value reward to one supported currency. For a variable-value reward, omit currency to allow all of the product’s currencies.
Adding or removing a fixed value replaces the catalog reward with a new reward ID.
Authorizations
API key passed in the X-API-Key header.
Path Parameters
Program ID
Reward source ID
Product id from the fulfillment account's products list (the row id, not the vendor SKU)
Body
Product settings
Whether the product is included in the program catalog. Under MANUAL, true enables the product; under ALL, false excludes it.
Restrict this reward to one supported currency, with or without a fixed face value (required with face_value_minor)
"USD"
Pin the item to one fixed face value in minor units (UNIT_BASED)
1000
Per-product rate override (decimal string; omit for the source default)
"2"
Response
Stored settings
When the setting was created (RFC 3339)
"2026-09-01T10:30:00Z"
Restrict this reward to one supported currency, with or without a fixed face value
"USD"
Pinned fixed face value in minor units (omit to allow the product's supported values)
1000
Synced fulfillment product this setting targets
"550e8400-e29b-41d4-a716-446655440002"
Setting row ID
"550e8400-e29b-41d4-a716-446655440000"
Whether the product is exposed (overrides the source policy and filters)
true
Per-product rate override (decimal string, null = source default)
"2"
Reward source this setting belongs to
"550e8400-e29b-41d4-a716-446655440001"
When the setting was last modified (RFC 3339)
"2026-09-01T10:30:00Z"