API 参考
公开的只读接口,基地址 https://api.samefirst.com。所有响应都是 JSON;金额以 wei 字符串表示(1 BNB = 10¹⁸ wei),时间是 Unix 秒。
限流与缓存
| 项目 | 规则 |
|---|---|
| 普通接口 | 每个 IP 每分钟 120 次 |
/api/flap*、/api/meta、/api/tx*、/api/bind/* | 每个 IP 每分钟 30 次(要读链、模拟执行或调用 Flap) |
| 超限 | 返回 429,正文含 retry_after_s |
| 缓存 | 响应带 cache-control 和 x-cache: HIT/MISS;同一 URL 在缓存期内返回同一份数据 |
| 接口 | 缓存 |
|---|---|
/api/launches、/api/launch/*、/api/recent | 3 秒 |
/api/me/*、/api/airdrops* | 5 秒 |
/api/stats、/api/profile/* | 10 秒 |
/api/dao、/api/hot | 15 秒 |
/api/name/*、/api/address/*、/api/search | 30 秒 |
/api/flap、/api/flap/estimate、/api/vanity、/api/timeline | 60 秒 |
/api/binding/* | 3 秒 |
/api/decode | 5 分钟 |
/api/health、/api/meta、/api/admin/*、/api/tx*、/api/bind/* | 不缓存 |
需要更高频率,请直接读链上事件(见合约)。
首发
GET /api/launches
首发列表。默认先列认购中、再已募满、再已发射,同组内按排序条件。
| 参数 | 说明 |
|---|---|
sort | progress(默认,认购进度)· people(人数)· amount(金额) |
stage | Open · Full · Launched · Done · Refunding,不填为全部 |
limit | 默认 50,最大 200 |
每一项包含:address、creator(发起交易的地址)、creator_id(发行人代表的 Agent ID 地址,可能是它自己,也可能是它绑定到的 ID;没有为 null)、creator_name、template_id(玩法模板,0 = 经典)、binding(这一轮锁定的绑定合约)、kind(TaxV6/TaxV6Vault/PlainV7)、name、symbol、meta、pool、quote_token、slip_bps、fee_bps、buy_tax_bps、sell_tax_bps、min_per_id、max_per_id、target、raised、left_bnb、progress(0–1,认购进度)、subscribers、stage、created_time、filled_at、launched_at、graduated_at(在 Flap 毕业、流动性迁移到 DEX 的时间)、token、spent、tokens_bought、fee_charged,以及 tax_split(税收分配,单位 bps:mkt 创作者、burn 销毁、div 分红、lp 流动性;普通币为 null)和 tax_to_dao(创作者那份税收是否全部给 Samefirst DAO),flap_blocked(Flap 不接受这一轮的 name 名称 / symbol 代号 / both 两者,募满也无法发射;正常或尚未检查为 null)和 refund_at(这种首发募满后可全额退款的时间,其余为 null)。
GET /api/launch/:addr
单个首发的全部字段,加上当前认购者列表(subscribers:who 是付款和收款的地址,id 是它算在哪个 Agent ID 名下,name 是该 ID 的名字;用绑定钱包认购时 who ≠ id)、退出和分发记录,以及 stats:
| 字段 | 说明 |
|---|---|
first_sub_time、exits、exited_people | 第一笔认购时间、退出次数和人数 |
distributed、distributed_at | 分发到账人数和完成时间 |
graduated_at、dex_pool | 毕业时间和 DEX 池子地址 |
holders | 发射后持有这个代币的地址数(由代币的链上转账逐笔计算) |
real_holders、real_share | 其中持有 Agent ID 的真人人数,以及他们合计持有的供应量比例(0–1) |
top10_share | 最大的 10 个持有人合计比例,不计合约地址(内盘、DEX 池子、首发合约),除非该合约本身持有 Agent ID |
GET /api/launch/:addr/wall
名字墙:认购事件流(认购、追加、退出),limit 默认 100,最大 500。
GET /api/me/:addr
addr 也可以是名字(带不带 .ai 都行),查看不需要连接钱包。某个地址的 Agent ID、参与和发起的首发、认购额,以及收到的 DAO 空投(airdrops:每个批次每种代币一条,含金额、是否到账、交易哈希)。参与的首发另含 my_balance(当前持仓)、my_since(这次持有开始的时间)、my_received、my_refunded、my_exit_back;my_payee 是这一轮实际付款和收款的地址(ID 用绑定钱包认购时就是那个钱包)。查的是 Agent ID 时,绑定钱包代它认购的首发也列在里面。binding 同下面 /api/binding 的前三个字段。profile 同下。
GET /api/profile/:id
名片数据,id 是名字(可带 .ai)或地址。profile 含 joined(参加过的首发数)、at_launch(发射时仍在的场数)、created、holding(仍持有的首发代币数)、hold_days(持有最久的那个代币已连续持有的天数)、airdrops(收到过的空投批次数)、early(前 5 万个领取)和 pending_airdrops(发放中、还没到账的空投,按代币合计)。
GET /api/hot?limit=10
真人热度榜:认购中的首发按当前认购人数,已发射的按持有 Agent ID 的真人持有人数(real_people),从多到少,最多 50 个。
钱包绑定
GET /api/binding/:who
who 是地址或名字。返回:
| 字段 | 说明 |
|---|---|
contract | 新首发使用的绑定合约 |
wallet | who 是 Agent ID 时:它绑定的钱包(address、bound_at、tx),没有为 null |
id | who 是钱包时:它代表的 Agent ID(address、name、bound_at、tx),没有为 null |
next_bind_at、nonce | Agent ID:最早可以再绑定的时间(0 = 现在)、当前签名序号 |
wallet_free_at | 钱包:最早可以被绑定的时间(0 = 现在) |
history | 最近 50 条绑定记录:kind(bound / unbound / revoked)、id_addr、wallet、detail(解绑方式 wallet / id / id_signature / replaced)、block_time、tx_hash |
交给 Agent 的接口(单号)
Agentic Wallet 只能通过对话操作。这几个接口把一笔交易或一份待签授权准备好、检查好,存成一个 6 位单号(30 分钟有效,只能取一次),由 Agent 用 Samefirst 技能 取回执行。只会生成调用 Samefirst 首发合约或绑定合约的内容,永远不会生成代币授权或转账。
POST /api/tx
{ "action": "subscribe", "launch": "0x…", "from": "0x…", "amount": "0.05" }| 字段 | 说明 |
|---|---|
action | subscribe(认购或追加)· exit · claim · refund · withdraw · withdraw_tokens |
launch | 首发合约地址 |
from | 将要发出交易的地址(Agentic Wallet 地址或绑定钱包) |
amount | 认购金额,单位 BNB(也可用 amount_wei);只有 subscribe 需要 |
lang | 可选,en 时 summary 用英文(默认中文);/api/bind/request 同样支持 |
check | 可选,true 时只检查和模拟,返回同样的交易内容但不生成单号(没有 code、expires_at) |
后端依次检查:首发存在且阶段正确;from 代表哪个 Agent ID;这个 ID 这一轮是否已用别的地址认购;金额是否在每人上下限和剩余额度内;最后用 from 模拟执行。不通过返回 400:{"error": "中文原因", "code": "错误代码"}。通过返回:
{ "kind": "tx", "code": "NHJQU3", "expires_at": 1793008991, "chain_id": 56, "action": "subscribe",
"launch": "0x…", "from": "0x…", "to": "0x…", "value": "50000000000000000", "value_bnb": "0.05",
"data": "0x8f449a05", "function": "subscribe()", "summary": "认购 0.05 BNB 到首发 HERD(0x…),代表 xxx.ai;代币和退款都发到 0x…" }POST /api/bind/request
{ "name": "alice", "wallet": "0x…" } // 绑定
{ "action": "unbind", "name": "alice" } // 解绑当前钱包检查名字、冷却期和占用情况,返回待签的 EIP-712 授权:kind: "sign"、code、signer(Agent ID 地址)、wallet、binding、deadline、digest(合约算出的摘要,用来核对签名)、summary,以及 typed_data(domain 为 Samefirst Binding / 1 / 56 / 绑定合约,primaryType 为 Bind 或 Unbind,可直接交给 eth_signTypedData_v4)。
GET /api/tx/:code
Agent 用单号取回上面两种内容之一(原样,含 typed_data 的字段顺序)。只能取一次:再取返回 410(CodeUsed);过期返回 410(CodeExpired);不存在返回 404。
验证方式和黑白名单
每一轮由发行人选一种或几种验证方式,满足任一种即可认购:工厂里登记的身份来源(agent_id 币安 Agent ID、babt BABT、holding 认购时查持币余额)、发行人白名单(whitelist,Agent ID 或普通地址)、对所有地址开放(open)。/api/launch/:addr 和 /api/launches 里的 ways 是这一轮的方式(按合约尝试的顺序),sources 是身份来源的细节(持币的代币和门槛),open_mode 表示是否已开放给所有地址;/api/launches?way=babt 等可以按方式筛选。第一次认购时确定的身份(某个 Agent ID,或地址本身)之后不变。发行人还可以有自己的项目黑名单;平台另有全局黑名单和禁用的代币名称。规则都在链上执行(SamefirstLists、SamefirstGate 合约),下面的接口只是让它们看得见、用得上。拉黑 Agent ID 会同时拦住绑定到它的钱包;已经认购的人不受影响。
GET /api/lists
平台黑名单 blocked(address、name、reason、time、tx)、禁用的代币名称 names、发行人移出次数上限 max_unblocks、申诉入口 appeal;enabled 为假表示名单还没上线。公开页:samefirst.com/lists。
GET /api/launch/:addr/eligible/:who
who 是地址或 Agent ID 名字。返回 ok、以什么身份参加 id(Agent ID 或地址本身);不能认购时 code:2 平台黑名单、3 这一轮的项目黑名单、4 不符合这一轮的任何验证方式、5 暂时拿不到这一轮的白名单,text 是中文原因;走白名单时 proof 是认购要带的白名单证明。结论直接来自链上 SamefirstGate.canEnter。
POST /api/whitelist
{"names":["alice","bob.ai"],"addresses":["0x…"]},最多 50,000 个。持有 Agent ID 的地址按 ID 计,其它地址按地址本身计。返回 Merkle 根 root(作为一批白名单写进合约:创建时或之后由发行人追加)、有效数量 count 和无法识别的 invalid。链上有首发用了这个根之后,完整名单会发布到 IPFS,CID 出现在那个首发的 whitelist_cid 和下面的接口里。
GET /api/whitelist/:root
某个白名单的全部地址和名字。叶子是 keccak256(bytes.concat(keccak256(abi.encode(地址))))(Agent ID 或普通地址),两两排序后哈希(OpenZeppelin MerkleProof),任何人都能用 IPFS 上的名单自己核对根。
POST /api/whitelist/snapshot · GET /api/whitelist/snapshot/:id
持币快照:{"token":"0x…","min":"<最小单位>","block":<区块,0 = 最新>} 开始一个后台任务,返回 id;轮询返回 status(running / done / failed)、progress、完成后的 root、cid、count。平台读出那个区块达到门槛的全部持有人(按余额排序),存成一批白名单,用法和 POST /api/whitelist 的结果一样。需要读取代币的全部转账记录,创建太早的代币会返回 failed。
白名单轮的认购
认购要调用 subscribe(bytes32[] proof)(选择器 0xe38c9a53)带上证明;只能走白名单的地址用不带证明的 subscribe() 会被拒。POST /api/tx 会自动判断并带上;被拦时返回 GloballyBlocked、BlockedInRound、NotEligible、NotWhitelisted 或 NoWhitelist;被平台隐藏的轮次返回 Hidden。/api/launch/:addr 另有:launch 里的 gated、whitelisted(专属轮)、open_to_all(发行人已转为公开)、open_at(开放认购的时间,0 = 创建即开放)、preparing(准备中,还不能认购;/api/tx 返回 NotOpenYet)、max_unblocks;白名单批次 whitelists(root、cid、count、time)和合计 whitelist_count;项目黑名单 round_blocks(who、name、blocked、unblocks、time);项目资料 info(见下)。状态多了 Cancelled(发行人在准备期取消)。
社区、发射钱包和金库
GET /api/launch/:addr/comments·POST /api/launch/:addr/comments:评论。发表要用钱包签一段以「Samefirst 评论」开头的消息(message、signature),只有这一轮的发行人、认购者和发射后的持币者能发,每分钟一条,最多 500 字。POST /api/comments/:id/report举报。- 被平台隐藏的轮次:
/api/launch/:addr里hidden为真,不出现在列表里,不再接受新的认购。 GET /api/launcher/:addr:这个发行人(有 Agent ID 按 ID 计)的固定发射地址launcher、余额balance和创建时要预付的 gasprepay(wei,余额够时为 0)。募满后的前 10 分钟只有这个地址能发射。GET /api/vaults:可选的 Flap 精选金库模板(Flap 金库商店里的模板,不含 Split Vault),带分类、中英文名称和说明;GET /api/vault/:factory?quote=0x…:某个工厂能不能用(allowed、reasons)、是否官方审计audited,以及它对vaultData的描述schema。/api/launch/:addr里dex_pair是发射后 DexScreener 上流动性最大的交易对,用于 K 线。
税收分红
税收给 DAO 的首发,Flap 的收税地址是这一轮自己的分账合约(SamefirstSplitter,地址由首发地址和 DAO 比例算出来)。/api/launch/:addr 里 splitter(没有则为 null)、splitter_bps(DAO 比例,基点)、splitter_deployed。/api/flap 的 samefirst 里 splitter_factory 和 split_dao_bps 是工厂地址和给新首发的默认 DAO 比例。
GET /api/launch/:addr/dividends/:who
who(认购时的地址)现在能领多少:alloc(当初分到的代币)、factor(持币系数,1e18 = 100%)、deployed,以及每种资产的 asset(BNB 是零地址)、symbol、due(扣持币系数前)、pay(扣之后)。分账合约还没部署时按它地址上的余额估算。
GET /api/dividends/:who
who 是地址或 Agent ID 名字:它参加过的、有分账合约的首发,每项同上,另有 payee(实际领取的地址,绑定钱包代认购的也列出)。
领取
POST /api/tx 的 action: "dividend":交易发往分账合约,claim(address[])(选择器 0x318d9e5d)领取所有有余额的资产。分账合约还没部署返回 NotDeployed,不是认购地址返回 NotSubscriber,没有可领返回 NothingToDo。
税收给推特账号
带税币的税收可以指定给推特账号(SamefirstXSplitter,地址由首发地址、推特账号的 keccak256("x:" + 数字 ID)、推特主比例和认领期限算出来)。/api/flap 的 samefirst 里 x_splitter_factory(null = 未开放)、x_window(认领期限,秒)、x_max_bps(8000)。
GET /api/x/user?handle=foo:查推特账号,返回id、handle、name、avatar、followers;找不到 404。POST /api/x/intent{launch, x_id, x_bps, window}:创建页在发出创建交易之前登记这一轮的推特账号分账合约,返回splitter(= 链上predict)。首发出现后,索引器只保留真的被设为收税地址的那一个。/api/launch/:addr的x_tax(没有则为 null):handle、name、avatar、x_bps、window、deployed、deadline、status(waiting等待认领 /claimed已认领 /expired过期进 DAO)、claimed_at、paid(每种资产已打给推特主wallet、DAOdao、过期转入 DAOforfeit的数量)。收款钱包不公开。- 推特主认领:
GET /api/x/login?back=<站内页面>跳转到 X 登录,回来时页面地址带#xs=<会话>;GET /api/x/me(Authorization: Bearer <会话>)列出指定给这个账号的首发及待领金额;POST /api/x/claim{splitter, wallet}登记收款钱包,平台用认领密钥在链上调用bind(推特主不花 gas、不签名);POST /api/x/logout。
项目资料
发行人在 samefirst.com 上展示的社区链接、联系方式和公告,不上链,随时能改,每个版本都公开保留。
POST /api/launch/:addr/info
{"message":"…","signature":"0x…"}:发行人(创建地址,或绑定到发行人 Agent ID 的钱包)用 personal_sign 签的文字,内容本身就在文字里:
Samefirst 项目资料
首发:0x…
时间:<Unix 秒>
{"links":[{"type":"telegram","url":"https://t.me/…"}],"contact":"…","note":"…"}type 是 telegram、discord、x、website、other;链接最多 10 条、必须是 http(s);联系方式 200 字、公告 1000 字以内。签名 10 分钟内有效,时间必须晚于上一版;每小时最多改 10 次。
GET /api/launch/:addr/info/history
全部版本,新的在前,带原始签名文字和签名,任何人都能自己验证。
/api/launch/:addr 的 info:links、contact、note、updated_at、versions、has_address(文字里出现了钱包地址);被运营隐藏时只有 hidden 和 hidden_reason。
错误代码
合约用错误代码报错,Agent 的预览里可能只显示一串十六进制。
| 接口 | 说明 |
|---|---|
GET /api/decode?data=0x… | 把报错数据(或包含它的整段报错文字)翻成中文:code、selector、text |
GET /api/errors | 全部错误代码、4 字节选择器和中文说明 |
Samefirst DAO
GET /api/dao
累计进账(launch_fees、exit_fees、swept)、最近的资金流水,以及 DAO 钱包 safe:地址和实时 BNB 余额(bnb_wei)。
totals:税收佣金(commission_bnb)、税收分成(tax_share_bnb,各首发的分账合约打给 DAO 的 BNB)、捐赠(donations_bnb、donations 笔数,含代币捐赠)、支出(spent_bnb,其中买入代币 spent_buy_bnb、其他 spent_other_bnb)、airdrop_batches、airdrop_people。
ledger:多签的收支明细,最新在前。每条含 dir(in / out)、kind、time、tx、n(笔数)和金额:
kind | 含义 |
|---|---|
launch_fee · exit_fee · sweep | 首发手续费、退出手续费(同一场首发同一天合并)、清扫零头 |
tax_commission | 带税币的 Flap 税收佣金(symbol 为来源代币;非 BNB 池以池子币到账时带 token_symbol、decimals) |
tax_share | 首发的分账合约打给 DAO 的税收分成,同一场首发同一天合并;via 为 subscribers(认购者分账合约)或 x(推特账号分账合约);以池子币到账时带 token_symbol、decimals。明细:/api/dao/detail?kind=tax_share&launch=…&day=… |
donation | 别人直接转给多签的 BNB |
token_in | 转入多签的代币(token_symbol、decimals) |
buy · spend | 多签发出的 BNB:给 Flap 或 PancakeSwap 合约记为买入,其余记为支出(MultiSend 里的每一笔都单独计) |
airdrop · token_out | 多签转出的代币,同一笔交易合并为一条(tokens 列出每种代币);对上空投批次的带 batch_id、batch_name |
GET /api/airdrops
已公开的空投批次(发放中、已完成、已取消),最新在前。每项含 id、name、note、rule(all_ids / launches / custom)、tokens(每种代币的 token、symbol、decimals、total_wei、sent_wei)、recipients、sent(已全部到账的人数)、transfers、transfers_sent、status(active / done / cancelled)、created_at、published_at、done_at、snapshot_block。
GET /api/airdrops/:id
单个批次和名单(分页)。参数:page、size(最大 500)、q(地址或名字前缀)、status(pending 还有没到账的 / sent 全部到账)。名单每项含 address、handle、status(pending / partial / sent)和 items(每种代币一条:pos、amount_wei、status、tx_hash、sent_at)。
GET /api/airdrops/:id/csv
完整名单的 CSV 下载,每人每种代币一行,含到账状态。
Flap 参数
GET /api/flap
samefirst 字段是工厂当前给新首发的设置:factory、binding、fee_bps、min_target / max_target(募资目标范围,wei)、min_per_id_floor、official_vaults_only、abandon_after(募满后等待发射的秒数)、paused,以及 templates(每个模板的 id、name、impl、status、ready_at;生效中的模板带 creation_cost,即创建首发要付的金额)。
其余是从链上读取的 Flap 当前参数:Portal 版本、交易手续费(bps)、BNB 曲线(r、h、k、毕业储备)、Flap 列出的池子代币(enabled = Flap 已开放)。其他代币可以用 GET /api/flap/custom?token=…&bnb=… 检查:Flap 是否开放(自定义代币带 Flap 签名报价)、平台发射时会走的 PancakeSwap 路径、这么多 BNB 能换多少、价格冲击(impact_bps,超过 500 平台不发射)。
GET /api/flap/estimate?progress=58&pool=BNB
按 BNB 曲线估算达到某个发射后内盘进度所需的募资额。progress 取值 (0, 100];非 BNB 池在 100% 时含 20% 余量。
GET /api/flap/namecheck?name=MyCoin&symbol=ETH
向 Flap 的防诈骗模块查询这个名称和代号是否会被拒绝(Flap 拒绝 ETH、BTC、BNB、USDT 这类常见币种)。返回 {"name_ok": true, "symbol_ok": false}。被拒的首发募满后发射会失败(错误 BlacklistedNameOrSymbol),所以创建前要先查。缓存 10 分钟。
Logo 上传
POST /api/meta
创建首发时用:把代币 Logo 和简介等信息上传到 Flap,固定在 IPFS 上,返回一个 cid。这个 cid 就是创建代币时的 meta 字段,Flap 和 samefirst.com 都从它读取 Logo 和链接。浏览器直接调用 Flap 的上传接口会遇到跨域限制,所以由我们的后端转发。
请求为 multipart/form-data:
| 字段 | 必填 | 说明 |
|---|---|---|
image | 是 | Logo 图片:PNG、JPEG、WebP、SVG 或 GIF,不超过 3 MB(与 Flap 一致);建议正方形,512×512 以上 |
description | 否 | 代币简介,最多 256 个字符(与 Flap 一致) |
website | 否 | 官网链接 |
twitter | 否 | X 链接 |
telegram | 否 | Telegram 链接 |
成功返回 200:
{ "cid": "bafkreictuhft3yl5icnswbh52nhth3sjjcgrk7d4qnxglhuqehwgfznw3q" }cid 指向一份 JSON(description、website、twitter、telegram、image 等),其中 image 是图片自己的 CID。可以通过 Flap 的网关查看,例如 https://flap.mypinata.cloud/ipfs/<cid>。
| 状态码 | 含义 |
|---|---|
400 | 没有图片、图片超过 3 MB 或格式不支持、简介超过 256 个字符,或表单格式不对 |
429 | 超过频率限制(每个 IP 每分钟 30 次,与 /api/flap* 共用) |
502 | Flap 上传失败,或返回里没有 cid(正文 detail 带 Flap 的错误信息) |
示例:
curl -X POST https://api.samefirst.com/api/meta \
-F "image=@logo.png;type=image/png" \
-F "description=一句话介绍" \
-F "website=https://example.com" \
-F "twitter=https://x.com/example"上传的内容会永久公开在 IPFS 上,无法删除,请只上传要用于代币的正式素材。
其他
管理后台的 /api/admin/* 只供 DAO 管理使用(钱包签名登录),不在此列出。
Agent ID
| 接口 | 说明 |
|---|---|
GET /api/stats | Agent ID 总数和增长统计 |
GET /api/name/:handle | 按名字查(不含 .ai) |
GET /api/address/:addr | 按地址查 |
GET /api/search?q= | 名字前缀搜索,最多 20 条 |
GET /api/recent?limit= | 最新注册,默认 50,最大 200 |
GET /api/timeline?bucket=3600&hours=72 | 注册时间分布 |
GET /api/vanity | 三字符名字、吉利数字名字、最早的名字 |
GET /api/health | 服务状态和缓存统计 |