Introduction
0bull rents real iPhones by the month. Each phone is a physical handset, not an emulator or a cloud phone. It opens apps and publishes video for real.
Each phone is identified by a slot (a UUID) and holds up to four TikTok accounts. Instagram and YouTube accounts are supported too.
Accounts and submissions carry a platform of tiktok, instagram or youtube. It
defaults to tiktok everywhere.
Account ids are UUIDs
Accounts are identified by a UUID, such as 019feb70-07f7-71a4-a84e-e33b56837a1d, in the
REST API, MCP tools, and the app's own URLs. Submission ids are integers.
Getting a phone
Order at 0bull.net/order. No account is required up front: give a name, email and card, and an account is created from that email.
- One dedicated iPhone, one dedicated IP. The phone is reserved to you and keeps the same IP for as long as you hold it.
- $100 per phone, per month.
- Up to 4 accounts per phone, across TikTok, Instagram and YouTube.
- Nothing is charged at checkout. Checkout saves the card and holds one month per phone on it. An admin assigns the phone afterward, and the held amount is charged at that point.
- Orders are final. There is nothing to cancel while an order waits to be assigned.
Once you have a phone, manage it from 0bull.net. These docs cover the three ways to control it from your own tools: the MCP server, the REST API, and the WebSocket connection.
The MCP server
https://0bull.net/mcp exposes 24 tools covering accounts, submissions, billing and
uploads, and direct phone control (commands, raw input, screenshots, OCR, macros, and a GUI
agent). It authenticates with OAuth: add the URL to your client and authorize in a
browser. There is no token to copy.
This is the fuller surface, and the one to start with.
- MCP overview: what it does and how calls work
- Connecting: Claude Code, Claude Desktop, Cursor
- Tool reference: all 24 tools and their parameters
The REST API
https://0bull.net/api exposes 29 endpoints: accounts and submissions CRUD, batches to
many accounts, scheduling, completion webhooks, billing and phone rentals, uploads, and full
phone control (snapshots, OCR, raw input, commands, macros,
and a GUI agent). It authenticates with an API token sent as a bearer token.
1. Create a token. Go to 0bull.net/settings/api-tokens, name the token, and hit Create. The token is shown once, right after you create it. Copy it and store it somewhere safe. If you lose it, delete it and create another. You can revoke any token from that page at any time.
Token abilities
A token can be scoped to any of five abilities, picked when you create it:
| Ability | Grants |
|---|---|
phones:read | List phones, view snapshots and on-screen text, and check run status. |
phones:control | Send input, commands, macros and agent runs to a phone. |
accounts | Link, list, update and remove posting accounts. |
submissions | Create, list and cancel video submissions. |
billing | View billing and request phone rentals or count changes. |
A request whose token lacks the ability an endpoint needs gets a 403. A token created
without any scoped abilities has full access to every endpoint.
2. Send it on every request in the Authorization header:
Code
3. Post a video. Submissions upload the file itself, so this is a multipart request:
Code
Account ids are UUIDs, and a UUID identifies its own platform, so GET, PUT and DELETE
on /v1/accounts/{account} need nothing but the id. Add -F "platform=instagram" (or
youtube) to post somewhere other than TikTok. Omitting it means tiktok.
On YouTube the text is the Short's title, so caption is required there and capped at
100 characters rather than 2200.
The account must have a phone assigned before it can post. Publishing happens on a real
phone after the request returns, so poll GET /api/v1/submissions/{id} and read status to
see how it went, or pass a webhook_url and be called when it finishes. The
submission status table lists every value and which are
final.
To post one clip to many accounts, schedule ahead, or hand over videos by URL from a pipeline, see Publishing at volume.
- Publishing at volume: video handover, batches, scheduling
- Webhooks: the
submission.completedcallback and how to verify it - API reference: every endpoint, parameter, and response
The WebSocket connection
Call GET /api/v1/phone-controller with a bearer token to get a socket_url, then connect
and send {fun, msgid, data} frames to control phones and manage accounts, submissions and
billing over one connection. It also pushes status events (run, submission,
billing_request), so you do not have to poll.
Use this when you are building something live: an app that reacts to a submission finishing, or anything that wants push updates instead of polling REST.
- WebSocket reference: connecting, the frame format, every
/app/*fun, and the event types
Which one
| MCP | REST | WebSocket | |
|---|---|---|---|
| Surface | 24 tools | 29 endpoints | 24 funs over one connection |
| Auth | OAuth (browser) | API token (bearer) | API token, exchanged for a short-lived socket token |
| Platforms | TikTok, Instagram, YouTube | TikTok, Instagram, YouTube | TikTok, Instagram, YouTube |
| Account linking | Yes | Yes | Yes |
| Phone control | Yes | Yes | Yes |
| Billing and ordering | Yes | Yes | Yes |
| Video source | Public URL or upload id | File upload, public URL or upload id | Public URL or upload id |
| One clip to many accounts | No | Yes (batches) | No |
| Scheduling | No | Yes (scheduled_at) | No |
| Push updates | No (poll) | Webhook on submission completion | Yes (run, submission, billing_request) |
| Rate limit | 250/min | 250/min | No per-frame limit |
| Screen reads (OCR) | 60/min, shared | 60/min, shared | 60/min, shared |
All three cover the same ground: accounts, submissions, billing, uploads and full phone control. Pick based on how you are connecting, not on what is available:
- MCP: for an AI assistant or agent. OAuth means no token to manage.
- REST: for a plain HTTP client, a script, or an SDK. One request in, one response out.
- WebSocket: for live control or anything that reacts to status changes as they happen instead of polling.

