curl --request POST \
--url https://public-api-v2.bags.fm/api/v1/fee-share/config/v2 \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"baseMint": "<string>",
"payer": "<string>",
"claimersArray": [
"<string>"
],
"basisPointsArray": [
5000
],
"feeLimits": [
{
"asset": {
"mint": "<string>",
"tokenProgram": "<string>"
},
"basisPoints": 5000,
"maximumFeeRaw": "<string>"
}
],
"additionalLookupTables": [
"<string>"
],
"quoteMint": "<string>",
"quoteTokenProgram": "<string>",
"partner": "<string>",
"partnerConfig": "<string>",
"admin": "<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/v2"
payload = {
"baseMint": "<string>",
"payer": "<string>",
"claimersArray": ["<string>"],
"basisPointsArray": [5000],
"feeLimits": [
{
"asset": {
"mint": "<string>",
"tokenProgram": "<string>"
},
"basisPoints": 5000,
"maximumFeeRaw": "<string>"
}
],
"additionalLookupTables": ["<string>"],
"quoteMint": "<string>",
"quoteTokenProgram": "<string>",
"partner": "<string>",
"partnerConfig": "<string>",
"admin": "<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({
baseMint: '<string>',
payer: '<string>',
claimersArray: ['<string>'],
basisPointsArray: [5000],
feeLimits: [
{
asset: {mint: '<string>', tokenProgram: '<string>'},
basisPoints: 5000,
maximumFeeRaw: '<string>'
}
],
additionalLookupTables: ['<string>'],
quoteMint: '<string>',
quoteTokenProgram: '<string>',
partner: '<string>',
partnerConfig: '<string>',
admin: '<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/v2', 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/v2",
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([
'baseMint' => '<string>',
'payer' => '<string>',
'claimersArray' => [
'<string>'
],
'basisPointsArray' => [
5000
],
'feeLimits' => [
[
'asset' => [
'mint' => '<string>',
'tokenProgram' => '<string>'
],
'basisPoints' => 5000,
'maximumFeeRaw' => '<string>'
]
],
'additionalLookupTables' => [
'<string>'
],
'quoteMint' => '<string>',
'quoteTokenProgram' => '<string>',
'partner' => '<string>',
'partnerConfig' => '<string>',
'admin' => '<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/v2"
payload := strings.NewReader("{\n \"baseMint\": \"<string>\",\n \"payer\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 5000\n ],\n \"feeLimits\": [\n {\n \"asset\": {\n \"mint\": \"<string>\",\n \"tokenProgram\": \"<string>\"\n },\n \"basisPoints\": 5000,\n \"maximumFeeRaw\": \"<string>\"\n }\n ],\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"quoteMint\": \"<string>\",\n \"quoteTokenProgram\": \"<string>\",\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"admin\": \"<string>\",\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/v2")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"baseMint\": \"<string>\",\n \"payer\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 5000\n ],\n \"feeLimits\": [\n {\n \"asset\": {\n \"mint\": \"<string>\",\n \"tokenProgram\": \"<string>\"\n },\n \"basisPoints\": 5000,\n \"maximumFeeRaw\": \"<string>\"\n }\n ],\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"quoteMint\": \"<string>\",\n \"quoteTokenProgram\": \"<string>\",\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"admin\": \"<string>\",\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/v2")
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 \"baseMint\": \"<string>\",\n \"payer\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 5000\n ],\n \"feeLimits\": [\n {\n \"asset\": {\n \"mint\": \"<string>\",\n \"tokenProgram\": \"<string>\"\n },\n \"basisPoints\": 5000,\n \"maximumFeeRaw\": \"<string>\"\n }\n ],\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"quoteMint\": \"<string>\",\n \"quoteTokenProgram\": \"<string>\",\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"admin\": \"<string>\",\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": {
"contractVersion": 1,
"needsCreation": true,
"feeShareConfig": "<string>",
"feeShareAuthority": "<string>",
"asset": {
"mint": "<string>",
"tokenProgram": "<string>",
"decimals": 123
},
"flow": "dbc",
"meteoraConfigKey": "<string>",
"plan": {
"contractVersion": 1,
"operation": {
"kind": "config",
"baseMint": "<string>",
"flow": "dbc"
},
"asset": {
"mint": "<string>",
"tokenProgram": "<string>",
"decimals": 123
},
"feeLimits": [
{
"asset": {
"mint": "<string>",
"tokenProgram": "<string>"
},
"basisPoints": 5000,
"maximumFeeRaw": "<string>"
}
],
"transactions": [
{
"id": "<string>",
"kind": "config",
"dependsOn": [
"<string>"
],
"format": "v0",
"encoding": "base64",
"transaction": "<string>",
"messageSha256": "<string>",
"requiredSigners": [
"<string>"
],
"lifetime": {
"blockhash": "<string>",
"lastValidBlockHeight": "<string>"
},
"budget": {
"computeUnitLimit": 123,
"loadedAccountsDataSizeLimit": 123,
"priorityFee": {
"unit": "total_lamports",
"amount": "<string>"
}
},
"size": {
"bytes": 123,
"accounts": 123,
"signatures": 123
}
}
],
"readiness": {
"status": "ready"
}
}
}
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}Create custom quote Fee Share config plan
Create (or fetch) a fee sharing config denominated in any supported quote mint, not just wrapped SOL. Returns a staged transaction plan: sign and send the entries in response.plan.transactions in order. If response.plan.readiness.status is setup_required, confirm the setup transaction(s) first, then call this endpoint again to fetch the rebuilt plan. response.needsCreation is false once the config already exists on-chain, in which case response.plan is null.
For non-WSOL DBC issuance, the exact quote mint and bagsConfigType must have an admin-saved configuration; select from flows[].configs in /token-launch/supported-quote-tokens. Omission selects Default, with no fallback to another type. A missing pair returns quote_not_reviewed. The graduation threshold comes from that configuration, not a public request argument. Issued launch parameters remain unchanged by later admin edits. Omitted or explicit WSOL keeps built-in settings.
curl --request POST \
--url https://public-api-v2.bags.fm/api/v1/fee-share/config/v2 \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"baseMint": "<string>",
"payer": "<string>",
"claimersArray": [
"<string>"
],
"basisPointsArray": [
5000
],
"feeLimits": [
{
"asset": {
"mint": "<string>",
"tokenProgram": "<string>"
},
"basisPoints": 5000,
"maximumFeeRaw": "<string>"
}
],
"additionalLookupTables": [
"<string>"
],
"quoteMint": "<string>",
"quoteTokenProgram": "<string>",
"partner": "<string>",
"partnerConfig": "<string>",
"admin": "<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/v2"
payload = {
"baseMint": "<string>",
"payer": "<string>",
"claimersArray": ["<string>"],
"basisPointsArray": [5000],
"feeLimits": [
{
"asset": {
"mint": "<string>",
"tokenProgram": "<string>"
},
"basisPoints": 5000,
"maximumFeeRaw": "<string>"
}
],
"additionalLookupTables": ["<string>"],
"quoteMint": "<string>",
"quoteTokenProgram": "<string>",
"partner": "<string>",
"partnerConfig": "<string>",
"admin": "<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({
baseMint: '<string>',
payer: '<string>',
claimersArray: ['<string>'],
basisPointsArray: [5000],
feeLimits: [
{
asset: {mint: '<string>', tokenProgram: '<string>'},
basisPoints: 5000,
maximumFeeRaw: '<string>'
}
],
additionalLookupTables: ['<string>'],
quoteMint: '<string>',
quoteTokenProgram: '<string>',
partner: '<string>',
partnerConfig: '<string>',
admin: '<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/v2', 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/v2",
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([
'baseMint' => '<string>',
'payer' => '<string>',
'claimersArray' => [
'<string>'
],
'basisPointsArray' => [
5000
],
'feeLimits' => [
[
'asset' => [
'mint' => '<string>',
'tokenProgram' => '<string>'
],
'basisPoints' => 5000,
'maximumFeeRaw' => '<string>'
]
],
'additionalLookupTables' => [
'<string>'
],
'quoteMint' => '<string>',
'quoteTokenProgram' => '<string>',
'partner' => '<string>',
'partnerConfig' => '<string>',
'admin' => '<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/v2"
payload := strings.NewReader("{\n \"baseMint\": \"<string>\",\n \"payer\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 5000\n ],\n \"feeLimits\": [\n {\n \"asset\": {\n \"mint\": \"<string>\",\n \"tokenProgram\": \"<string>\"\n },\n \"basisPoints\": 5000,\n \"maximumFeeRaw\": \"<string>\"\n }\n ],\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"quoteMint\": \"<string>\",\n \"quoteTokenProgram\": \"<string>\",\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"admin\": \"<string>\",\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/v2")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"baseMint\": \"<string>\",\n \"payer\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 5000\n ],\n \"feeLimits\": [\n {\n \"asset\": {\n \"mint\": \"<string>\",\n \"tokenProgram\": \"<string>\"\n },\n \"basisPoints\": 5000,\n \"maximumFeeRaw\": \"<string>\"\n }\n ],\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"quoteMint\": \"<string>\",\n \"quoteTokenProgram\": \"<string>\",\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"admin\": \"<string>\",\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/v2")
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 \"baseMint\": \"<string>\",\n \"payer\": \"<string>\",\n \"claimersArray\": [\n \"<string>\"\n ],\n \"basisPointsArray\": [\n 5000\n ],\n \"feeLimits\": [\n {\n \"asset\": {\n \"mint\": \"<string>\",\n \"tokenProgram\": \"<string>\"\n },\n \"basisPoints\": 5000,\n \"maximumFeeRaw\": \"<string>\"\n }\n ],\n \"additionalLookupTables\": [\n \"<string>\"\n ],\n \"quoteMint\": \"<string>\",\n \"quoteTokenProgram\": \"<string>\",\n \"partner\": \"<string>\",\n \"partnerConfig\": \"<string>\",\n \"admin\": \"<string>\",\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": {
"contractVersion": 1,
"needsCreation": true,
"feeShareConfig": "<string>",
"feeShareAuthority": "<string>",
"asset": {
"mint": "<string>",
"tokenProgram": "<string>",
"decimals": 123
},
"flow": "dbc",
"meteoraConfigKey": "<string>",
"plan": {
"contractVersion": 1,
"operation": {
"kind": "config",
"baseMint": "<string>",
"flow": "dbc"
},
"asset": {
"mint": "<string>",
"tokenProgram": "<string>",
"decimals": 123
},
"feeLimits": [
{
"asset": {
"mint": "<string>",
"tokenProgram": "<string>"
},
"basisPoints": 5000,
"maximumFeeRaw": "<string>"
}
],
"transactions": [
{
"id": "<string>",
"kind": "config",
"dependsOn": [
"<string>"
],
"format": "v0",
"encoding": "base64",
"transaction": "<string>",
"messageSha256": "<string>",
"requiredSigners": [
"<string>"
],
"lifetime": {
"blockhash": "<string>",
"lastValidBlockHeight": "<string>"
},
"budget": {
"computeUnitLimit": 123,
"loadedAccountsDataSizeLimit": 123,
"priorityFee": {
"unit": "total_lamports",
"amount": "<string>"
}
},
"size": {
"bytes": 123,
"accounts": 123,
"signatures": 123
}
}
],
"readiness": {
"status": "ready"
}
}
}
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}configType from Supported Custom Quote Tokens, then pass that type as bagsConfigType. Omitting it selects Default and requires a saved Default entry for the quote. A missing pair returns quote_not_reviewed.
Graduation thresholds come from the selected configuration; this request does not accept a threshold override. Issuance saves the launch parameters so later admin updates cannot change an already-issued launch.
See Launch a Token with a Custom Quote for the complete bonding-curve workflow.Authorizations
API key authentication. Provide your API key as the header value.
Body
Public key of the base mint (the token being launched)
Public key of the wallet funding config creation
Which custom quote launch flow this config is for
dbc, damm_v2_direct Array of fee claimer wallet public keys. Must align with basisPointsArray, be unique, and contain 1-100 entries.
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.
1 - 100 elementsBasis points allocated to the corresponding claimer
0 <= x <= 10000Optional: requested transaction wire format. Defaults to v0.
v0, v1 Optional: signed token transfer-fee schedule ceilings. Defaults to the observed active schedule; a higher execution-time rate or cap fails the bounded transaction. Maximum 4 entries.
4Show child attributes
Show child attributes
Optional: extra address lookup tables to compile the transactions against. Maximum 8 entries.
8Public key of a lookup table address
Optional: public key of the quote mint this config is denominated in. Defaults to wrapped SOL. Cannot be changed once the config is issued.
Optional: public key of the SPL token program that owns quoteMint (Token or Token-2022)
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: public key of the config manager. Defaults to whichever claimer holds 10,000 bps.
Optional: DBC configuration type. For a non-WSOL quote, select a configType returned in that quote's flows[].configs. Omission selects Default and requires that exact quote/Default entry; a missing pair returns quote_not_reviewed. The issued parameters are retained if an admin later updates the quote configuration.
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: when true, the first swap on the new pool pays the minimum (ending) base fee instead of the starting cliff fee. Only affects config types that use a base-fee scheduler.
Optional: base58 encoded public key of the tip recipient wallet
Optional: tip amount in lamports
