Add or update a Muse account

October 12, 2026

Table of contents

  1. Request Headers
  2. Request Body
  3. Responses
  4. Model
  5. Examples
  6. Try It

Add a Muse account with its email and password. The account must have email + password sign-in: if it signs in only with an emailed code, create a password in Meta Accounts Center first. See Setup Muse for what the account needs and what to expect.

Once added, the account is managed by the API: it signs in once, keeps the account signed in, and renews the 30-day Muse session itself, a day before it expires or whenever Muse stops accepting it, using the stored password. You never re-add the account for that. Each sign-in makes Muse email the account a login code, which needs no action.

After the sign-in the API reads the account’s Muse plan and weekly usage (quota). If Meta asks for a security check on the account, the account is saved but paused, and the answer is 596: sign in once at muse.ai in a browser, complete the check, then post the same email and password again.

Posting an account that is already added re-adds it. With the same password and a session Muse still accepts, the API keeps that session and signs in nothing new. added, maxJobs and the session are kept unless you send a new maxJobs or a new password.

This endpoint does two things. To add or re-add an account, post email and password. To change only maxJobs on an account that is already added, post email and maxJobs without password: nothing is sent to Muse then.

Each useapi.net subscription lets you add 3 Muse accounts.

https://api.useapi.net/v1/muse/accounts

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body

Add or re-add an account:

{
  "email": "[email protected]",
  "password": "your Muse password",
  "maxJobs": 2
}
  • email is required, the email of the Muse account.
  • password is required to add or re-add an account, the account’s Muse password.
    Maximum length: 256 characters. A wrong password returns 400. So does an account without a password (one that signs in only with an emailed code): create a password in Meta Accounts Center first.
  • maxJobs is optional, the number of jobs this account may run at the same time.
    Range: 1 to 5. Default: 2 for a new account, the current value on a re-add.

Update an added account:

{
  "email": "[email protected]",
  "maxJobs": 3
}
  • email is required, the email of an added account.
  • maxJobs is required in this mode, the new limit. Range: 1 to 5.
Responses
  • 200 OK — the account was already added and has been re-added or updated.

    {
      "email": "[email protected]",
      "maxJobs": 3,
      "added": "2026-10-12T00:34:19.139Z",
      "updated": "2026-10-12T01:13:03.745Z",
      "sessionExpiresAt": "2026-11-11T00:34:18.820Z",
      "quota": {
        "tier": "HATCH_FREE",
        "percentUsed": 0,
        "resetsAt": "2026-10-19T01:13:03.000Z",
        "quotaStatus": "SUFFICIENT",
        "topupBalance": 0,
        "readAt": "2026-10-12T01:13:03.745Z"
      },
      "health": "OK"
    }
    
    • sessionExpiresAt is when the current Muse session ends. The API renews it before then.
    • quota is the account’s Muse plan and weekly usage, as read now. It is left out when Muse did not answer the read. GET /accounts/email reads it live at any time.
    • An update (email + maxJobs) returns the same record with quota as last read.
  • 201 Created — a new account was added. Same body as 200, without updated.

    {
      "email": "[email protected]",
      "maxJobs": 2,
      "added": "2026-10-12T00:34:19.139Z",
      "sessionExpiresAt": "2026-11-11T00:34:18.820Z",
      "health": "OK"
    }
    
  • 400 Bad Request — Muse refused the sign-in (a wrong email or password, or an account without a password), password and maxJobs are both missing, or a parameter is invalid.

    {
      "error": "Meta account [email protected] has no password: it signs in with an emailed code only. Create a password in Meta Accounts Center (https://accountscenter.meta.com/password_and_security/), then add the account again",
      "code": 400
    }
    
    {
      "error": "Parameter maxJobs (99) is more than 5",
      "code": 400
    }
    
  • 401 Unauthorized

    Invalid API token.

    {
      "error": "useapi.net ⁝ Unauthorized",
      "code": 401
    }
    
  • 402 Payment Required — the subscription has expired, or a new account needs another subscription.

    {
      "error": "useapi.net ⁝ You have 1 subscription, you need 1 additional subscription (2 total) to support 4 accounts for the muse API. Upgrade at https://useapi.net/docs/subscription",
      "code": 402
    }
    
  • 404 Not Found — update mode: no account is added for this email.

    {
      "error": "Account [email protected] not found. Add it with email and password",
      "code": 404
    }
    
  • 503 Service Unavailable — Muse could not be reached or the sign-in could not finish right now. Nothing was saved. Retry shortly.

    {
      "error": "Could not reach Muse (gateway: /api/session returned no vm_id), please retry shortly",
      "code": 503
    }
    
  • 596 Account Error

    Meta asks for a security check on the account. The account is saved with its session but paused. Sign in once at muse.ai in a browser, complete the check, then post the same email and password again: the API then uses the session it already has.

    {
      "error": "Account [email protected]: Meta asks for a security check on account [email protected] (\"This account must complete a security checkpoint on the web\"). Sign in once at https://muse.ai in a browser, complete the check, then add the account again with POST /accounts",
      "code": 596
    }
    
Model

200 and 201 return the same account record. The password and the session are never returned.

{ // TypeScript, all fields are optional
  email: string
  maxJobs: number                 // jobs this account may run at the same time
  added: string                   // ISO 8601, when the account was first added
  updated?: string                // ISO 8601, the last re-add or maxJobs change
  sessionExpiresAt: string        // ISO 8601, when the Muse session expires (30 days, renewed by the API)
  quota?: {                       // the account's Muse plan and weekly usage, as last read
    tier: string | null           // Muse plan, e.g. HATCH_FREE
    percentUsed: number | null    // share of the weekly allowance used, in whole percent
    resetsAt: string | null       // ISO 8601, when the weekly allowance resets
    quotaStatus: string | null    // SUFFICIENT while jobs may run
    topupBalance: number | null
    readAt: string                // ISO 8601, when this was read from Muse
  }
  health: string                  // 'OK', or why the account needs attention (596)

  error?: string                  // errors only
  code?: number                   // errors only
}
Examples
  • curl -X POST "https://api.useapi.net/v1/muse/accounts" \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer …" \
       -d '{
         "email": "[email protected]",
         "password": "…",
         "maxJobs": 2
       }'
    
  • const token = "API token";
    const apiUrl = "https://api.useapi.net/v1/muse/accounts";
    const response = await fetch(apiUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${token}`,
      },
      body: JSON.stringify({ email: "Muse account email", password: "Muse account password", maxJobs: 2 })
    });
    const result = await response.json();
    console.log("response", {response, result});
    
  • import requests
    token = "API token"
    apiUrl = "https://api.useapi.net/v1/muse/accounts"
    headers = {
        "Content-Type": "application/json",
        "Authorization" : f"Bearer {token}"
    }
    data = {
        "email": "Muse account email",
        "password": "Muse account password",
        "maxJobs": 2
    }
    response = requests.post(apiUrl, headers=headers, json=data)
    print(response, response.json())
    
Try It