# Otomate > Token launches on Ink and Robinhood Chain: each token is a plain ERC-20 with its own Uniswap v4 pool. Public API, real-time feed, TypeScript SDK, MCP server, builder codes. Full text for models: https://www.otomate.fun/llms-full.txt OpenAPI: https://www.otomate.fun/docs/kit/openapi.v1.json ## Build on Otomate - [Build on Otomate](https://www.otomate.fun/docs/developers#build-on-otomate): Every Otomate launch is a plain ERC-20 token and its own Uniswap v4 pool. The pool's hook-owned liquidity is the launch curve, so the token trades from its first block through standard routers, on **I - [Two ways to build](https://www.otomate.fun/docs/developers#two-ways-to-build): **Level 1, open to everyone.** Use the SDK, the API and the feed, and add your builder code to the trades you send. You need no account and no approval. - [Free to start](https://www.otomate.fun/docs/developers#free-to-start): Every read, the feed and the API work without a key. Limits apply per client. - [Chains and contracts](https://www.otomate.fun/docs/developers#chains-and-contracts): One API host serves both chains: `https://api.otomate.fun`, with the chain in the path. Every answer names its chain. - [Versioning and stability](https://www.otomate.fun/docs/developers#versioning-and-stability): - [Your own launchpad](https://www.otomate.fun/docs/developers#your-own-launchpad): The starter launchpad is a Next.js site built on the SDK: Explore, token pages with a live chart and trades, Create, a buy and sell ticket and creator profiles. Brand, colors and your builder code liv ## Quickstart - [Quickstart](https://www.otomate.fun/docs/developers#quickstart): Two complete programs that follow new launches in real time and buy each new launch paired with WETH, paying in ETH. Both run as they are; read [Trade launch pools](/docs/developers#trade-launch-pools - [Follow launches and trade in 30 lines](https://www.otomate.fun/docs/developers#follow-launches-and-trade-in-30-lines): **TypeScript** ([quickstart.ts](/docs/kit/quickstart.ts)), with the SDK and viem. Node 18 or later. - [Before you trade](https://www.otomate.fun/docs/developers#before-you-trade): ## Real-time feed - [Real-time feed](https://www.otomate.fun/docs/developers#real-time-feed): The feed pushes every new launch, trade, 50 % mint gate and graduation of one chain as soon as its block is mined. It is public, free to start, and resumable: a client that reconnects with its last cu - [Choose what you receive](https://www.otomate.fun/docs/developers#choose-what-you-receive): Without `cursor` or `fromBlock`, the feed starts with what happens next. Markers (`ready`, `final`, `reorg`) always come, whatever the filter. - [Events](https://www.otomate.fun/docs/developers#events): Every event has the same envelope; `data` depends on its `type`. - [Markers](https://www.otomate.fun/docs/developers#markers): Markers carry an `id` too, so `Last-Event-ID` always points to where you are. - [WebSocket](https://www.otomate.fun/docs/developers#websocket): Same query, same JSON (each frame is one event or marker, with its `type`). The server pings every 15 seconds; a client that stops answering is disconnected. To send an API key from Node, use a client - [Pages](https://www.otomate.fun/docs/developers#pages): `GET /api/v1/{chain}/feed/events?cursor=…&limit=500` answers up to 500 events after the cursor, and `next`, the cursor to continue from. `complete: true` means you reached the newest event. A page can - [Limits and slow clients](https://www.otomate.fun/docs/developers#limits-and-slow-clients): ## API v1 - [API v1](https://www.otomate.fun/docs/developers#api-v1): Everything a front end, a bot or a data pipeline needs about Otomate's launches, in plain JSON. `https://api.otomate.fun/api/v1/{chain}` serves both chains ([Chains and contracts](/docs/developers#cha - [Endpoints](https://www.otomate.fun/docs/developers#endpoints): Creating tokens uses `POST /metadata` and `POST /create-transaction`: see [Create tokens](/docs/developers#create-tokens). - [Conventions](https://www.otomate.fun/docs/developers#conventions): - [Swap transactions](https://www.otomate.fun/docs/developers#swap-transactions): Add `builder`, `builderFeeBps` and `builderTag` to carry your [builder code](/docs/developers#builder-codes) (a tag alone needs no builder). - [Errors](https://www.otomate.fun/docs/developers#errors): Errors answer a closed code: `{"error": "API_QUERY", "field": "…"}`. - [API keys](https://www.otomate.fun/docs/developers#api-keys): A key raises your limits and is free. A wallet signs a message, the API answers a key bound to that wallet. The API stores nothing: the key carries its wallet and a signature, and every key of one wal - [Limits](https://www.otomate.fun/docs/developers#limits): Limits are per client: your key's wallet, or your address without a key. Each answer carries `RateLimit-Policy: ;w=60`. - [Pay per request (x402)](https://www.otomate.fun/docs/developers#pay-per-request-x402): Where enabled, a request above your budget answers `402 Payment Required` instead of `429`, with its price and terms in the `PAYMENT-REQUIRED` header (x402 version 2): USDC on Base (`eip155:8453`), pa - [Stability](https://www.otomate.fun/docs/developers#stability): Within v1, fields may be added; none is removed, renamed or changes type. Breaking changes ship as `/api/v2` next to v1. Fee rates are data: read them from each pool, never hard-code them. ## Trade launch pools - [Trade launch pools](https://www.otomate.fun/docs/developers#trade-launch-pools): A launch pool is a Uniswap v4 pool with LP fee 0 and Otomate's hook. You trade it through **Otomate's router** (one approval of the input token to it, then one transaction; no Permit2) or through each - [How a swap is charged](https://www.otomate.fun/docs/developers#how-a-swap-is-charged): Each pool stores its rates once, in its registration snapshot (`LaunchRegistered`, the launch event, the token sheet): a quote fee `q` and a burn `b`, in basis points, for the curve, and a second pair - [Quote](https://www.otomate.fun/docs/developers#quote): The V4 Quoter simulates the hook, so its answer is what executes, both fee legs included. Use `quoteExactInputSingle` with the pool key, `zeroForOne` and empty hookData (or your builder code). - [Route: Otomate's router](https://www.otomate.fun/docs/developers#route-otomates-router): `LaunchPoolRouter` at `0x173b1e9eCC06d53b239754602177F1707BFE76A1`, the same address on Ink, Robinhood Chain, Base and HyperEVM (each chain's runtime code hash is in the SDK, `LAUNCH_POOL_DEPLOYMENT.l - [Route: the Universal Router with Permit2](https://www.otomate.fun/docs/developers#route-the-universal-router-with-permit2): ERC-20 inputs go through Permit2: approve the token to Permit2, then give the router a Permit2 allowance; the SDK and the API prepare both for exactly the amount in. A launch token's own `permit` (EIP - [Read the result](https://www.otomate.fun/docs/developers#read-the-result): The hook emits one `SwapFee` per swap, right after the PoolManager's `Swap`: - [Slippage, deadlines, MEV](https://www.otomate.fun/docs/developers#slippage-deadlines-mev): ## Create tokens - [Create tokens](https://www.otomate.fun/docs/developers#create-tokens): Anyone can create a token, a bot included: call the factory and pay its creation fee in ETH. One transaction deploys the token, its pool with the whole supply, an NFT collection if you ask for one, an - [In one call](https://www.otomate.fun/docs/developers#in-one-call): `createToken` uploads the metadata to Otomate's point of upload, asks the API to build the factory call, **checks that it goes to the official factory and that every field is your choice** (name, symb - [The choices](https://www.otomate.fun/docs/developers#the-choices): The creation fee depends only on `withCollection`: read `creationFee(withCollection)` on the factory, or `creationFee` in the API's answer. Besides that fee, the factory takes your initial buy and the - [Collection art](https://www.otomate.fun/docs/developers#collection-art): A collection's art direction is the `artworkCommitment` of the factory call (`artwork` in the SDK, `artworkCommitment` in the API's create-transaction body). It is set at creation: - [Metadata](https://www.otomate.fun/docs/developers#metadata): The token's metadata is a JSON file on IPFS; its URI is stored at creation and never changes. Its format, `otomate.token-metadata.v1`: - [Build the call yourself](https://www.otomate.fun/docs/developers#build-the-call-yourself): The API builds it: `POST /api/v1/{chain}/create-transaction` with your address, the metadata URI and your choices. It simulates the call and answers `transaction` (`to`, `data`, `value`, `gas`), `pred - [After the launch](https://www.otomate.fun/docs/developers#after-the-launch): ## Builder codes - [Builder codes](https://www.otomate.fun/docs/developers#builder-codes): A builder code lets the front end, bot or terminal that sends a trade earn a fee on it. You add your code to the swaps you send; the trader pays your fee on top of the pool's fees, in the pool's pair; - [Add your code](https://www.otomate.fun/docs/developers#add-your-code): The code is the swap's hookData, exactly 96 bytes: `abi.encode(address builder, uint256 feeBps, bytes32 tag)`. - [See what you earned](https://www.otomate.fun/docs/developers#see-what-you-earned): - [Claim](https://www.otomate.fun/docs/developers#claim): Call `claimBuilderFees(currencies, recipient)` on the hook from your builder address. It sends what you earned in each listed currency to `recipient`, less one raw unit that stays in your account (so - [Builder code in the starter launchpad](https://www.otomate.fun/docs/developers#builder-code-in-the-starter-launchpad): The starter launchpad puts your code on every trade it sends: set your address, rate and tag in its configuration file. See [Your own launchpad](/docs/developers#your-own-launchpad). ## Data providers - [Data providers](https://www.otomate.fun/docs/developers#data-providers): This page is for data providers and indexers: screeners, aggregators, analytics, wallets and terminals that list Otomate launches from their own pipelines. Everything here is read from the chain. Otom - [Launch model for indexers](https://www.otomate.fun/docs/developers#launch-model-for-indexers): An Otomate launch is two things: - [Network and contracts for indexers](https://www.otomate.fun/docs/developers#network-and-contracts-for-indexers): **Ink (57073).** Explorer: [explorer.inkonchain.com](https://explorer.inkonchain.com). - [Discover launches](https://www.otomate.fun/docs/developers#discover-launches): One creation is one transaction. Anyone can send it, a bot or another app included. Its logs come in this order: - [Price from the pool](https://www.otomate.fun/docs/developers#price-from-the-pool): Read the price from `sqrtPriceX96`, in the pool's real currency order: - [Trades from SwapFee](https://www.otomate.fun/docs/developers#trades-from-swapfee): The hook emits one `SwapFee` per swap. It is a complete trade record: - [Liquidity of a launch pool](https://www.otomate.fun/docs/developers#liquidity-of-a-launch-pool): The hook creates two positions in its own pool (salts 1 and 2) and owns them. Their ticks are in the snapshot, already in the pool's orientation: - [Progress and graduation](https://www.otomate.fun/docs/developers#progress-and-graduation): **Progress** is the pair held by the bonding position, over the threshold: - [Fee rates in the snapshot](https://www.otomate.fun/docs/developers#fee-rates-in-the-snapshot): Each pool's rates are numbers in its snapshot (`LaunchRegistered`, or `hook.snapshot(poolId)`). Read them per pool; show them as they are. - [Metadata and token profile](https://www.otomate.fun/docs/developers#metadata-and-token-profile): **Base metadata.** `LaunchCreated.metadataURI`, also in `factory.tokenInfo(token).metadataURI`. Launches prepared through Otomate's point of upload use `ipfs://` raw CIDs. The factory only bounds a UR - [Supply and burns](https://www.otomate.fun/docs/developers#supply-and-burns): - [Indexing checklist](https://www.otomate.fun/docs/developers#indexing-checklist): 1. **Follow the config.** Read `LaunchHookSet` from the config's deployment block. Keep the list of every hook it named. 2. **Subscribe to the hooks' logs only.** One `eth_getLogs` filter on the hook - [History: earlier Otomate tokens](https://www.otomate.fun/docs/developers#history-earlier-otomate-tokens): - [Otomate's own data](https://www.otomate.fun/docs/developers#otomates-own-data): You can skip running an indexer, or check yours against Otomate's. Every surface is free to start: no key is needed, and a key signed by a wallet raises the limits ([Free to start](/docs/developers#fr ## Coming from pump.fun - [Coming from pump.fun](https://www.otomate.fun/docs/developers#coming-from-pumpfun): If you built on pump.fun, directly or through PumpPortal, most of what you know maps one to one. The main difference: an Otomate launch never migrates. Its bonding curve is a position in its own Unisw - [pump.fun concepts on Otomate](https://www.otomate.fun/docs/developers#pumpfun-concepts-on-otomate): Rates are numbers in each pool's snapshot: a quote fee in the pair on every buy and sell, and a burn in the token when the creator chose one. Read them per pool ([How a swap is charged](/docs/develope - [Create and buy side by side](https://www.otomate.fun/docs/developers#create-and-buy-side-by-side): **pump.fun through PumpPortal's Local Transaction API** (Solana, simplified): - [Stream launches and trades like PumpPortal](https://www.otomate.fun/docs/developers#stream-launches-and-trades-like-pumpportal): PumpPortal subscribes by message on one WebSocket: - [What works differently](https://www.otomate.fun/docs/developers#what-works-differently): ## AI agents - [AI agents](https://www.otomate.fun/docs/developers#ai-agents): An AI agent can do everything on Otomate a bot can: find launches, read a token, quote, trade, create tokens, earn builder fees, and pay for premium API requests. It can also prepare a trade that its - [The MCP server](https://www.otomate.fun/docs/developers#the-mcp-server): `otomate-mcp` reads and builds; it never signs and never holds a key. The user signs every transaction in their own wallet. - [Trade from your assistant](https://www.otomate.fun/docs/developers#trade-from-your-assistant): With `prepare_trade`, any assistant connected to the MCP server (Claude, ChatGPT, Grok…) prepares a trade that its user signs on otomate.fun, in their own wallet. The assistant never signs and Otomate - [Documents for models](https://www.otomate.fun/docs/developers#documents-for-models): - [Build a launchpad in one prompt](https://www.otomate.fun/docs/developers#build-a-launchpad-in-one-prompt): Give this to your coding assistant, with your values filled in ([launchpad-prompt.md](/docs/kit/launchpad-prompt.md)): - [Agents that pay their own way](https://www.otomate.fun/docs/developers#agents-that-pay-their-own-way): - [Good practice for agents](https://www.otomate.fun/docs/developers#good-practice-for-agents): ## Status and security - [Status and security](https://www.otomate.fun/docs/developers#status-and-security): - [Status](https://www.otomate.fun/docs/developers#status): [otomate.fun/status](/status) shows, for each chain, how far the indexer is (latest and finalized blocks and their age) and whether the real-time feed is serving. Machines read the same from `GET /api - [Report a vulnerability](https://www.otomate.fun/docs/developers#report-a-vulnerability): Open a ticket on the [Otomate Discord](https://discord.com/invite/otomate), the same contact as in [/.well-known/security.txt](/.well-known/security.txt). Please include the chain, the contract or end - [Audit](https://www.otomate.fun/docs/developers#audit): The audit report of the launch pool contracts is published here once the audit is complete. - [What the contracts do](https://www.otomate.fun/docs/developers#what-the-contracts-do): These are facts of the code, for anyone assessing a launch. The addresses are in [Chains and contracts](/docs/developers#chains-and-contracts). - [Stability of the API](https://www.otomate.fun/docs/developers#stability-of-the-api): See [Versioning and stability](/docs/developers#versioning-and-stability). ## Files - [Quickstart, TypeScript](https://www.otomate.fun/docs/kit/quickstart.ts) - [Quickstart, Python](https://www.otomate.fun/docs/kit/quickstart.py) - [Launchpad prompt](https://www.otomate.fun/docs/kit/launchpad-prompt.md)