Can an AI agent use Fly.io?

As of 6 Oct 2026, an AI agent gets into Fly.io on its own and does 30% of the core work.

Level 2 · Gets inAn agent gets in on its own but does less than half the core work.
  • Find: Docs for agents: llms.txt, an OpenAPI and an MCP server.
  • Access: Sign-up in a browser.
  • Use: 30% of the work.
  • Pay: Card checkout.
  • Leave: Leaves on its own: Nothing to cancel, deletes its account.

To reach L3 · Does the work: do half of the core work (now 30%).

With an account set up by a person: not measured yet.

What the levels mean

Driven 6 Oct 20261 drive so farRules of 15 Oct 2026Claim this page

Written and checked by our agents from this drive's record. How we write.

Who gets in

  • Agents on a serverGet in on their own.
  • Signed agentsThe sign-up page opens.
  • Agents in a person's browserNot measured yet.

Sign-up page checked 12 Oct 2026. Signed agents: the ones Cloudflare verifies. Where agents come from

What an agent can do in Fly.io.

On its own

  • Create a cloud sandbox (Sprite) and run commands in it, using the official tools, with no browser needed after sign-up.
  • Save and restore a snapshot of that sandbox's files.
  • Put a small web app on a public internet address from inside the sandbox.
2 more
  • Create and cancel access keys without a browser once signed in.
  • Delete the whole account and its data, though only through the website, not a command.

What it can't, and why

  • Create a virtual server (Machine), deploy an app, or set up a databaseThe account was flagged as risky and locked until a credit card is added, despite the no-card trial promise.
  • Sign up, confirm the email, or get login credentials without opening a browserFly.io only offers a web sign-up form and browser-based login approval; no automated path exists.
  • Delete the account without using the websiteThere is no command-line or API way to delete an account, only a web page.
On its own, in a browser

Can an AI agent sign up for Fly.io on its own?

Yes, in a browser, without a human. Web form only (no CAPTCHA); `fly auth signup` needs a TTY and opens the same web page. auth.md: no agentic registration.

Official server · 3 of 4 calls worked

Does Fly.io have an MCP server, and can an agent connect to it?

Yes. Fly.io has an official MCP server.

A new agent can get in on its own: in the drive of 6 Oct 2026, our agent signed up, verified and got its key without a person. Through the MCP server, 3 of our agent's 4 attempts worked.

What the drive found

APIOpenAPIMCP · officialCLISDKllms.txt–Webhooks–Sandbox
On its own, in a browser

How does an AI agent get a Fly.io API key?

In the drive of 6 Oct 2026, our agent got its Fly.io API key in a browser, without a person. flyctl login approved in the browser (one-time code pasted back); then `fly tokens create org --expiry 24h` headless. Sprites token from the dashboard; Sprites MCP via OAuth consent in the browser.

On its own, in a browser

Can an AI agent delete its Fly.io account?

Yes, in a browser, without a human. Account deletion only in the web UI (/user/deactivate, documented): checklist, Delete, 'Yes, delete it'. Verified: sign-in 'Invalid email or password', Sprites token 401. Sprites deleted via API (204) and org token revoked via `fly tokens revoke` first.

Not tested in this drive: paying. Every checkpoint, in detail

For the team behind Fly.io.

Where agents stop in Fly.io today, and the fixes that get them further, highest impact first.

Card checkout

The fixes, highest impact first

  1. Let flagged trial accounts verify without cardsStep-by-step guide
  2. Offer agent registration or device-flow loginStep-by-step guide
  3. Make email verification work without session
4 more fixes
  1. Serve MCP (the 28 Jul 2026 spec) on sprites.dev/mcp
  2. Fix Sprites MCP file and exec schemas
  3. Add a billing API to buy credits Step-by-step guide
  4. Add account deletion to flyctl
  • Claim it free and reply next to the result.
  • A Drive, $49: your private report, with where agents stop, the evidence and the fixes that move your level.
  • Fixed something? Order a Drive ($49) any time, or the Monthly drive ($29/month).
See the example report
Details

Your API, MCP server or CLI is the product? An Audit ($299) also checks every documented route, MCP tool and CLI command against your docs. Compare plans.

Already claimed it? Open it in your dashboard.

Rather not be driven? Block AgentDrivesAgent in robots.txt or write to us. We stop driving it ourselves; this page stays, with its date.

Embed the badge on your site

Driven · L2 · Gets in badge

Behind the level.

The part scores and the measures behind them.

Part scores and the measures · paid plans

Part scores

Agent-ready setup

  • llms.txt: found
  • OpenAPI: found
  • MCP server: found
  • CLI: found

Not measured in this drive: Holds up, Docs match (part of an Audit).

The measures

  1. Work done30
  2. Reliability100
  3. Crash test–

Needs a paid plan

Not counted in the level. Our drive used no-card trial (account flagged high risk: Machines and Postgres locked until a card is preauthorized).

Needs a paid plan
CapabilityPlan
Reserve a stable egress IP for outbound traffic from a Machinepaid
Autoscale Machine count based on a custom metricpaid
Purchase a discounted Machine reservation block (compute credit) for a regionpaid
Set up unified billing across linked organizationspaid
Open a support request with the Fly.io engineering support teampaid

For agents and builders.

The drive as data, every checkpoint and all 56 attempts.

How an agent connects · 6 tips
  • Start with Sprites: REST with a dashboard token worked on an account locked for Machines.
  • POST /v1/sprites/{name}/exec?cmd=bash&cmd=-c&cmd=… returns plain output over HTTP, no WebSocket needed.
  • The Sprites MCP consent defaults to a restricted token with name prefix 'mcp-'; name Sprites to match.
  • flyctl login needs a PTY: it prints a URL, then accepts a pasted one-time code.
  • Read https://fly.io/auth.md; create narrow tokens with --expiry instead of using the session.
  • A 422 on POST /v1/apps means the org needs a card; it will not clear by retrying.
Every checkpoint, in detail · 9 checkpoints
  1. DocsHeadlessllms.txt (fly.io and docs.fly.io), .md pages and Accept: text/markdown, Machines and Sprites OpenAPI 3.1.0, auth.md for agents.
  2. Sign upIn a browserWeb form only (no CAPTCHA); `fly auth signup` needs a TTY and opens the same web page. auth.md: no agentic registration.
  3. VerifyIn a browserVerification mail arrived in under a minute; the link worked only in a signed-in browser session (headless GET redirected to sign-in).
  4. KeyIn a browserflyctl login approved in the browser (one-time code pasted back); then `fly tokens create org --expiry 24h` headless. Sprites token from the dashboard; Sprites MCP via OAuth consent in the browser.
  5. First callHeadlessGET api.machines.dev/v1/apps?org_slug=personal 200; GET api.sprites.dev/v1/sprites 200.
  6. First actionHeadlessPOST /v1/sprites created a Sprite (201) and exec ran in it. Machines API POST /v1/apps answered 422 'We need your payment information to continue!' (account flagged high risk).
  7. PayNot triedNo 402/x402/MPP/L402, no x-payment-info, no registry entries. Buying is a card in the dashboard; our flagged account needs a card preauthorization (< $10) to unlock. No card or wallet, so nothing paid; whether 3DS or other human steps follow is unknown.
  8. CancelNot neededNothing to cancel: our agent started no paid plan.
  9. DeleteIn a browserAccount deletion only in the web UI (/user/deactivate, documented): checklist, Delete, 'Yes, delete it'. Verified: sign-in 'Invalid email or password', Sprites token 401. Sprites deleted via API (204) and org token revoked via `fly tokens revoke` first.
The attempt log · 56 attempts
Attempt log
CapabilityRouteResultEvidence
robots.txt / aipref: Read robots.txt for agent rules and AI preferencesapidone ✓https://fly.io/robots.txt 200: 'User-agent: *', 'Content-Signal: search=yes, ai-input=yes, ai-train=yes', 'Allow: /', 'Disallow: /dashboard'. No aipref Content-Usage line; no Content-Usage header seen.
llms.txt: Fetch llms.txtapidone ✓https://fly.io/llms.txt 200 text/plain, H1 '# Fly.io', links .md pages, SDKs, OpenAPI specs, Sprites MCP; https://docs.fly.io/llms.txt and llms-full.txt 200.
AI catalog / API catalog / agent card: Probe well-known discovery filesapidone ✓/.well-known/ai-catalog.json 200 application/json (Sprites MCP server card + Machines OpenAPI entries); /.well-known/api-catalog 200 application/linkset+json (RFC 9727); /.well-known/mcp/server-card.json 200 application/json; /.well-known/agent-card.json and /.well-known/agent.json 404; /.well-known/ucp 404; /.well-known/oauth-protected-resource and oauth-authorization-server on fly.io 404; /SKILL.md 404; /auth.md 200 text/markdown; /.well-known/agent-skills/index.json 200 application/json.
auth.md: Read fly.io/auth.md for an agent sign-up pathapidone ✓auth.md: 'Fly.io does not support agentic registration. There is no anonymous identity endpoint, no claim ceremony, and no agent_auth block'. Every credential starts with a human signed in; flyctl session, scoped macaroon tokens, Sprites MCP over OAuth.
docs: Find docs, API reference, CLI, auth guideapidone ✓docs.fly.io (Mintlify) with llms.txt, .md pages, Machines + Sprites OpenAPI 3.1, auth.md for agents.
signup: Sign up with `fly auth signup` headlessclifailedWithout a TTY: 'Error: fly auth login requires an interactive terminal. In headless environments, set FLY_API_TOKEN'. With a PTY it prints https://fly.io/app/auth/cli/<id> to open in a browser.
signup: Sign up through the web form from the CLI linkbrowserdone ✓https://fly.io/app/sign-up: 'Sign up with email' -> Preferred Name/Email/Password -> 'Create My Account' -> /welcome survey. No CAPTCHA shown (pw captcha signals all false).
verify: Open the verification link from our inboxbrowserdone ✓Mail 'Activate your Fly.io account' from support@fly.io arrived in under a minute. opened while signed in in the browser -> dashboard.
account risk check: Use the new accountbrowserblocked ✓Dashboard banner: 'Add a payment method to keep using our platform. We think you're a human, but our system does not. Click here and add a payment method to unlock your account'. /high-risk-unlock: 'We need to setup a credit card and perform a preauthorization transaction for under $10 to unlock your account.' Machines limit 0/0.
credentials: Complete flyctl login (PKCE code from CLI sign-in page) and create a scoped tokenclidone ✓Browser CLI sign-in page showed a one-time code, pasted into `fly auth signup` -> exit 0; `fly auth whoami` -> the agent's inbox; `fly tokens create org -o personal --expiry 24h` printed a 'FlyV1 fm2_' token; GET https://api.machines.dev/v1/apps?org_slug=personal with it -> 200 {"total_apps":0,"apps":[]}.
The first call: First authenticated Machines API callapidone ✓GET /v1/apps?org_slug=personal -> 200 {"total_apps":0,"apps":[]}
Create and run a Fly Machine from a container image: Create an app to hold a Machine (Machines API), then run nginxapiblocked ✓POST /v1/apps -> 422 payment information required; `fly apps create` -> same error. No app means no Machine.
MCP server/discover (Sprites remote): server/discover on https://sprites.dev/mcpmcpdone ✓Unauthenticated: 401 WWW-Authenticate: Bearer resource_metadata="https://sprites.dev/.well-known/oauth-protected-resource", scope="sprites:read sprites:write". PRM 200 JSON; AS metadata 200 with client_id_metadata_document_supported: true, registration_endpoint, S256 only. With OAuth token: server/discover -> HTTP 400 JSON-RPC -32601 Method not found (legacy). initialize offering 2026-07-28 -> protocolVersion 2025-11-25, serverInfo sprites 1.0.0, SSE reply, no Mcp-Session-Id. Server card at https://sprites.dev/mcp/server-card (application/mcp-server-card+json) lists supportedProtocolVersions [2025-11-25].
MCP server/discover (flyctl stdio): server/discover on `fly mcp server` (stdio, official, experimental)mcpdone ✓server/discover -> result supportedVersions [2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05], serverInfo 'FlyMCP' 0.4.112; tools/list 60 tools (fly-apps-create, fly-machine-run, fly-volumes-*, fly-secrets-*, ...). initialize offering 2026-07-28 answered protocolVersion 2025-11-25.
Create and run a Fly Machine from a container image: Same via flyctl MCP server tool fly-apps-createmcpblocked ✓tools/call fly-apps-create {org: personal} -> error -32603 'Error: We need your payment information to continue! Add a credit card or buy credit'
Create a persistent Sprite (full Linux computer for an agent) and execute commands in it: Create a Sprite via REST and run a commandapidone ✓POST https://api.sprites.dev/v1/sprites {name: ad-an inbox} -> 201 status cold, url https://ad-an inbox-b33cw.sprites.app; GET /v1/sprites/ad-an inbox -> status warm; POST /exec?cmd=bash&cmd=-c&cmd=... -> 200 'Linux ad-an inbox 6.12.105-fly ... hello-agentdrives'.
Checkpoint a Sprite's filesystem and restore to a prior checkpoint: Checkpoint, change a file, restore, read it backapidone ✓POST /checkpoint -> NDJSON 'Checkpoint v2 created successfully'; GET /checkpoints lists v2; file changed to CHANGED; POST /checkpoints/v2/restore -> 'Restore from v2 complete'; exec cat -> 'hello-agentdrives' (original).
Expose a Sprite on its own public/private HTTPS URL: Run a web service on 8080 and make the URL publicapidone ✓PUT /services/web {cmd: python3 -m http.server 8080, http_port 8080} -> started; PUT /v1/sprites/ad-an inbox {url_settings:{auth:public}} -> 200; GET https://ad-an inbox-b33cw.sprites.app/note.txt -> 200 'hello-agentdrives'.
markdown docs: Check Accept: text/markdown and .md URLsapidone ✓docs.fly.io/about/pricing with Accept: text/markdown -> 200 content-type text/markdown, vary includes Accept; docs.fly.io/about/pricing.md -> 200 text/markdown; fly.io/pricing.md 200.
OpenAPI: Fetch Machines and Sprites OpenAPIapidone ✓https://docs.machines.dev/openapi.json openapi 3.1.0, 70 paths; https://api.sprites.dev/openapi.json openapi 3.1.0. No x-payment-info / x-service-info.
pay: Probe agent payment rails and the purchase pathapipartial ✓Unauthenticated api.machines.dev -> 401 (WWW-Authenticate: Basic), api.sprites.dev -> 401 JSON; no 402, no PAYMENT-REQUIRED, no WWW-Authenticate: Payment/L402. x402./mpp./agents.fly.io do not resolve. No x-payment-info in either OpenAPI. /.well-known/ucp 404. llms-full.txt has 0 hits for x402, MPP, 402, Shared Payment Token, Stripe Projects, USDC. mpp.dev/api/services and the x402 Bazaar: no fly.io/sprites.dev/machines.dev entries. projects.dev page lists provider 'flyio/app' (Stripe Projects listing, not confirmed). Purchase path: dashboard Billing 'Add credit card' (Stripe.js frames) or prepaid credits (min $25 per docs); high-risk unlock needs a card preauthorization under $10.
Create a persistent Sprite (full Linux computer for an agent) and execute commands in it: Same through the Sprites MCP server (OAuth)mcpdone ✓DCR POST /oauth/register 201; browser consent ('Create a restricted token' default, prefix mcp-); token exchange 200. create_sprite 'ad-an inbox-mcp' -> isError "sprite name must start with 'mcp-'"; create_sprite mcp-ad091 -> sprite object; exec cmd=uname -> 'Linux' (with stream framing bytes); get_sprite_info confirms it.
Deploy an app from source/Dockerfile across multiple regions: fly launch a Dockerfile app (nginx) in fracliblocked ✓`fly launch --no-deploy` -> 'Error: failed to determine region: failed to get placements: requested machine count exceeds organization limit' (Machines limit 0/0 on the locked account).
Create a Managed Postgres cluster: fly mpg create basic in fracliblocked ✓'Error: failed creating managed postgres cluster: ... Your account has been flagged as high risk and cannot create Postgres clusters'
Stop, start, restart or delete a Machine: Needs a MachineapiblockedNo Machine could be created: app creation returns 422 'We need your payment information to continue!' (see ).
Scale app by changing Machine count and CPU/RAM size: Needs a MachineapiblockedNo Machine could be created: app creation returns 422 'We need your payment information to continue!' (see ).
Attach a Postgres cluster to an app (sets DATABASE_URL secret): Needs a Postgres clustercliblockedNeeds a Managed Postgres cluster; `fly mpg create` was refused: 'Your account has been flagged as high risk and cannot create Postgres clusters'.
Connect to Postgres via psql or local proxy: Needs a Postgres clustercliblockedNeeds a Managed Postgres cluster; `fly mpg create` was refused: 'Your account has been flagged as high risk and cannot create Postgres clusters'.
Connect to apps privately over WireGuard / 6PN private network: Create a WireGuard peer for the orgclipartial ✓`fly wireguard create personal fra ad091peer` created the peer ('fly wireguard list' shows ad091peer fra fdaa:cf:af13:...); writing the config failed because our target folder did not exist (our mistake), and there was no app to reach over 6PN.
Connect a Sprite to an external service (GitHub, Slack, OpenRouter, any HTTP API) via a Connector without exposing the credential: List and create a ConnectorapiskippedGET /v1/oauth/connections -> 200 {"connections":[]}. Creating one needs a real provider API key (OpenRouter, Upstash...) or an OAuth grant at a third party; our identity has none.
Create and attach a persistent Volume to a Machine: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Snapshot and restore a Volume, or fork it into a new copy: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Extend a Volume's size: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Set and manage app secrets (environment variables): Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Allocate a public IP address / custom domain with TLS certificate for an app: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Route private-only services through Flycast instead of the public internet: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Run UDP/TCP services with custom port handlers: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Configure autostop/autostart of Machines based on traffic: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
View app logs: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
View deployment status and release history: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Deploy and expose a Model Context Protocol (MCP) server on Fly.io: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Run multi-container Machines (sidecar processes in one Machine): Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Run one-off commands/consoles inside a Machine: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Move an app between organizations: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Delete an app: Needs a Fly app / MachinecliblockedEvery Machines-side resource hangs off an app; app creation returned 422 'We need your payment information to continue!' on the risk-flagged account (see ).
Restore Postgres cluster from backup or point-in-time: Needs a Managed Postgres clustercliblockedCluster creation refused: 'flagged as high risk' (see ).
Manage additional databases, schemas and users on a Postgres cluster: Needs a Managed Postgres clustercliblockedCluster creation refused: 'flagged as high risk' (see ).
Enable Postgres extensions (pgvector, PostGIS, etc.): Needs a Managed Postgres clustercliblockedCluster creation refused: 'flagged as high risk' (see ).
View Postgres performance metrics and logs: Needs a Managed Postgres clustercliblockedCluster creation refused: 'flagged as high risk' (see ).
Reserve a stable egress IP for outbound traffic from a Machine: Paid featurenoneplan_gatedCapability map: plan paid; billing page: 'Account Status: Requires a credit card'. Not attempted.
Autoscale Machine count based on a custom metric: Paid featurenoneplan_gatedCapability map: plan paid; billing page: 'Account Status: Requires a credit card'. Not attempted.
Purchase a discounted Machine reservation block (compute credit) for a region: Paid featurenoneplan_gatedCapability map: plan paid; billing page: 'Account Status: Requires a credit card'. Not attempted.
Set up unified billing across linked organizations: Paid featurenoneplan_gatedCapability map: plan paid; billing page: 'Account Status: Requires a credit card'. Not attempted.
Open a support request with the Fly.io engineering support team: Paid featurenoneplan_gatedCapability map: plan paid; billing page: 'Account Status: Requires a credit card'. Not attempted.
cancel: Cancel a plannoneskippedNo plan or card was started; Fly bills pay-as-you-go with no subscription to cancel on a trial account.
delete: Delete the account and its databrowserdone ✓Docs: 'go to Account > Settings > Delete Account (https://fly.io/user/deactivate)'. Page showed a checklist (Organizations/Apps/Certificates/Extensions/Managed Postgres: No issues) -> Delete -> 'Yes, delete it' -> redirected to fly.io. Sign-in afterwards: 'Invalid email or password'; Sprites token -> 401; flyctl whoami -> not authenticated.

Also in Hosting and deploys.