curl --request POST \
--url https://api.scrip.dev/v1/programs/{programId}/reward-sources \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"asset_id": "550e8400-e29b-41d4-a716-446655440003",
"default_rate": "1.5",
"fulfillment_account_id": "550e8400-e29b-41d4-a716-446655440002",
"category_filter": [
"GIFT_CARD"
],
"country_filter": [
"US"
],
"policy": "ALL"
}
'import requests
url = "https://api.scrip.dev/v1/programs/{programId}/reward-sources"
payload = {
"asset_id": "550e8400-e29b-41d4-a716-446655440003",
"default_rate": "1.5",
"fulfillment_account_id": "550e8400-e29b-41d4-a716-446655440002",
"category_filter": ["GIFT_CARD"],
"country_filter": ["US"],
"policy": "ALL"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
asset_id: '550e8400-e29b-41d4-a716-446655440003',
default_rate: '1.5',
fulfillment_account_id: '550e8400-e29b-41d4-a716-446655440002',
category_filter: ['GIFT_CARD'],
country_filter: ['US'],
policy: 'ALL'
})
};
fetch('https://api.scrip.dev/v1/programs/{programId}/reward-sources', 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",
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([
'asset_id' => '550e8400-e29b-41d4-a716-446655440003',
'default_rate' => '1.5',
'fulfillment_account_id' => '550e8400-e29b-41d4-a716-446655440002',
'category_filter' => [
'GIFT_CARD'
],
'country_filter' => [
'US'
],
'policy' => 'ALL'
]),
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"
payload := strings.NewReader("{\n \"asset_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n \"default_rate\": \"1.5\",\n \"fulfillment_account_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n \"category_filter\": [\n \"GIFT_CARD\"\n ],\n \"country_filter\": [\n \"US\"\n ],\n \"policy\": \"ALL\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.scrip.dev/v1/programs/{programId}/reward-sources")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"asset_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n \"default_rate\": \"1.5\",\n \"fulfillment_account_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n \"category_filter\": [\n \"GIFT_CARD\"\n ],\n \"country_filter\": [\n \"US\"\n ],\n \"policy\": \"ALL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/programs/{programId}/reward-sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n \"default_rate\": \"1.5\",\n \"fulfillment_account_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n \"category_filter\": [\n \"GIFT_CARD\"\n ],\n \"country_filter\": [\n \"US\"\n ],\n \"policy\": \"ALL\"\n}"
response = http.request(request)
puts response.read_body{
"asset_id": "550e8400-e29b-41d4-a716-446655440003",
"category_filter": [
"GIFT_CARD"
],
"country_filter": [
"US"
],
"created_at": "2026-09-01T10:30:00Z",
"default_rate": "1.5",
"fulfillment_account_id": "550e8400-e29b-41d4-a716-446655440002",
"id": "550e8400-e29b-41d4-a716-446655440000",
"policy": "ALL",
"program_id": "550e8400-e29b-41d4-a716-446655440001",
"status": "ACTIVE",
"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"
}Create a reward source
Create a source of rewards for a program.
curl --request POST \
--url https://api.scrip.dev/v1/programs/{programId}/reward-sources \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"asset_id": "550e8400-e29b-41d4-a716-446655440003",
"default_rate": "1.5",
"fulfillment_account_id": "550e8400-e29b-41d4-a716-446655440002",
"category_filter": [
"GIFT_CARD"
],
"country_filter": [
"US"
],
"policy": "ALL"
}
'import requests
url = "https://api.scrip.dev/v1/programs/{programId}/reward-sources"
payload = {
"asset_id": "550e8400-e29b-41d4-a716-446655440003",
"default_rate": "1.5",
"fulfillment_account_id": "550e8400-e29b-41d4-a716-446655440002",
"category_filter": ["GIFT_CARD"],
"country_filter": ["US"],
"policy": "ALL"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
asset_id: '550e8400-e29b-41d4-a716-446655440003',
default_rate: '1.5',
fulfillment_account_id: '550e8400-e29b-41d4-a716-446655440002',
category_filter: ['GIFT_CARD'],
country_filter: ['US'],
policy: 'ALL'
})
};
fetch('https://api.scrip.dev/v1/programs/{programId}/reward-sources', 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",
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([
'asset_id' => '550e8400-e29b-41d4-a716-446655440003',
'default_rate' => '1.5',
'fulfillment_account_id' => '550e8400-e29b-41d4-a716-446655440002',
'category_filter' => [
'GIFT_CARD'
],
'country_filter' => [
'US'
],
'policy' => 'ALL'
]),
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"
payload := strings.NewReader("{\n \"asset_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n \"default_rate\": \"1.5\",\n \"fulfillment_account_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n \"category_filter\": [\n \"GIFT_CARD\"\n ],\n \"country_filter\": [\n \"US\"\n ],\n \"policy\": \"ALL\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.scrip.dev/v1/programs/{programId}/reward-sources")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"asset_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n \"default_rate\": \"1.5\",\n \"fulfillment_account_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n \"category_filter\": [\n \"GIFT_CARD\"\n ],\n \"country_filter\": [\n \"US\"\n ],\n \"policy\": \"ALL\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrip.dev/v1/programs/{programId}/reward-sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset_id\": \"550e8400-e29b-41d4-a716-446655440003\",\n \"default_rate\": \"1.5\",\n \"fulfillment_account_id\": \"550e8400-e29b-41d4-a716-446655440002\",\n \"category_filter\": [\n \"GIFT_CARD\"\n ],\n \"country_filter\": [\n \"US\"\n ],\n \"policy\": \"ALL\"\n}"
response = http.request(request)
puts response.read_body{
"asset_id": "550e8400-e29b-41d4-a716-446655440003",
"category_filter": [
"GIFT_CARD"
],
"country_filter": [
"US"
],
"created_at": "2026-09-01T10:30:00Z",
"default_rate": "1.5",
"fulfillment_account_id": "550e8400-e29b-41d4-a716-446655440002",
"id": "550e8400-e29b-41d4-a716-446655440000",
"policy": "ALL",
"program_id": "550e8400-e29b-41d4-a716-446655440001",
"status": "ACTIVE",
"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"
}default_rate in asset units per currency minor unit. For example, "0.01" charges one asset unit per US dollar.
The default MANUAL policy adds products only when you include them through product settings. ALL adds products matching the source’s category and country filters. Without a category filter, other supported categories can also be included.
A program can have one source for each fulfillment account and asset combination. A duplicate returns 409 reward_source_exists. You cannot change the account or asset after creating the source.
Authorizations
API key passed in the X-API-Key header.
Path Parameters
Program ID
Body
Reward source configuration
Asset participants pay with (must be linked to the program)
"550e8400-e29b-41d4-a716-446655440003"
Asset units per currency minor unit of face value (decimal string)
1"1.5"
Fulfillment account whose products populate the program catalog
"550e8400-e29b-41d4-a716-446655440002"
Under ALL, include only these categories (GIFT_CARD, PREPAID_CARD, CHARITY)
["GIFT_CARD"]
Under ALL, include only products available in these countries
["US"]
Product selection: MANUAL (default) or ALL
"ALL"
Response
Created reward source
Asset participants spend on these rewards
"550e8400-e29b-41d4-a716-446655440003"
ALL-policy category filter (null = no filter)
["GIFT_CARD"]
ALL-policy country filter (null = no filter)
["US"]
When the reward source was created (RFC 3339)
"2026-09-01T10:30:00Z"
Asset units per currency minor unit of face value (decimal string)
"1.5"
Fulfillment account supplying these products
"550e8400-e29b-41d4-a716-446655440002"
Reward source ID
"550e8400-e29b-41d4-a716-446655440000"
Product selection: MANUAL (nothing until products are enabled) or ALL
"ALL"
Program this source belongs to
"550e8400-e29b-41d4-a716-446655440001"
Lifecycle status: ACTIVE
"ACTIVE"
When the reward source was last modified (RFC 3339)
"2026-09-01T10:30:00Z"