curl --request POST \
--url https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/v2 \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"feeClaimer": "<string>",
"tokenMint": "<string>",
"virtualPoolAddress": "<string>",
"dammV2Position": "<string>",
"dammV2Pool": "<string>",
"dammV2PositionNftAccount": "<string>",
"tokenAMint": "<string>",
"tokenBMint": "<string>",
"tokenAVault": "<string>",
"tokenBVault": "<string>",
"claimVirtualPoolFees": true,
"claimDammV2Fees": true,
"isCustomFeeVault": true,
"feeShareProgramId": "<string>",
"customFeeVaultClaimerA": "<string>",
"customFeeVaultClaimerB": "<string>"
}
'import requests
url = "https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/v2"
payload = {
"feeClaimer": "<string>",
"tokenMint": "<string>",
"virtualPoolAddress": "<string>",
"dammV2Position": "<string>",
"dammV2Pool": "<string>",
"dammV2PositionNftAccount": "<string>",
"tokenAMint": "<string>",
"tokenBMint": "<string>",
"tokenAVault": "<string>",
"tokenBVault": "<string>",
"claimVirtualPoolFees": True,
"claimDammV2Fees": True,
"isCustomFeeVault": True,
"feeShareProgramId": "<string>",
"customFeeVaultClaimerA": "<string>",
"customFeeVaultClaimerB": "<string>"
}
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({
feeClaimer: '<string>',
tokenMint: '<string>',
virtualPoolAddress: '<string>',
dammV2Position: '<string>',
dammV2Pool: '<string>',
dammV2PositionNftAccount: '<string>',
tokenAMint: '<string>',
tokenBMint: '<string>',
tokenAVault: '<string>',
tokenBVault: '<string>',
claimVirtualPoolFees: true,
claimDammV2Fees: true,
isCustomFeeVault: true,
feeShareProgramId: '<string>',
customFeeVaultClaimerA: '<string>',
customFeeVaultClaimerB: '<string>'
})
};
fetch('https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/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/token-launch/claim-txs/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([
'feeClaimer' => '<string>',
'tokenMint' => '<string>',
'virtualPoolAddress' => '<string>',
'dammV2Position' => '<string>',
'dammV2Pool' => '<string>',
'dammV2PositionNftAccount' => '<string>',
'tokenAMint' => '<string>',
'tokenBMint' => '<string>',
'tokenAVault' => '<string>',
'tokenBVault' => '<string>',
'claimVirtualPoolFees' => true,
'claimDammV2Fees' => true,
'isCustomFeeVault' => true,
'feeShareProgramId' => '<string>',
'customFeeVaultClaimerA' => '<string>',
'customFeeVaultClaimerB' => '<string>'
]),
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/token-launch/claim-txs/v2"
payload := strings.NewReader("{\n \"feeClaimer\": \"<string>\",\n \"tokenMint\": \"<string>\",\n \"virtualPoolAddress\": \"<string>\",\n \"dammV2Position\": \"<string>\",\n \"dammV2Pool\": \"<string>\",\n \"dammV2PositionNftAccount\": \"<string>\",\n \"tokenAMint\": \"<string>\",\n \"tokenBMint\": \"<string>\",\n \"tokenAVault\": \"<string>\",\n \"tokenBVault\": \"<string>\",\n \"claimVirtualPoolFees\": true,\n \"claimDammV2Fees\": true,\n \"isCustomFeeVault\": true,\n \"feeShareProgramId\": \"<string>\",\n \"customFeeVaultClaimerA\": \"<string>\",\n \"customFeeVaultClaimerB\": \"<string>\"\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/token-launch/claim-txs/v2")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"feeClaimer\": \"<string>\",\n \"tokenMint\": \"<string>\",\n \"virtualPoolAddress\": \"<string>\",\n \"dammV2Position\": \"<string>\",\n \"dammV2Pool\": \"<string>\",\n \"dammV2PositionNftAccount\": \"<string>\",\n \"tokenAMint\": \"<string>\",\n \"tokenBMint\": \"<string>\",\n \"tokenAVault\": \"<string>\",\n \"tokenBVault\": \"<string>\",\n \"claimVirtualPoolFees\": true,\n \"claimDammV2Fees\": true,\n \"isCustomFeeVault\": true,\n \"feeShareProgramId\": \"<string>\",\n \"customFeeVaultClaimerA\": \"<string>\",\n \"customFeeVaultClaimerB\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/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 \"feeClaimer\": \"<string>\",\n \"tokenMint\": \"<string>\",\n \"virtualPoolAddress\": \"<string>\",\n \"dammV2Position\": \"<string>\",\n \"dammV2Pool\": \"<string>\",\n \"dammV2PositionNftAccount\": \"<string>\",\n \"tokenAMint\": \"<string>\",\n \"tokenBMint\": \"<string>\",\n \"tokenAVault\": \"<string>\",\n \"tokenBVault\": \"<string>\",\n \"claimVirtualPoolFees\": true,\n \"claimDammV2Fees\": true,\n \"isCustomFeeVault\": true,\n \"feeShareProgramId\": \"<string>\",\n \"customFeeVaultClaimerA\": \"<string>\",\n \"customFeeVaultClaimerB\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"response": [
{
"tx": "<string>",
"blockhash": {
"blockhash": "<string>",
"lastValidBlockHeight": 123
}
}
]
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}{
"success": false,
"error": "<string>"
}Get Claim Transactions
Generate normal creator/recipient fee transactions from virtual pools, DAMM v2 positions, or custom user fee vaults. Supports v1 and v2 fee-share programs. These transactions do not withdraw the separate SOL deployer entitlement, even for a wallet in both roles. Use POST /fee-share/deployer/claim-txs for SOL deployer revenue. Non-SOL custody vaults retain their separate vault endpoints. Sign, submit, and confirm all returned transactions in order.
Fee-share v2 creator claims (isCustomFeeVault: true, feeShareProgramId for v2) from DBC and DAMM v2 pools return versioned (v0) transactions using an address lookup table. A single response array can mix these with legacy transactions from other claim types, so deserialize every item with VersionedTransaction.deserialize, which handles both formats, rather than the legacy-only Transaction.from.
curl --request POST \
--url https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/v2 \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"feeClaimer": "<string>",
"tokenMint": "<string>",
"virtualPoolAddress": "<string>",
"dammV2Position": "<string>",
"dammV2Pool": "<string>",
"dammV2PositionNftAccount": "<string>",
"tokenAMint": "<string>",
"tokenBMint": "<string>",
"tokenAVault": "<string>",
"tokenBVault": "<string>",
"claimVirtualPoolFees": true,
"claimDammV2Fees": true,
"isCustomFeeVault": true,
"feeShareProgramId": "<string>",
"customFeeVaultClaimerA": "<string>",
"customFeeVaultClaimerB": "<string>"
}
'import requests
url = "https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/v2"
payload = {
"feeClaimer": "<string>",
"tokenMint": "<string>",
"virtualPoolAddress": "<string>",
"dammV2Position": "<string>",
"dammV2Pool": "<string>",
"dammV2PositionNftAccount": "<string>",
"tokenAMint": "<string>",
"tokenBMint": "<string>",
"tokenAVault": "<string>",
"tokenBVault": "<string>",
"claimVirtualPoolFees": True,
"claimDammV2Fees": True,
"isCustomFeeVault": True,
"feeShareProgramId": "<string>",
"customFeeVaultClaimerA": "<string>",
"customFeeVaultClaimerB": "<string>"
}
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({
feeClaimer: '<string>',
tokenMint: '<string>',
virtualPoolAddress: '<string>',
dammV2Position: '<string>',
dammV2Pool: '<string>',
dammV2PositionNftAccount: '<string>',
tokenAMint: '<string>',
tokenBMint: '<string>',
tokenAVault: '<string>',
tokenBVault: '<string>',
claimVirtualPoolFees: true,
claimDammV2Fees: true,
isCustomFeeVault: true,
feeShareProgramId: '<string>',
customFeeVaultClaimerA: '<string>',
customFeeVaultClaimerB: '<string>'
})
};
fetch('https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/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/token-launch/claim-txs/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([
'feeClaimer' => '<string>',
'tokenMint' => '<string>',
'virtualPoolAddress' => '<string>',
'dammV2Position' => '<string>',
'dammV2Pool' => '<string>',
'dammV2PositionNftAccount' => '<string>',
'tokenAMint' => '<string>',
'tokenBMint' => '<string>',
'tokenAVault' => '<string>',
'tokenBVault' => '<string>',
'claimVirtualPoolFees' => true,
'claimDammV2Fees' => true,
'isCustomFeeVault' => true,
'feeShareProgramId' => '<string>',
'customFeeVaultClaimerA' => '<string>',
'customFeeVaultClaimerB' => '<string>'
]),
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/token-launch/claim-txs/v2"
payload := strings.NewReader("{\n \"feeClaimer\": \"<string>\",\n \"tokenMint\": \"<string>\",\n \"virtualPoolAddress\": \"<string>\",\n \"dammV2Position\": \"<string>\",\n \"dammV2Pool\": \"<string>\",\n \"dammV2PositionNftAccount\": \"<string>\",\n \"tokenAMint\": \"<string>\",\n \"tokenBMint\": \"<string>\",\n \"tokenAVault\": \"<string>\",\n \"tokenBVault\": \"<string>\",\n \"claimVirtualPoolFees\": true,\n \"claimDammV2Fees\": true,\n \"isCustomFeeVault\": true,\n \"feeShareProgramId\": \"<string>\",\n \"customFeeVaultClaimerA\": \"<string>\",\n \"customFeeVaultClaimerB\": \"<string>\"\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/token-launch/claim-txs/v2")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"feeClaimer\": \"<string>\",\n \"tokenMint\": \"<string>\",\n \"virtualPoolAddress\": \"<string>\",\n \"dammV2Position\": \"<string>\",\n \"dammV2Pool\": \"<string>\",\n \"dammV2PositionNftAccount\": \"<string>\",\n \"tokenAMint\": \"<string>\",\n \"tokenBMint\": \"<string>\",\n \"tokenAVault\": \"<string>\",\n \"tokenBVault\": \"<string>\",\n \"claimVirtualPoolFees\": true,\n \"claimDammV2Fees\": true,\n \"isCustomFeeVault\": true,\n \"feeShareProgramId\": \"<string>\",\n \"customFeeVaultClaimerA\": \"<string>\",\n \"customFeeVaultClaimerB\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api-v2.bags.fm/api/v1/token-launch/claim-txs/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 \"feeClaimer\": \"<string>\",\n \"tokenMint\": \"<string>\",\n \"virtualPoolAddress\": \"<string>\",\n \"dammV2Position\": \"<string>\",\n \"dammV2Pool\": \"<string>\",\n \"dammV2PositionNftAccount\": \"<string>\",\n \"tokenAMint\": \"<string>\",\n \"tokenBMint\": \"<string>\",\n \"tokenAVault\": \"<string>\",\n \"tokenBVault\": \"<string>\",\n \"claimVirtualPoolFees\": true,\n \"claimDammV2Fees\": true,\n \"isCustomFeeVault\": true,\n \"feeShareProgramId\": \"<string>\",\n \"customFeeVaultClaimerA\": \"<string>\",\n \"customFeeVaultClaimerB\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"response": [
{
"tx": "<string>",
"blockhash": {
"blockhash": "<string>",
"lastValidBlockHeight": 123
}
}
]
}{
"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 fee claimer wallet
Token mint public key
Virtual pool address (required if claimVirtualPoolFees is true)
DAMM v2 position public key
DAMM v2 pool public key
DAMM v2 position NFT account public key
Token A mint public key
Token B mint public key
Token A vault public key
Token B vault public key
Whether to claim virtual pool fees
Whether to claim DAMM v2 fees
Whether using a custom fee vault (true for fee share v1 or v2 programs)
Program ID of the fee share program being used. Required when isCustomFeeVault is true.
Custom fee vault claimer A public key (for v1 fee share)
Custom fee vault claimer B public key (for v1 fee share)
Which side of the custom fee vault to claim for (for v1 fee share)
A, B 