List running jobs
September 29, 2026
Table of contents
The load-balancing picture in one call: for every configured account, its health, its maxJobs limit, the Studio and research jobs running on it right now, and the last usage Google reported for it.
A job is listed from the moment POST /artifacts, POST /artifacts/retry or POST /artifacts/revise or POST /research accepts it until it completes, fails or is cancelled. Each listed job takes one of its account’s maxJobs slots. When all slots are taken, a new job on that account is refused with 429, and a one-shot request without email goes to another account that has a free slot. Poll a single job with GET /jobs/jobid.
This endpoint reads our own records only and never calls Google, so it is cheap to poll and is never cached.
https://api.useapi.net/v1/gemini-notebook/jobs
Request Headers
Authorization: Bearer {API token}
API tokenis required, see Setup useapi.net for details.
Responses
-
{ "accounts": { "[email protected]": { "health": "OK", "maxJobs": 3, "running": 1, "jobs": [ { "jobid": "job:21ade7e0-f2c0-48a1-904d-688096a3ff29-user:[email protected]:gemini_notebook", "type": "video", "started_at": "2026-09-28T04:32:44.630Z", "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:7f923bb5-fb59-4ee6-ade6-9ae559a660fe" } ], "quota": { "windows": [ { "window": "5h", "resetsAt": "2026-09-28T09:25:40.000Z", "usedPercent": 0, "remainingPercent": 100 }, { "window": "weekly", "resetsAt": "2026-10-04T23:25:40.000Z", "usedPercent": 3.14, "remainingPercent": 96.86 } ], "blocked": [], "at": "2026-09-28T04:32:37.575Z" } }, "[email protected]": { "health": "OK", "maxJobs": 2, "running": 0, "jobs": [] } } }With no accounts configured the answer is
{ "accounts": {} }. -
Invalid API token.
{ "error": "useapi.net ⁝ Unauthorized", "code": 401 }
Model
{ // TypeScript, all fields are optional
accounts: {
[email: string]: {
health: string // 'OK', 'verifying' (Google reported it signed out and we are re-checking it),
// the account's error text (re-add it), or 'account deleted'
maxJobs: number | null // concurrent-job limit set via POST /accounts; null for a deleted account
running: number // jobs running on this account now
jobs: Array<{
jobid: string
type: 'audio' | 'video' | 'report' | 'interactive_report' | 'table' | 'quiz' | 'flashcards' | 'infographic' | 'slides' | 'mindmap' | 'research'
started_at: string // ISO 8601, when the job was accepted
artifact?: string // the artifact id, once Google has created it
research?: 'fast' | 'deep' // research jobs (POST /research): the kind of run
}>
quota?: { // last usage Google reported; absent when none is known from the last 5 hours
windows: Array<{
window: '5h' | 'weekly'
resetsAt: string | null // ISO 8601
usedPercent: number
remainingPercent: number
}>
blocked: string[] // Studio actions Google refuses right now, e.g. 'cinematic'
at: string // ISO 8601, when this usage was read
}
}
}
}
An account shows account deleted when it was removed with DELETE /accounts/email while jobs were still running on it.
quota is refreshed every time GET /accounts/email reads live usage and after every job finishes. For live numbers, the reset times and what each Studio action costs, call GET /accounts/email. A one-shot POST /artifacts without email skips an account whose last-known usage shows a window at 100% or the requested action blocked.
Examples
-
curl "https://api.useapi.net/v1/gemini-notebook/jobs" \ -H "Authorization: Bearer …" -
const token = "API token"; const apiUrl = "https://api.useapi.net/v1/gemini-notebook/jobs"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); -
import requests token = "API token" apiUrl = "https://api.useapi.net/v1/gemini-notebook/jobs" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json())