j7tracker
Trade Token

Sell Token

type sell_token — sell by percent of balance via basis_points.

Use POST {regionBase}/submit with "type": "sell_token". Selling is by percentage of wallet balance (basis_points), not a raw token amount.

Required

FieldTypeDescription
typestringMust be sell_token
session_idstringJWT (or Authorization: Bearer)
api_keystringYour encrypted Solana API key (or EVM key for mode: stroid — see How to get an API key)
mint_addressstringToken mint (Solana pubkey) or token contract address (0x… for mode: stroid)
basis_pointsinteger1–10000 = 0.01%–100% of balance to sell (e.g. 2500 = 25%)

Optional

The signer is always the wallet decrypted from api_key. The handler does not read a separate wallet_address (or similar) from the body for sells.

FieldTypeDescription
modestringPlatform routing: pump (default), bonk, ray, usd1, bags, stroid, …
creator_walletstringCreator pubkey when it must differ from the signer (defaults to signer if omitted; see below)
mayhem_modebooleanMayhem path when relevant
config_keystringBags fee-config key from deploy
refstringReferral code
priority_fee_solnumberPriority fee in SOL
bribe_fee_solnumberJito-style tip in SOL

Stroid sells (mode: stroid)

Sells on the stroid.fun token bound to the same FeeHook from launch. Different field shape than Solana sells:

FieldTypeDescription
mint_addressstringToken contract address (0x…). Alias accepted: token_address.
sell_percent | percent | basis_pointsnumberPercent of balance, 0 < n <= 100. basis_points is also accepted: values <= 100 are treated as percent, > 100 are divided by 100 (so 2500 = 25%, same convention as Solana).
gas_gweinumberOptional flat gas override in gwei. Sets both maxFeePerGas and maxPriorityFeePerGas. Aliases: priority_fee_gwei, max_fee_per_gas_gwei. Omit for dynamic fees.

The signer is always the wallet decrypted from api_key (the EVM key). Stroid sells use Permit2 + Universal Router under the hood — no extra approval tx needed.

Example

{
  "type": "sell_token",
  "session_id": "<jwt>",
  "api_key": "<encrypted_evm_key>",
  "mode": "stroid",
  "mint_address": "0x…",
  "sell_percent": 50,
  "gas_gwei": 2
}

Stroid sell response

{
  "type": "sell_success",
  "mode": "stroid",
  "mint_address": "0x…",
  "token_address": "0x…",
  "signature": "0x…",
  "tx_hash": "0x…",
  "sell_percent": 50,
  "amount_sold_raw": "5000000000000000000000",
  "amount_sold": "5000",
  "balance_before_raw": "10000000000000000000000",
  "balance_before": "10000",
  "eth_received_net_wei": "…",
  "eth_received_net": "0.0123…",
  "eth_received_gross_wei": "…",
  "eth_received_gross": "0.0125…",
  "gas_paid_wei": "…",
  "gas_paid_eth": "0.00018…",
  "username": "…"
}

bnb, nadfun, and clanker sells are not currently supported through /submit and will return sell_error.

Full examples

All examples use Content-Type: text/plain;charset=UTF-8 with a JSON string body to skip the CORS preflight OPTIONS request, saving one round-trip.

username in the body is overwritten from the JWT on /submit.

JavaScript (browser extension / fetch)

const BASE = "https://nyc.j7tracker.io/deploy"; // or regional: eu / lax / sgp

const body = JSON.stringify({
  type: "sell_token",
  session_id: "<jwt>",
  api_key: "<encrypted_solana_key>",
  mint_address: "MintAddressHere",
  basis_points: 10000, // 100% sell
  mode: "pump",
});

const res = await fetch(`${BASE}/submit`, {
  method: "POST",
  headers: { "Content-Type": "text/plain;charset=UTF-8" },
  body,
});
const data = await res.json();

if (data.type === "sell_success") {
  console.log("Sold:", data.signature);
} else {
  console.error("Error:", data.error);
}

Partial sell (25%):

const body = JSON.stringify({
  type: "sell_token",
  session_id: "<jwt>",
  api_key: "<encrypted_solana_key>",
  mint_address: "MintAddressHere",
  basis_points: 2500,
  mode: "pump",
});

Python

import json
import requests

BASE = "https://nyc.j7tracker.io/deploy"

payload = {
    "type": "sell_token",
    "session_id": "<jwt>",
    "api_key": "<encrypted_solana_key>",
    "mint_address": "MintAddressHere",
    "basis_points": 10000,
    "mode": "pump",
}

resp = requests.post(
    f"{BASE}/submit",
    headers={"Content-Type": "text/plain;charset=UTF-8"},
    data=json.dumps(payload),
    timeout=35,
)
data = resp.json()

if data.get("type") == "sell_success":
    print(f"Sold: {data['signature']}")
else:
    print(f"Error: {data.get('error')}")

Rust

use reqwest::Client;
use serde_json::{json, Value};

let base = "https://nyc.j7tracker.io/deploy";
let client = Client::new();

let body = json!({
    "type": "sell_token",
    "session_id": "<jwt>",
    "api_key": "<encrypted_solana_key>",
    "mint_address": "MintAddressHere",
    "basis_points": 10000,
    "mode": "pump",
});

let resp = client
    .post(format!("{base}/submit"))
    .header("Content-Type", "text/plain;charset=UTF-8")
    .body(body.to_string())
    .timeout(std::time::Duration::from_secs(35))
    .send()
    .await?;

let data: Value = resp.json().await?;
match data.get("type").and_then(|t| t.as_str()) {
    Some("sell_success") => {
        println!("Sold: {}", data["signature"]);
    }
    _ => {
        eprintln!("Error: {}", data["error"]);
    }
}

Responses

Success

{
  "type": "sell_success",
  "signature": "transaction_signature",
  "mint_address": "...",
  "basis_points": 10000,
  "wallet_address": "...",
  "mode": "pump",
  "username": "..."
}

Error

{
  "type": "sell_error",
  "error": "description",
  "username": "..."
}

The request may take up to 30 seconds before sell_success or sell_error, otherwise 504 with optional last_status.

Buy (SOL amount)

POST /submit does not support buy-by-SOL. This API only documents create_token and sell_token on /submit.

On this page