集成

Aggregation API

Last updated January 31, 2026

Genesis API 允许聚合器和应用程序查询 Genesis 代币发行的发行数据。使用这些端点在您的应用程序中显示发行信息、代币元数据和社交链接。

您将学到什么

本参考文档涵盖:

  • 用于发行元数据的 HTTP API 端点
  • 使用 JavaScript SDK 获取链上状态
  • TypeScript 和 Rust 类型定义
  • 实时 Bucket 和存款状态

概要

通过 HTTP API 获取元数据,或通过 SDK 获取实时链上状态来访问 Genesis 数据。

  • HTTP API 返回发行信息、代币元数据、社交链接
  • SDK 提供实时状态:存款、计数、时间条件
  • HTTP API 无需身份验证
  • 链上获取需要 Umi 和 Genesis SDK

该 API 是公开的,有速率限制。无需身份验证。

Base URL

https://api.metaplex.com/v1

网络选择

默认情况下,API 返回 Solana 主网数据。要查询 devnet 上的发行数据,请添加 network 查询参数:

?network=solana-devnet

示例:

# Mainnet (default)
curl https://api.metaplex.com/v1/launches/7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN
# Devnet
curl "https://api.metaplex.com/v1/launches/7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN?network=solana-devnet"

使用场景

  • /launches/{genesis_pubkey} - 当您拥有 Genesis 地址时使用,例如来自链上事件或交易日志。
  • /tokens/{mint} - 当您只知道代币 Mint 地址时使用。返回与该代币关联的所有发行活动(一个代币可以有多个发行活动)。

端点

通过 Genesis 地址获取发行信息

GET /launches/{genesis_pubkey}

请求示例:

curl https://api.metaplex.com/v1/launches/7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN

响应:

{
"data": {
"launch": {
"launchPage": "https://example.com/launch/mytoken",
"type": "launchpool",
"genesisAddress": "7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN"
},
"baseToken": {
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"name": "My Token",
"symbol": "MTK",
"image": "https://example.com/token-image.png",
"description": "A community-driven token for the example ecosystem."
},
"website": "https://example.com",
"socials": {
"x": "https://x.com/mytoken",
"telegram": "https://t.me/mytoken",
"discord": "https://discord.gg/mytoken"
}
}
}

通过代币 Mint 获取发行信息

GET /tokens/{mint}

返回某个代币的所有发行活动。响应格式相同,只是 launches 是一个数组。

请求示例:

curl https://api.metaplex.com/v1/tokens/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

响应:

{
"data": {
"launches": [
{
"launchPage": "https://example.com/launch/mytoken",
"type": "launchpool",
"genesisAddress": "7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN"
}
],
"baseToken": {
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"name": "My Token",
"symbol": "MTK",
"image": "https://example.com/token-image.png",
"description": "A community-driven token for the example ecosystem."
},
"website": "https://example.com",
"socials": {
"x": "https://x.com/mytoken",
"telegram": "https://t.me/mytoken",
"discord": "https://discord.gg/mytoken"
}
}
}

查找 Genesis 公钥需要索引或 getProgramAccounts。如果您只有代币 Mint,请使用 /tokens 端点。

错误

{
"error": {
"message": "Launch not found"
}
}
状态码描述
400错误请求 - 无效参数
404未找到发行活动或代币
429超出速率限制
500服务器内部错误

类型与示例

TypeScript

interface Launch {
launchPage: string;
type: string;
genesisAddress: string;
}
interface BaseToken {
address: string;
name: string;
symbol: string;
image: string;
description: string;
}
interface Socials {
x?: string;
telegram?: string;
discord?: string;
}
interface LaunchResponse {
data: {
launch: Launch;
baseToken: BaseToken;
website: string;
socials: Socials;
};
}
interface TokenResponse {
data: {
launches: Launch[];
baseToken: BaseToken;
website: string;
socials: Socials;
};
}
interface ErrorResponse {
error: {
message: string;
};
}

示例:

const response = await fetch(
"https://api.metaplex.com/v1/launches/7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN"
);
const { data }: LaunchResponse = await response.json();
console.log(data.baseToken.name); // "My Token"

Rust

use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Launch {
pub launch_page: String,
#[serde(rename = "type")]
pub launch_type: String,
pub genesis_address: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BaseToken {
pub address: String,
pub name: String,
pub symbol: String,
pub image: String,
pub description: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Socials {
pub x: Option<String>,
pub telegram: Option<String>,
pub discord: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LaunchData {
pub launch: Launch,
pub base_token: BaseToken,
pub website: String,
pub socials: Socials,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TokenData {
pub launches: Vec<Launch>,
pub base_token: BaseToken,
pub website: String,
pub socials: Socials,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct LaunchResponse {
pub data: LaunchData,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct TokenResponse {
pub data: TokenData,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApiError {
pub message: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ErrorResponse {
pub error: ApiError,
}

示例:

let response: LaunchResponse = reqwest::get(
"https://api.metaplex.com/v1/launches/7nE9GvcwsqzYcPUYfm5gxzCKfmPqi68FM7gPaSfG6EQN"
)
.await?
.json()
.await?;
println!("{}", response.data.base_token.name); // "My Token"

在您的 Cargo.toml 中添加以下依赖:

[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }

获取链上状态(JavaScript SDK)

除了 HTTP API,您还可以使用 Genesis JavaScript SDK 直接从区块链获取发行状态。这对于获取存款总额和时间条件等实时数据非常有用。

Bucket 状态

import { fetchLaunchPoolBucketV2 } from '@metaplex-foundation/genesis';
const bucket = await fetchLaunchPoolBucketV2(umi, launchPoolBucket);
console.log('Total deposits:', bucket.quoteTokenDepositTotal);
console.log('Deposit count:', bucket.depositCount);
console.log('Claim count:', bucket.claimCount);
console.log('Token allocation:', bucket.bucket.baseTokenAllocation);

时间条件

每个 Bucket 有四个时间条件来控制发行阶段:

const bucket = await fetchLaunchPoolBucketV2(umi, launchPoolBucket);
// Deposit window
const depositStart = bucket.depositStartCondition.time;
const depositEnd = bucket.depositEndCondition.time;
// Claim window
const claimStart = bucket.claimStartCondition.time;
const claimEnd = bucket.claimEndCondition.time;
console.log('Deposit starts:', new Date(Number(depositStart) * 1000));
console.log('Deposit ends:', new Date(Number(depositEnd) * 1000));
console.log('Claims start:', new Date(Number(claimStart) * 1000));
console.log('Claims end:', new Date(Number(claimEnd) * 1000));

存款状态

import {
fetchLaunchPoolDepositV2,
safeFetchLaunchPoolDepositV2,
} from '@metaplex-foundation/genesis';
// Throws if not found
const deposit = await fetchLaunchPoolDepositV2(umi, depositPda);
// Returns null if not found
const maybeDeposit = await safeFetchLaunchPoolDepositV2(umi, depositPda);
if (deposit) {
console.log('Amount:', deposit.amountQuoteToken);
console.log('Claimed:', deposit.claimed);
}

常见问题

API 和链上获取有什么区别?

API 返回聚合的元数据(社交链接、图片)。通过 SDK 进行链上获取则返回实时状态,如存款总额和时间条件。

如何获取实时存款总额?

使用 Genesis SDK 中的 fetchLaunchPoolBucketV2fetchPresaleBucketV2 来读取当前链上状态。

可以查询 Bucket 的时间条件吗?

可以。获取 Bucket 账户并访问 depositStartConditiondepositEndConditionclaimStartConditionclaimEndCondition

如何检查用户是否已存款?

使用 safeFetchLaunchPoolDepositV2safeFetchPresaleDepositV2 配合存款 PDA。如果不存在存款记录,则返回 null。

术语表

术语定义
Aggregation从多个来源收集和标准化数据
Bucket 状态当前链上数据,包括存款总额和计数
时间条件控制某个阶段开始或结束的 Unix 时间戳
存款 PDA存储用户存款记录的程序派生地址
safeFetch对于缺失账户返回 null 而非抛出错误的获取变体

后续步骤