curl --request POST \
--url https://public-api-v2.bags.fm/api/v1/fee-share/config \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"payer": "<string>",
"baseMint": "<string>",
"claimersArray": [
"<string>"
],
"basisPointsArray": [
123
],
"partner": "<string>",
"partnerConfig": "<string>",
"additionalLookupTables": [
"<string>"
],
"bagsConfigType": "fa29606e-5e48-4c37-827f-4b03d58ee23d",
"enableFirstSwapWithMinFee": true,
"tipWallet": "<string>",
"tipLamports": 123
}
'import requests
url = "https://public-api-v2.bags.fm/api/v1/fee-share/config"
payload = {
"payer": "<string>",
"baseMint": "<string>",
"claimersArray": ["<string>"],
"basisPointsArray": [123],
"partner": "<string>",
"partnerConfig": "<string>",
"additionalLookupTables": ["<string>"],
"bagsConfigType": "fa29606e-5e48-4c37-827f-4b03d58ee23d",
"enableFirstSwapWithMinFee": True,
"tipWallet": "<string>",
"tipLamports": 123
}
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({
payer: '<string>',
baseMint: '<string>',
claimersArray: ['<string>'],
basisPointsArray: [123],
partner: '<string>',
partnerConfig: '<string>',
additionalLookupTables: ['<string>'],
bagsConfigType: 'fa29606e-5e48-4c37-827f-4b03d58ee23d',
enableFirstSwapWithMinFee: true,
tipWallet: '<string>',
tipLamports: 123
})
};
fetch('https://public-api-v2.bags.fm/api/v1/fee-share/config', 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://public-api-v2.bags.fm/api/v1/fee-share/config",
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([
'payer' => '<string>',
'baseMint' => '<string>',
'claimersArray' => [
'<string>'
],
'basisPointsArray' => [
123
],
'partner' => '<string>',
'partnerConfig' => '<string>',
'additionalLookupTables' => [
'<string>'
],
'bagsConfigType' => 'fa29606e-5e48-4c37-827f-4b03d58ee23d',
'enableFirstSwapWithMinFee' => true,
'tipWallet' => '<string>',
'tipLamports' => 123
]),
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://public-api-v2.bags.fm/api/v1/fee-share/config"
payload := strings.NewReader("{\n \"payer\": \"<string>\",\n \"baseMint\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 123\n ],\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"bagsConfigType\": \"fa29606e-5e48-4c37-827f-4b03d58ee23d\",\n \"enableFirstSwapWithMinFee\": true,\n \"tipWallet\": \"<string>\",\n \"tipLamports\": 123\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://public-api-v2.bags.fm/api/v1/fee-share/config")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"payer\": \"<string>\",\n \"baseMint\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 123\n ],\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"bagsConfigType\": \"fa29606e-5e48-4c37-827f-4b03d58ee23d\",\n \"enableFirstSwapWithMinFee\": true,\n \"tipWallet\": \"<string>\",\n \"tipLamports\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api-v2.bags.fm/api/v1/fee-share/config")
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 \"payer\": \"<string>\",\n \"baseMint\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 123\n ],\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"bagsConfigType\": \"fa29606e-5e48-4c37-827f-4b03d58ee23d\",\n \"enableFirstSwapWithMinFee\": true,\n \"tipWallet\": \"<string>\",\n \"tipLamports\": 123\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"response": {
"needsCreation": true,
"feeShareAuthority": "<string>",
"meteoraConfigKey": "<string>",
"transactions": [
{
"blockhash": {
"blockhash": "<string>",
"lastValidBlockHeight": 123
},
"transaction": "<string>"
}
],
"bundles": [
[
{
"blockhash": {
"blockhash": "<string>",
"lastValidBlockHeight": 123
},
"transaction": "<string>"
}
]
]
}
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}Create Fee Share Config creation transaction
Create a fee sharing config with multiple fee claimers (up to 100). Newly created SOL fee-share v2 configs register payer as the separate deployer with 2,500 bps (25%) of the gross claimers pool. Normal claimer allocations divide the remaining claimers pool; a partner share, when present, is deducted from the platform pool instead. basisPointsArray must still sum to 10,000. Existing configs are returned without changing their deployer terms. Use the dedicated /fee-share/deployer endpoints to read and claim the separate share. The existing creator claim endpoints remain separate. See the deployer fees guide for distribution and claiming details. Large claimer lists require lookup tables.
curl --request POST \
--url https://public-api-v2.bags.fm/api/v1/fee-share/config \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"payer": "<string>",
"baseMint": "<string>",
"claimersArray": [
"<string>"
],
"basisPointsArray": [
123
],
"partner": "<string>",
"partnerConfig": "<string>",
"additionalLookupTables": [
"<string>"
],
"bagsConfigType": "fa29606e-5e48-4c37-827f-4b03d58ee23d",
"enableFirstSwapWithMinFee": true,
"tipWallet": "<string>",
"tipLamports": 123
}
'import requests
url = "https://public-api-v2.bags.fm/api/v1/fee-share/config"
payload = {
"payer": "<string>",
"baseMint": "<string>",
"claimersArray": ["<string>"],
"basisPointsArray": [123],
"partner": "<string>",
"partnerConfig": "<string>",
"additionalLookupTables": ["<string>"],
"bagsConfigType": "fa29606e-5e48-4c37-827f-4b03d58ee23d",
"enableFirstSwapWithMinFee": True,
"tipWallet": "<string>",
"tipLamports": 123
}
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({
payer: '<string>',
baseMint: '<string>',
claimersArray: ['<string>'],
basisPointsArray: [123],
partner: '<string>',
partnerConfig: '<string>',
additionalLookupTables: ['<string>'],
bagsConfigType: 'fa29606e-5e48-4c37-827f-4b03d58ee23d',
enableFirstSwapWithMinFee: true,
tipWallet: '<string>',
tipLamports: 123
})
};
fetch('https://public-api-v2.bags.fm/api/v1/fee-share/config', 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://public-api-v2.bags.fm/api/v1/fee-share/config",
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([
'payer' => '<string>',
'baseMint' => '<string>',
'claimersArray' => [
'<string>'
],
'basisPointsArray' => [
123
],
'partner' => '<string>',
'partnerConfig' => '<string>',
'additionalLookupTables' => [
'<string>'
],
'bagsConfigType' => 'fa29606e-5e48-4c37-827f-4b03d58ee23d',
'enableFirstSwapWithMinFee' => true,
'tipWallet' => '<string>',
'tipLamports' => 123
]),
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://public-api-v2.bags.fm/api/v1/fee-share/config"
payload := strings.NewReader("{\n \"payer\": \"<string>\",\n \"baseMint\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 123\n ],\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"bagsConfigType\": \"fa29606e-5e48-4c37-827f-4b03d58ee23d\",\n \"enableFirstSwapWithMinFee\": true,\n \"tipWallet\": \"<string>\",\n \"tipLamports\": 123\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://public-api-v2.bags.fm/api/v1/fee-share/config")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"payer\": \"<string>\",\n \"baseMint\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 123\n ],\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"bagsConfigType\": \"fa29606e-5e48-4c37-827f-4b03d58ee23d\",\n \"enableFirstSwapWithMinFee\": true,\n \"tipWallet\": \"<string>\",\n \"tipLamports\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api-v2.bags.fm/api/v1/fee-share/config")
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 \"payer\": \"<string>\",\n \"baseMint\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 123\n ],\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"bagsConfigType\": \"fa29606e-5e48-4c37-827f-4b03d58ee23d\",\n \"enableFirstSwapWithMinFee\": true,\n \"tipWallet\": \"<string>\",\n \"tipLamports\": 123\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"response": {
"needsCreation": true,
"feeShareAuthority": "<string>",
"meteoraConfigKey": "<string>",
"transactions": [
{
"blockhash": {
"blockhash": "<string>",
"lastValidBlockHeight": 123
},
"transaction": "<string>"
}
],
"bundles": [
[
{
"blockhash": {
"blockhash": "<string>",
"lastValidBlockHeight": 123
},
"transaction": "<string>"
}
]
]
}
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}Authorizations
Body
Array of basis points for each fee claimer. Must align with claimersArray and total 10,000. These allocations divide the claimers pool remaining after platform, partner, and deployer deductions. Do not reserve 2,500 bps in this array for the separate deployer share.
1 - 100 elementsBasis points allocated to the corresponding claimer
Bags config type that determines the token's fee structure. The thresholds and compounding percentages below describe SOL-quoted launches.
fa29606e-5e48-4c37-827f-4b03d58ee23d(Default): 2% fees both pre and post migration, with 25% fee compounding post-migration. Graduates at ~85 SOL.ba28db46-ea6f-4452-8218-5587f6aca0a1(Low Float): 2% base fee pre-migration, with 25% fee compounding post-migration. 96% of token supply is locked. Post-migration the fee is market-cap based, starting at 2% and decaying to a 0.5% floor as the token's market cap grows (~25x graduation market cap). Graduates at ~80 SOL.810faadb-030b-47de-a68b-7211c1cbbee3(Drop Mode): 2% fees both pre and post migration, with 25% fee compounding post-migration. 85% of token supply is locked. Graduates at ~100 SOL.a7c8e1f2-3d4b-5a6c-9e0f-1b2c3d4e5f6a(~0% Fee Mode): 1% fees pre-migration, 0.25% post-migration, with 50% fee compounding post-migration. Graduates at ~85 SOL.d16d3585-6488-4a6c-9a6f-e6c39ca0fda3(1% Fee Mode): 0.25% fees pre-migration, 1% post-migration, with 50% fee compounding post-migration. Graduates at ~85 SOL.e2963a6c-441a-4862-9d80-b94e3a481cd7(Price Mode): Same as Default (2% fees pre and post migration, 25% fee compounding post-migration) but with a 1,000 token supply. Graduates at ~85 SOL.48e26d2f-0a9d-4625-a3cc-c3987d874b9e(Paper Hand Tax Mode): 10% fees both pre and post migration, with 50% fee compounding post-migration. Graduates at ~85 SOL.
For non-WSOL DBC launches, select a type returned in the quote's flows[].configs from /token-launch/supported-quote-tokens. Its saved graduationThresholdRaw replaces the SOL threshold, and fees are collected only in the quote token with zero compounding before and after graduation. Drop Mode is unavailable for non-WSOL. Omitting the type selects Default; the exact quote/type pair must be configured.
fa29606e-5e48-4c37-827f-4b03d58ee23d, d16d3585-6488-4a6c-9a6f-e6c39ca0fda3, a7c8e1f2-3d4b-5a6c-9e0f-1b2c3d4e5f6a, 48e26d2f-0a9d-4625-a3cc-c3987d874b9e, 810faadb-030b-47de-a68b-7211c1cbbee3, e2963a6c-441a-4862-9d80-b94e3a481cd7, ba28db46-ea6f-4452-8218-5587f6aca0a1 Optional (default true). When true, the first swap on the new pool pays the minimum (ending) base fee instead of the starting cliff fee. This only affects config types that use a base-fee scheduler (one whose base fee changes over time). No current config type uses a base-fee scheduler, so this field currently has no effect and is safe to omit; it is retained for forward compatibility.