Answer an approval

October 16, 2026

Table of contents

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

In the ask approval mode, the agent stops before it spends credits and asks for permission, showing what it wants to make and what it costs. The chat’s status is then waiting_approval, the stream sends an approval event, and GET /agent/chats/chatId shows pendingApproval:

{ "turn": 1, "cost": 10, "images": 0, "videos": 1, "total": 1 }

cost is in Flow credits. Answer with this request. The answer is a new turn, the same as a message from you: the agent generates (or not) and replies, and you follow it on the stream like any other turn.

  • approve lets the agent go ahead this time.
  • always lets it go ahead, and switches the project to the auto approval mode, so the agent no longer asks in any chat of the project. Switch back with PUT /agent/settings approval: "ask".
  • reject declines. The agent replies without generating.

Sending a new message with POST /agent/chats/chatId/messages instead also moves on without generating.

The request answers 202 as soon as Google has accepted the turn. That usually takes a few seconds to about 40 seconds and can take up to about 100 seconds, so set your HTTP client’s timeout to about 150 seconds. The turn then keeps running on Google’s side whether or not you are connected. Follow it live with GET /agent/chats/chatId/stream, read it with GET /agent/chats/chatId, or get it posted to your replyUrl when it ends.

A 504 means Google has not confirmed the turn yet, and it may still start. Read the chat with GET /agent/chats/chatId before you send it again.

Each turn uses one captcha, solved by the API with your captcha providers or the free captcha credits of your first account.

https://api.useapi.net/v1/google-flow/agent/chats/chatId/approval

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body
{
  "decision": "approve"
}
  • decision is required.
    Supported values: approve, always, reject.
  • replyUrl is optional, a public https URL that receives one POST with the turn’s result when it ends. When omitted, the replyUrl of your useapi.net account is used, if you set one. The body is described on POST /agent/chats.
  • replyRef is optional, your own reference sent back in the callback body.
    Maximum length: 1024 characters.
  • captchaToken, captchaRetry, captchaOrder are optional, the same captcha parameters as every Flow generation request. See Captcha Parameters.
Responses
  • 202 Accepted

    Google accepted the answer, and the agent is working on the new turn.

    {
      "chatId": "c-u12345-email:[email protected]:f166200a-ea22-461a-bc68-47ff6d3ee500-chat:2a0f1973-d554-4fbc-aa6b-0c372edf182e-bot:google-flow",
      "email": "[email protected]",
      "turn": 2,
      "status": "running"
    }
    
  • 400 Bad Request

    decision is missing or not one of the supported values, or the path value is not a chatId.

    {
      "error": "Parameter decision is required",
      "code": 400
    }
    
  • 401 Unauthorized

    Invalid API token.

    {
      "error": "useapi.net ⁝ Unauthorized",
      "code": 401
    }
    
  • 403 Forbidden

    The chatId belongs to another useapi.net user.

    {
      "error": "This chat belongs to another user",
      "code": 403
    }
    
  • 404 Not Found

    The chat was deleted, or its account is not added.

    {
      "error": "Chat not found: it was deleted or never existed",
      "code": 404
    }
    
  • 409 Conflict

    Nothing in this chat is waiting for approval, or a turn is still running.

    {
      "error": "Nothing in this chat is waiting for approval",
      "code": 409
    }
    
  • 429 Too Many Requests

    429 has two causes. When the API picked the account itself (no email), retry or pass another account’s email.

    The account already runs 3 agent turns, the most the API runs at once per account. Wait for one to finish, or use another account. The answer carries a Retry-After header (seconds) and a retryAfter time in the body.

    {
      "error": "Account [email protected] already runs 3 agent turns (our limit per account). Wait for one to finish or use another account",
      "code": 429,
      "retryAfter": "2026-10-16T22:26:47.819Z"
    }
    

    The account reached Google’s daily limit on agent messages. Google does not publish the limit. The message Google refused answers with reason AGENT_QUOTA, and after that the API answers at once until midnight UTC, with Retry-After and retryAfter set to that time. Use another account until then.

    {
      "error": "Google's daily Flow agent limit is reached for [email protected]. Try again after 2026-10-17T00:00:00.000Z or use another account",
      "code": 429,
      "retryAfter": "2026-10-17T00:00:00.000Z"
    }
    
  • 502 Bad Gateway

    Google answered with an error or without a readable reply (reason GOOGLE_ERROR or UNREADABLE_ANSWER). The answer may have been taken. Read the chat with GET /agent/chats/chatId before you send it again.

  • 503 Service Unavailable

    Nothing ran and nothing was charged. Google refused every captcha for the turn (reason CAPTCHA_FAILED), so send the answer again. When error starts with Captcha service failed:, the problem is your captcha provider: check its key and balance. When error says Google Flow is not reachable, retry shortly.

    {
      "error": "Google refused every captcha token for this turn. Nothing ran and nothing was charged. Retry",
      "code": 503,
      "reason": "CAPTCHA_FAILED",
      "chatId": "c-u12345-email:[email protected]:f166200a-ea22-461a-bc68-47ff6d3ee500-chat:2a0f1973-d554-4fbc-aa6b-0c372edf182e-bot:google-flow"
    }
    
    {
      "error": "Google Flow is not reachable right now and could not read the chat. Retry",
      "code": 503
    }
    
  • 504 Gateway Timeout

    Google has not confirmed the answer yet, and it may still be taken. Read the chat with GET /agent/chats/chatId before you send it again.

  • 596 Session Error

    The account’s Google session is no longer valid. Delete the account with DELETE /accounts/email and add it again by following Setup Google Flow.

Model
{ // TypeScript, all fields are optional
  chatId: string
  email: string         // the account the chat runs on
  turn: number          // the new turn's number
  status: 'running' | 'completed' | 'waiting_approval' | 'failed'  // almost always running
  error?: string        // errors only
  code?: number         // errors only
  reason?: string       // CAPTCHA_FAILED | UNREADABLE_ANSWER | GOOGLE_ERROR | AGENT_QUOTA, on errors after the request reached Google
  retryAfter?: string   // 429 only
}
Examples
  • CHATID="c-u12345-email:[email protected]:f166200a-...-chat:2a0f1973-...-bot:google-flow"
    curl -X POST "https://api.useapi.net/v1/google-flow/agent/chats/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$CHATID")/approval" \
         --max-time 150 \
         -H "Content-Type: application/json" \
         -H "Authorization: Bearer YOUR_API_TOKEN" \
         -d '{ "decision": "approve" }'
    
  • const token = 'YOUR_API_TOKEN'
    const chatId = 'chatId from POST /agent/chats'
    const response = await fetch(`https://api.useapi.net/v1/google-flow/agent/chats/${encodeURIComponent(chatId)}/approval`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`
      },
      body: JSON.stringify({ decision: 'approve' }),
      signal: AbortSignal.timeout(150_000)
    })
    console.log(response.status, await response.json())
    
  • import requests
    from urllib.parse import quote
    token = 'YOUR_API_TOKEN'
    chatId = 'chatId from POST /agent/chats'
    r = requests.post(
        f'https://api.useapi.net/v1/google-flow/agent/chats/{quote(chatId, safe="")}/approval',
        headers={'Authorization': f'Bearer {token}'},
        json={'decision': 'approve'},
        timeout=150,
    )
    print(r.status_code, r.json())
    
Try It

The stream’s Try It also shows Approve, Always and Reject buttons on each approval event.