Documentation

Short guides for everyone — no jargon. The API is here to help you join a Roblox game with an account that has just had its captcha solved.

Quickstart

From a fresh ROFarmers account to your first solved captcha in 4 minutes.

  1. Sign up at rofarmers.pro/register. You get one secret token — save it.
  2. In the dashboard, go to Accounts → Add accounts. Paste a list or drop a .txt file.
  3. You're done. Two options from here:
    • Automatic — we watch every account, 24/7, and solve captchas for you.
    • API — when your own scripts need to join a game, call POST /v1/join.

Concepts

Three small ideas the product is built on:

  • Account — a Roblox account you registered with ROFarmers.
  • Group — a folder to sort accounts. Most people make one group per game.
  • Credit — one solved captcha = one credit. Failed solves are free. Credits never expire.

Cookie safety

Your .ROBLOSECURITY cookie is the most sensitive thing you give us. Here is what we do with it:

  • It travels to us over HTTPS.
  • On our side, we encrypt it with a key only our solver can use.
  • We use it only to talk to Roblox — never anything else.
  • We never show it in the dashboard, never send it by email, never write it in a log.
  • Delete an account from the dashboard and its cookie is wiped immediately.

Adding accounts

You can add up to 1,000 accounts at once. Two ways:

Paste a list

From Accounts → Add accounts, paste one account per line. Mix any of these formats:

  • cookie
  • username:password:cookie
  • username:cookie

Upload a .txt file

Drop your file in the import dialog. Same formats. Empty lines are ignored, dead accounts are skipped.

Joining a game

The point of ROFarmers is to give you a Roblox account that has just had its in-game captcha solved, ready to join a game.

Automatic

If you let ROFarmers watch your accounts, captchas are solved the moment they pop up. Your own automation just keeps running.

On demand via the API

Your script calls POST /v1/join with a game id and either an account_id from your dashboard, or a raw username + cookie pair. We do whatever is needed (including solving any captcha) and return what you need to join.

Modes (auto, manual, hybrid)

You choose how much ROFarmers does for you. These three modes are not exclusive — most users mix them.

  • Auto — every account in a group is watched. Best if you just want everything to keep running.
  • Manual — nothing happens until your tooling calls the API. Best if your scripts already know when to act.
  • Hybrid — auto is on for the accounts you flag as "active". The rest stay quiet until you ask via the API.

API overview

One stable v1 namespace. JSON in, JSON out. The endpoint you'll use most is POST /v1/join.

Base URL: https://api.rofarmers.pro

Authentication

Bearer tokens

Generate an API key from Dashboard → API keys and send it as Authorization: Bearer rof_live_•••. Keys can be rotated at any time.

Endpoints

POST/v1/joinJoin a game — handles captcha automatically via the solver queue.
// Step 1 — initiate a join
POST /v1/join
Authorization: Bearer rof_live_•••
Content-Type: application/json
{ "account_id": "acc_...", "place_id": 2753915549 }

// Case A — no captcha required (instant)
→ 200
{
  "status":          "ready",
  "join_script_url": "https://assetgame.roblox.com/game/join.ashx?...",
  "auth_ticket":     "ABCD1234...",
  "roblox_job_id":   "rjob_...",
  "captcha":         { "required": false }
}

// Case B — captcha detected → job queued
→ 202
{
  "status":  "pending",
  "job_id":  "join_XXXXXXXX",
  "message": "Captcha detected — account queued for solving."
}

// Step 2 — poll until ready (poll every 3–5 s)
GET /v1/join/join_XXXXXXXX
Authorization: Bearer rof_live_•••

// While solving:
→ 200 { "status": "pending", "job_id": "join_XXXXXXXX" }

// When done:
→ 200
{
  "status":          "ready",
  "job_id":          "join_XXXXXXXX",
  "join_script_url": "https://assetgame.roblox.com/game/join.ashx?...",
  "auth_ticket":     "ABCD1234...",
  "captcha":         { "required": true, "solved": true }
}

// On failure:
→ 200 { "status": "failed", "job_id": "...", "reason": "captcha_solve_failed" }
Complete example (JavaScript)
const API = "https://api.rofarmers.pro";
const KEY  = "rof_live_•••";

async function join(accountId, placeId) {
  const headers = {
    Authorization: `Bearer ${KEY}`,
    "Content-Type": "application/json",
  };

  // 1) Initiate join
  const init = await fetch(`${API}/v1/join`, {
    method: "POST",
    headers,
    body: JSON.stringify({ account_id: accountId, place_id: placeId }),
  }).then(r => r.json());

  if (init.status === "ready") {
    // No captcha — credentials available immediately
    return init;
  }

  if (init.status !== "pending") {
    throw new Error(`join failed: ${init.error ?? init.status}`);
  }

  // 2) Poll until ready or failed
  const jobId = init.job_id;
  while (true) {
    await new Promise(r => setTimeout(r, 4000)); // wait 4 s

    const poll = await fetch(`${API}/v1/join/${jobId}`, { headers })
      .then(r => r.json());

    if (poll.status === "ready")  return poll;
    if (poll.status === "failed") throw new Error(`solve failed: ${poll.reason}`);
    // "pending" → keep polling
  }
}

// Usage
const result = await join("acc_...", 2753915549);
console.log(result.join_script_url);
console.log(result.auth_ticket);
GET/v1/auth/meYour profile, plan, and USD balance.
GET /v1/auth/me
Authorization: Bearer rof_live_•••

→ 200
{
  "user": {
    "id":               "usr_...",
    "handle":           "noob42",
    "locale":           "en",
    "timezone":         "UTC",
    "plan":             "farmer",
    "balanceUsd":       12.84,
    "planPurchasedAt":  "2025-01-01T00:00:00.000Z",
    "createdAt":        "2025-01-01T00:00:00.000Z"
  }
}
GET/v1/groupsList your groups with account counts.
GET /v1/groups
Authorization: Bearer rof_live_•••

→ 200
{
  "groups": [
    {
      "id":               "grp_...",
      "name":             "Blox Fruits",
      "color":            "#6446ff",
      "total":            42,
      "valid":            40,
      "checkIntervalSec": 300,
      "statusCounts":     { "clear": 38, "queued": 2 },
      "createdAt":        "2025-01-01T00:00:00.000Z"
    }
  ]
}
GET/v1/accountsList accounts, optionally filtered by group.
GET /v1/accounts?group=grp_...&page=1&pageSize=50
Authorization: Bearer rof_live_•••

→ 200
{
  "accounts": [
    {
      "id":             "acc_...",
      "groupId":        "grp_...",
      "username":       "noob42",
      "robloxId":       123456789,
      "avatarUrl":      "https://tr.rbxcdn.com/...",
      "status":         "valid",
      "captchaStatus":  "clear",
      "captchaRequired": false,
      "moderated":      false,
      "createdAt":      "2025-01-01T00:00:00.000Z"
    }
  ],
  "page": 1, "pageSize": 50, "total": 42, "totalPages": 1
}
POST/v1/accounts/importBulk-add up to 1,000 accounts. Returns a job ID; stream progress via SSE.
POST /v1/accounts/import
Authorization: Bearer rof_live_•••
{
  "groupId": "grp_...",
  "lines": [
    "noob42:hunter2:_|WARNING:-DO-NOT-SHARE...",
    "_|WARNING:-DO-NOT-SHARE..."
  ]
}

→ 202 { "jobId": "job_..." }

// Stream progress via SSE:
GET /v1/accounts/import/job_.../stream
// Emits: { type: "progress", done: 3, total: 68, result: {...} }
// Final: { type: "done", valid: 65, invalid: 3 }