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>"
}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>"
}Authorizations
API key authentication. Provide your API key as the header value.
Body
Public key of the wallet funding config creation. For a newly created config, this wallet is also registered as the deployer and receives the separate deployer share. It may additionally appear in claimersArray. A later token-launch wallet does not replace this deployer.
Public key of the base mint (the token being launched)
Array of fee claimer wallet public keys. Must align with basisPointsArray. Maximum 100 fee claimers.
1 - 100 elementsPublic key of a fee claimer wallet
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
Optional: Public key of the partner wallet for partner fee sharing
Optional: Public key of the partner config PDA (required if partner is provided)
Optional: Array of lookup table addresses. Required when there are more than 7 fee claimers.
Public key of a lookup table address
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.d16d3585-6488-4a6c-9a6f-e6c39ca0fda3: 0.25% fees pre-migration, 1% post-migration, with 50% fee compounding post-migration. Graduates at ~85 SOL.a7c8e1f2-3d4b-5a6c-9e0f-1b2c3d4e5f6a: 1% fees pre-migration, 0.25% post-migration, with 50% fee compounding post-migration. Graduates at ~85 SOL.48e26d2f-0a9d-4625-a3cc-c3987d874b9e: 10% fees both pre and post migration, with 50% fee compounding post-migration. Graduates at ~85 SOL.810faadb-030b-47de-a68b-7211c1cbbee3(2% Flat, 85% Locked): 2% fees both pre and post migration, with 25% fee compounding post-migration. 85% of token supply is locked. Graduates at ~100 SOL.e2963a6c-441a-4862-9d80-b94e3a481cd7(Default, 1K Supply): 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.ba28db46-ea6f-4452-8218-5587f6aca0a1(2% Base, 96% Locked): 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.
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. The 85%-locked type 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.
Base58 encoded Solana public key of the tip recipient wallet
Tip amount in lamports
