Skip to content
FreeFlow

Docs

How FreeFlow works

FreeFlow gives you three unlimited models and $50 of credit every week for ten more. You use them in the FreeFlow Harness, a coding agent for your desktop, signed in with an API key from your dashboard.

Getting started

  1. Create an account with your email.
  2. Open API keys in the dashboard and create a key.
  3. Download the Harness, paste the key when it asks, and open a project folder.

Using the Harness

Describe what you want changed, and the agent works in the folder you opened. New tasks start on Ling 3.1 Flash, which is unlimited. Switch models from the picker at the top of the chat.

What it can do

  • List, read and search files in your project. These run without asking.
  • Create and edit files. You see a diff first and choose Allow or Deny.
  • Run commands like tests and builds, in your project folder. You approve each one first.

Choose how much it asks in the Harness settings: before every edit and command (the default), only before commands, or never. The agent can't open files outside the folder you chose.

Project instructions

Put conventions in an AGENTS.md file at the root of your project (build commands, code style, things to avoid). The agent reads it with every message. If there's no AGENTS.md, it reads FREEFLOW.md, CLAUDE.md or .cursorrules instead. It also sees your git branch, uncommitted files and recent commits. The chips under the message box show what it picked up.

Checkpoints and undo

Before the agent changes a file, the Harness saves a copy. Each message ends with a checkpoint card listing the files it changed: Undo there reverses that message (and anything after it), and Undo changes at the top reverses the whole task. Files it created are removed. If you edited a file yourself afterwards, undo leaves it alone and tells you. Changes made by commands it ran aren't tracked, so keep git handy for those.

@-mentions

Type @ in the message box to pick files. Their contents go along with your message, so the agent starts with the right context.

Plan mode

Choose Plan only in the approval menu and the agent can read and search but not edit or run anything. It replies with a numbered plan. Click Carry out this plan to switch back to your usual mode and have it build.

Cost and reliability

Each task shows the tokens it has used and what they cost from your weekly credit (unlimited models show Free). If the connection drops or a provider is busy, the Harness retries on its own, and it updates itself when a new version is out.

API keys

Keys start with ff-. You see the full key once, when you create it, so paste it straight into the Harness or a password manager. You can have up to 10 active keys: one per device makes it easy to revoke just one if a laptop goes missing.

Anyone with your key can spend your credit. If a key leaks, revoke it in the dashboard; it stops working at once.

Weekly credit

Every account gets $50 of credit each week. It refills every Monday at 00:00 UTC, and unused credit doesn't carry over. Each request on a credit model costs its input and output tokens at the rates on the models page.

When the credit runs out, those models return weekly_allowance_used until the next refill. The unlimited models (ling-3.1-flash, muse-spark-1.3, glm-5.3-flash) never count against it.

API reference

The API follows OpenAI's request and error formats. Send your key as a Bearer token. Base URL:

Base URL
https://freeflow.surf/v1

GET/v1/models

Lists every model with its id, provider, credit tier, price and whether it's available.

Request
curl https://freeflow.surf/v1/models \
  -H "Authorization: Bearer ff-your-key"

GET/v1/account

Shows how much of this week's credit is left and when it refills.

Response
{
  "object": "account",
  "email": "you@example.com",
  "allowance": {
    "limit_usd": 50,
    "used_usd": 12.4,
    "remaining_usd": 37.6,
    "resets_at": "2026-10-12T00:00:00.000Z"
  },
  "unlimited_models": ["ling-3.1-flash", "muse-spark-1.3", "glm-5.3-flash"]
}

POST/v1/chat/completions

Checks your key, the model and your credit. Model requests run only in the FreeFlow Harness; requests from anywhere else get harness_required with a link to the download page.

Response when called directly
HTTP/1.1 403 Forbidden

{
  "error": {
    "message": "FreeFlow models run through the FreeFlow Harness. Download it at https://freeflow.surf/download and sign in with this API key.",
    "type": "permission_error",
    "code": "harness_required",
    "param": null,
    "download_url": "https://freeflow.surf/download"
  }
}

Errors

Errors use the shape { "error": { "message", "type", "code", "param" } }. Check code in your logic; the message is written for people.

StatusCodeMeaning
400invalid_jsonThe body isn't a JSON object.
400missing_modelNo model in the request.
400missing_messagesmessages is missing or empty.
400upstream_rejectedThe model provider refused the request. The message says why.
401missing_api_keyNo Authorization header.
401invalid_api_keyThe key is wrong or was revoked.
403harness_requiredModel requests must come from the FreeFlow Harness.
404model_not_foundThat model id isn't on FreeFlow.
404unknown_endpointThe path isn't a FreeFlow endpoint.
429weekly_allowance_usedThis week's credit is spent. Includes resets_at.
429upstream_rate_limitedThe model provider is busy. Wait a moment and retry.
502upstream_unavailableThe model provider had a problem. Retry shortly.
503model_unavailableThat model isn't connected yet. Pick another.

Stuck? Email support@freeflow.surf.