=== useapi.net — universal note === Generated: 2026-09-30 00:05 UTC Authentication (applies to every useapi.net API). Header: Authorization: Bearer user:- Use the COMPLETE token, including the `user:` prefix and the alphanumeric suffix. Do not truncate. Do not URL-encode. A single token authorizes every API under the user's subscription. Service-specific patterns. Identifier names (jobid / taskId / musicId / etc.), job lifecycle, response shapes, webhook semantics, and synchronous-vs-async behavior vary PER API. Use ONLY the service-specific documentation below to determine the correct request body, response shape, polling endpoint, and status values for THIS API. Do not assume conventions from another useapi.net API carry over. For cross-service context (e.g. which APIs expose the same underlying model, billing tiers, model availability matrix), see https://useapi.net/llms.txt === END universal note === === URL: https://useapi.net/docs/start-here/setup-gemini-notebook === Document URL: https://useapi.net/docs/start-here/setup-gemini-notebook --- layout: default title: Setup Gemini Notebook description: "How to connect a Google account to the useapi.net Gemini Notebook API — automated browser setup or a manual cookie paste." parent: Start Here nav_order: 209 permalink: /docs/start-here/setup-gemini-notebook --- # Setup Gemini Notebook September 29, 2026 ## Table of contents Approximately 5 minutes to complete setup steps. --- > This is the setup guide for [Gemini Notebook API](/docs/api-gemini-notebook-v1). A [Google](https://accounts.google.com) account and a [useapi.net subscription](/docs/subscription) are required for the API to work. Gemini Notebook (formerly NotebookLM) works on the free Google plan, and paid Google AI plans raise its usage limits. ### Automated setup (recommended) Use our guided browser setup to connect your account automatically — no DevTools or cookie copying needed. Enter your API token, sign in with Google in the remote browser, and your account is verified and added. [Open automated setup](/assets/setup-browser/gemini-notebook.html) Prefer manual setup? Continue with the steps below. --- ### Use a dedicated Gmail account ⚠️ **Use a dedicated Gmail account for this API — do NOT use your personal Gmail account.** When creating a new account: 1. Enable [2-Step Verification](https://support.google.com/accounts/answer/185839) with [Microsoft Authenticator](https://www.microsoft.com/en-us/security/mobile-authenticator-app), and save the backup codes. Avoid Google Authenticator — it backs its codes up to the Google account it is signed into, which would link this dedicated account to your personal one. 2. Keep your sign-ins consistent. If you use a VPN, pick one region and stay with it rather than switching locations — an account that appears from different places in a short time is what Google treats as suspicious. The automated setup above signs in from a US browser, so it needs no VPN on your side. ### If Google asks for a phone number Occasionally Google shows a "Verify it's you" page and asks for a phone number to text a code to, even on an account that never had one. Any number that can receive SMS works. It does not have to be one already on the account. If you'd rather not use your personal number, get an inexpensive prepaid line just for this — for example a [Tello](https://tello.com) eSIM on its cheapest plan with texts (about $5/month, activated online). Install it on any phone, receive the code there, and keep the line active so you can pass future checks. Avoid online SMS-rental and "free virtual number" services. Google rejects most of them, and a rejected number can make the lock harder to clear. ### Manual setup ⚠️ **Do NOT use Google Chrome.** Google's integration with Chrome interferes with cookie extraction. Use [Brave](https://brave.com/) or [Ungoogled Chromium](https://github.com/ungoogled-software/ungoogled-chromium) instead. You copy two sets of cookies from Developer Tools and paste both into the same `cookies` field: the `https://notebook.google.com` set and the `https://accounts.google.com` set. The account is refused with only one of them. #### Start the browser without device-bound sessions Chromium browsers on Windows and Mac now bind a Google sign-in to the device (Google's Device Bound Session Credentials). Cookies copied from a bound session are refused anywhere else, and the API answers `These cookies are not signed in to Gemini Notebook`. The browser's own flags page does not turn this off (Google overrides it), but a command-line switch does. The [automated setup](#automated-setup-recommended) is not affected. 1. Quit Brave completely, including any instance left in the system tray (check Task Manager for `brave.exe`, on a Mac use `Cmd+Q`). A running Brave ignores the switch. 2. Start it from the Run box (`Win+R`) with this command, which opens a private window with no cookies and without device-bound sessions: ``` "C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe" --incognito --disable-features=EnableBoundSessionCredentials,DeviceBoundSessions ``` On a Mac, run the same switches from Terminal: ``` open -na "Brave Browser" --args --incognito --disable-features=EnableBoundSessionCredentials,DeviceBoundSessions ``` Keep this window open for the steps below. #### Sign in to Gemini Notebook Navigate to [https://notebook.google.com](https://notebook.google.com) and sign in with your dedicated Gmail account `1`. ![](/assets/images/gemini-notebook-setup-2.png) Enter your password, then the 2-Step Verification code `1`. Google names Google Authenticator here whichever authenticator app holds the code. ⚠️ **You MUST check `Don't ask again on this device`** `2` — skipping it will break the API session. ![](/assets/images/gemini-notebook-setup-3.png) Once signed in you see Gemini Notebook with your plan's badge `1` (no badge on a free account). ![](/assets/images/gemini-notebook-setup-4.png) #### Copy the `https://notebook.google.com` cookies 1. Open Developer Tools: right-click anywhere on the page and select `Inspect` (or press `F12`), then open the `Application` tab `1` 2. Under `Cookies`, select `https://notebook.google.com` `2` 3. Click in the cookie table and select all cookies (`Ctrl+A`) `3` 4. Copy them (`Ctrl+C`, or right-click and `Copy`) `4`, and paste them into the `cookies` field below. ![](/assets/images/gemini-notebook-setup-5.png) #### Copy the `https://accounts.google.com` cookies This second set holds `LSID`. Without it the account is refused with `Missing cookies: LSID`. It is in the same Developer Tools, one entry down. 1. Stay on the `Application` tab `1` 2. Under `Cookies`, select `https://accounts.google.com` `2` 3. Click in the cookie table and select all cookies (`Ctrl+A`) `3` 4. Copy them (`Ctrl+C`, or right-click and `Copy`) `4`, and paste them into the same `cookies` field below, under the first set. ![](/assets/images/gemini-notebook-setup-6.png) Before you paste, look for `__Secure-1PSIDRTS` in what you copied. If it is there, the session is device-bound and will be refused: close every Brave window and start again with the command above. Paste everything you copied, exactly as it is. The form below sends it to [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts), which checks the cookies with Google before the account is added.
A successful response is `201` for a new account or `200` for an update, with the account email, its Google plan (`tier`) and its current usage (`quota`). ### If Google signs the account out If Google ends the session of a connected account, the API detects it on the next request, re-checks it once, and then emails you right away with a link to re-add the account. Until you re-add it, the account is paused and shows the re-add message in [GET /accounts](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts). Re-adding through the [automated setup](/assets/setup-browser/gemini-notebook.html) takes about a minute. ### Usage limits Gemini Notebook meters usage per Google account in two windows — every 5 hours and weekly — as a share of the plan's compute budget. Each Audio Overview, video, quiz or report uses part of it, and Google refuses new generations once the budget runs out until the window resets. Paid Google AI plans raise the budget. The API reports the live usage of each account at [GET /accounts/`email`](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email). === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-accounts-email === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-accounts-email --- layout: default title: DELETE accounts/`email` description: "Remove a Google account from the useapi.net Gemini Notebook API via DELETE accounts/email. Its notebooks, sources and artifacts stay on the Google account." parent: Gemini Notebook API v1 nav_order: 140 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-accounts-email --- ## Delete an account September 29, 2026 --- Remove a connected Google account from your useapi.net account. The stored cookies are deleted and the account slot is freed. Nothing is deleted on Google's side. The account's notebooks, sources and artifacts stay in [Gemini Notebook](https://notebook.google.com), and you can connect the account again at any time with [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts). Notebook, source and artifact ids of a removed account stop working until it is connected again. > **https://api.useapi.net/v1/gemini-notebook/accounts/`email`** - `email` is the email of a connected account, URL-encoded in the path. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** — the account was removed. The response body is empty. **400** **400 Bad Request** — the `email` in the path is not a valid email, or no account is connected. ```json { "error": "Path parameter email (not-an-email) not a valid email", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **404** **404 Not Found** — no account is connected for this `email`. ```json { "error": "Account user@example.com not found", "code": 404 } ``` ##### Examples **Curl** ``` bash curl -X DELETE "https://api.useapi.net/v1/gemini-notebook/accounts/user%40example.com" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email = "Previously configured account email"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/accounts/${encodeURIComponent(email)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests from urllib.parse import quote token = "API token" email = "Previously configured account email" apiUrl = f"https://api.useapi.net/v1/gemini-notebook/accounts/{quote(email, safe='')}" headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-artifacts-artifact === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-artifacts-artifact --- layout: default title: DELETE artifacts/`artifact` description: "Delete a Studio artifact from its notebook via DELETE artifacts/artifact in the useapi.net Gemini Notebook API — returns 204, and the artifact's download links stop working." parent: Gemini Notebook API v1 nav_order: 630 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-artifacts-artifact --- ## Delete an artifact September 29, 2026 --- Delete a Studio artifact from its notebook, at Google. The notebook and its sources stay. Deleted artifacts cannot be recovered. Files are always streamed from the artifact in the notebook and never stored by us, so once an artifact is deleted its [GET /artifacts/download](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download) links answer `404`. Download anything you want to keep first. A job still running for a deleted artifact fails with error code `not_found` on its next check. To delete a whole notebook with everything in it, use [DELETE /notebooks/`notebook`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-notebooks-notebook). > **https://api.useapi.net/v1/gemini-notebook/artifacts/`artifact`** - `artifact` is URL-encoded in the path (it contains `:` and `@`). Get it from [GET /artifacts](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts) or from the `artifact` field of a [job](/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid). The id names the account and the notebook, so no `email` parameter is needed. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The artifact was deleted. The response has no body. **400** **400 Bad Request** The path value is not an artifact id. ```json { "error": "Path parameter artifact (…) is not a valid artifact id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The artifact id was issued to a different API token. ```json { "error": "user:12345-user@example.com-artifact:d02c903b-…:07b94418-… does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The account the artifact lives on is no longer configured, or Google reports the artifact or its notebook as not found. ```json { "error": "Account user@example.com of user:12345-user@example.com-artifact:d02c903b-…:07b94418-… is not configured", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` ##### Model A successful delete returns `204` with no body. Errors return: ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash ARTIFACT="user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c" curl -X DELETE "https://api.useapi.net/v1/gemini-notebook/artifacts/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$ARTIFACT")" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const artifact = "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/artifacts/${encodeURIComponent(artifact)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests, urllib.parse token = "API token" artifact = "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c" apiUrl = "https://api.useapi.net/v1/gemini-notebook/artifacts/" + urllib.parse.quote(artifact, safe="") headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-chat === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-chat --- layout: default title: DELETE chat description: "Delete a notebook's chat history via DELETE chat in the useapi.net Gemini Notebook API — the latest or a named conversation, so the next question starts fresh." parent: Gemini Notebook API v1 nav_order: 404 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-chat --- ## Delete chat history September 29, 2026 --- Delete a chat conversation, the "Delete history" action of the Gemini Notebook web app. The next [POST /chat](/docs/api-gemini-notebook-v1/post-gemini-notebook-chat) question without a `conversation` starts a new conversation. Notes saved from the chat and the notebook's sources are not touched. Without `conversation` the notebook's latest conversation is deleted, and the call answers `404` when the notebook has none. > **https://api.useapi.net/v1/gemini-notebook/chat?notebook=`notebook`&conversation=`conversation`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `notebook` is **required**, the notebook id returned by [POST /notebooks](/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks) or [GET /notebooks](/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks). URL-encode it (it contains `:` and `@`). The id names its account, so no `email` is needed. - `conversation` is optional, a conversation id from [POST /chat](/docs/api-gemini-notebook-v1/post-gemini-notebook-chat). Default: the notebook's latest conversation. ##### Responses **204** **204 No Content** The conversation was deleted. No body. **400** **400 Bad Request** ```json { "error": "Parameter notebook is required", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The id was issued to a different API token. ```json { "error": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** Without `conversation`, the notebook has no conversation to delete. Also returned when the notebook was deleted or its account is no longer configured. ```json { "error": "The notebook has no conversation to delete", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` **503** **503 Service Unavailable** Google is temporarily unavailable or is challenging our network. Retry in a few minutes. A `502` means Google answered with an unexpected error. ```json { "error": "Google is temporarily unavailable (J7Gthc grpc 14), please retry", "code": 503 } ``` ##### Model A successful delete returns `204` with no body. Errors return: ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash curl -X DELETE -G "https://api.useapi.net/v1/gemini-notebook/chat" \ -H "Authorization: Bearer …" \ --data-urlencode "notebook=user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" ``` **JavaScript** ``` javascript const token = "API token"; const notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/chat?notebook=${encodeURIComponent(notebook)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests token = "API token" notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" apiUrl = "https://api.useapi.net/v1/gemini-notebook/chat" headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers, params={"notebook": notebook, "conversation": "fd20f12d-611f-4008-9e61-94e02af005a9"}) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid --- layout: default title: DELETE jobs/`jobid` description: "Cancel a running Studio or research job and free its maxJobs slot via DELETE jobs/jobid in the useapi.net Gemini Notebook API — research runs are stopped at Google too." parent: Gemini Notebook API v1 nav_order: 720 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid --- ## Cancel a job September 29, 2026 --- Stop tracking a running job and free the `maxJobs` slot it holds on its account (see [GET /jobs](/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs)). The job record turns `failed` with error code `cancelled`, and no `replyUrl` webhook is sent for it. Cancelling a Studio artifact job does not stop Google. Once Google has started an artifact it keeps generating it, the quota it spends is spent, and the finished artifact shows up in the notebook: find it with [GET /artifacts](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts) or read it by the job's `artifact` id with [GET /artifacts/`artifact`](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact). To remove it, [delete the artifact](/docs/api-gemini-notebook-v1/delete-gemini-notebook-artifacts-artifact) once it exists. A research job from [POST /research](/docs/api-gemini-notebook-v1/post-gemini-notebook-research) is different: the run is stopped at Google too, and its record's message is `Cancelled: the research run was stopped.` If Google could not be told to stop it, the job is still cancelled and its slot freed, and the message reads `Cancelled: the slot is freed, but Google could not be told to stop the research run.` A cancelled research job cannot be imported with [POST /research/import](/docs/api-gemini-notebook-v1/post-gemini-notebook-research-import). A one-shot job (a [POST /artifacts](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts) with `urls` / `text` instead of `notebook`) cancelled before its artifact was created also deletes the notebook that was made for it, since that notebook holds nothing you asked for. Cancelling a job that already completed or failed changes nothing and also answers `204`. > **https://api.useapi.net/v1/gemini-notebook/jobs/`jobid`** - `jobid` is URL-encoded in the path (it contains `:` and `@`). ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The job is cancelled (or was already finished). The response has no body. [GET /jobs/`jobid`](/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid) now shows, for a Studio artifact job: ```json { "jobid": "job:09112e70-e1f3-422d-a1af-955de87508e4-user:12345-user@example.com-bot:gemini_notebook", "status": "failed", "completed_at": "2026-09-28T03:23:42.561Z", "error": { "code": "cancelled", "message": "Cancelled: the slot is freed. Google may still finish the artifact in the notebook." }, "...": "..." } ``` For a research job: ```json { "jobid": "job:0645b31d-ea2b-4c26-8754-a3b7876a21d0-user:12345-user@example.com-bot:gemini_notebook", "type": "research", "status": "failed", "completed_at": "2026-09-29T04:15:42.251Z", "error": { "code": "cancelled", "message": "Cancelled: the research run was stopped." }, "...": "..." } ``` **400** **400 Bad Request** The path value is not a Gemini Notebook jobid. ```json { "error": "Path parameter jobid (…) is not a valid jobid", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** ```json { "error": "jobid does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** No such job, or its record is older than 30 days. ```json { "error": "Job job:09112e70-…-bot:gemini_notebook not found", "code": 404 } ``` ##### Model A successful cancel returns `204` with no body. The cancelled record is the [job record](/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid#model) with `status: 'failed'` and `error.code: 'cancelled'`. Errors return: ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash JOBID="job:09112e70-e1f3-422d-a1af-955de87508e4-user:12345-user@example.com-bot:gemini_notebook" curl -X DELETE "https://api.useapi.net/v1/gemini-notebook/jobs/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$JOBID")" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const jobid = "job:09112e70-e1f3-422d-a1af-955de87508e4-user:12345-user@example.com-bot:gemini_notebook"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/jobs/${encodeURIComponent(jobid)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests, urllib.parse token = "API token" jobid = "job:09112e70-e1f3-422d-a1af-955de87508e4-user:12345-user@example.com-bot:gemini_notebook" apiUrl = "https://api.useapi.net/v1/gemini-notebook/jobs/" + urllib.parse.quote(jobid, safe="") headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-labels-label === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-labels-label --- layout: default title: DELETE labels/`label` description: "Delete a source label via DELETE labels/label in the useapi.net Gemini Notebook API — the label goes, and its sources stay in the notebook without it." parent: Gemini Notebook API v1 nav_order: 496 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-labels-label --- ## Delete a source label September 29, 2026 --- Remove a label from its notebook. Its sources are not deleted: they stay in the notebook, without this label. To remove a source itself use [DELETE /sources/`source`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-sources-source). > **https://api.useapi.net/v1/gemini-notebook/labels/`label`** - `label` is **required**, the label id from [GET /labels](/docs/api-gemini-notebook-v1/get-gemini-notebook-labels) or [POST /labels](/docs/api-gemini-notebook-v1/post-gemini-notebook-labels), URL-encoded in the path (it contains `:` and `@`). The id names its account and notebook, so no `email` or `notebook` is needed. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The label was deleted. No body. **400** **400 Bad Request** The path does not hold a valid label id. ```json { "error": "Path parameter label (user%3A12345-user%40example.com-notebook%3Ad02c903b-17f8-4241-a263-2be9e7359d55) is not a valid label id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The id was issued to a different API token. ```json { "error": "user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:5973ba2b-845e-41b5-97b2-ef855d5746ad does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The label is no longer in the notebook, the notebook was deleted, or its account is no longer configured. ```json { "error": "Label user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:5973ba2b-845e-41b5-97b2-ef855d5746ad not found", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` **503** **503 Service Unavailable** Google is temporarily unavailable or is challenging our network. Retry in a few minutes. A `502` means Google answered with an unexpected error. ```json { "error": "Google is temporarily unavailable (GyzE7e grpc 14), please retry", "code": 503 } ``` ##### Model A successful delete returns `204` with no body. Errors return: ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash LABEL="user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:5973ba2b-845e-41b5-97b2-ef855d5746ad" curl -X DELETE "https://api.useapi.net/v1/gemini-notebook/labels/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$LABEL")" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const label = "user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:5973ba2b-845e-41b5-97b2-ef855d5746ad"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/labels/${encodeURIComponent(label)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests, urllib.parse token = "API token" label = "user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:5973ba2b-845e-41b5-97b2-ef855d5746ad" apiUrl = "https://api.useapi.net/v1/gemini-notebook/labels/" + urllib.parse.quote(label, safe="") headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-notebooks-notebook === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-notebooks-notebook --- layout: default title: DELETE notebooks/`notebook` description: "Delete a notebook, together with its sources and Studio artifacts, via DELETE notebooks/notebook in the useapi.net Gemini Notebook API v1. Returns 204." parent: Gemini Notebook API v1 nav_order: 240 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-notebooks-notebook --- ## Delete a notebook September 29, 2026 --- Delete a notebook from its Google account. The notebook's sources and Studio artifacts go with it, and it cannot be recovered. Download any media you want to keep first with [GET /artifacts/download](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download). To remove a single source instead, use [DELETE /sources/`source`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-sources-source). > **https://api.useapi.net/v1/gemini-notebook/notebooks/`notebook`** - `notebook` is **required**, the notebook id returned by [POST /notebooks](/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks) or [GET /notebooks](/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks). It contains `:` and `@`, so URL-encode it in the path (`encodeURIComponent` in JavaScript). ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The notebook was deleted. No body. **400** **400 Bad Request** ```json { "error": "Path parameter notebook (abc) is not a valid notebook id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The notebook id was issued to a different API token. ```json { "error": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The notebook's account is no longer configured, or Google no longer has the notebook. ```json { "error": "Account user@example.com of user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 is not configured", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` ##### Model A successful delete returns `204 No Content` with no body. Error responses carry a JSON body: ```typescript { // TypeScript, all fields are optional error: string code: number // the HTTP status } ``` ##### Examples **Curl** ``` bash curl -X DELETE "https://api.useapi.net/v1/gemini-notebook/notebooks/user%3A12345-user%40example.com-notebook%3Ad02c903b-17f8-4241-a263-2be9e7359d55" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/notebooks/${encodeURIComponent(notebook)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests, urllib.parse token = "API token" notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" apiUrl = "https://api.useapi.net/v1/gemini-notebook/notebooks/" + urllib.parse.quote(notebook, safe="") headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-notes-note === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-notes-note --- layout: default title: DELETE notes/`note` description: "Delete a note from its notebook via DELETE notes/note in the useapi.net Gemini Notebook API — sources made from the note with POST notes/source are kept." parent: Gemini Notebook API v1 nav_order: 450 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-notes-note --- ## Delete a note September 29, 2026 --- Remove a note from its notebook on Google. A source made from the note with [POST /notes/source](/docs/api-gemini-notebook-v1/post-gemini-notebook-notes-source) is a separate copy and stays in the notebook. Remove it with [DELETE /sources/`source`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-sources-source) if you no longer need it. > **https://api.useapi.net/v1/gemini-notebook/notes/`note`** - `note` is **required**, the note id, URL-encoded in the path (it contains `:` and `@`). Note ids are returned by [POST /notes](/docs/api-gemini-notebook-v1/post-gemini-notebook-notes) and [GET /notes](/docs/api-gemini-notebook-v1/get-gemini-notebook-notes). The id names its account, so no `email` is needed. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The note was deleted. No body. **400** **400 Bad Request** The path does not hold a valid note id, for example it holds a source id. ```json { "error": "Path parameter note (user%3A12345-user%40example.com-source%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3A10f43c6b-a0a6-46a8-b330-06a5718dffb2) is not a valid note id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The note id was issued to a different API token. ```json { "error": "user:12345-user@example.com-note:d02c903b-17f8-4241-a263-2be9e7359d55:e5514ee8-22e5-414d-aa67-86e8476ece09 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The account named in the note id is no longer configured, or Google reports the notebook as not found. ```json { "error": "Account user@example.com of user:12345-user@example.com-note:d02c903b-17f8-4241-a263-2be9e7359d55:e5514ee8-22e5-414d-aa67-86e8476ece09 is not configured", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` **503** **503 Service Unavailable** Google is temporarily unavailable or is challenging our network. Retry in a few minutes. A `502` means Google answered with an unexpected error. ```json { "error": "Google is temporarily unavailable (AH0mwd grpc 14), please retry", "code": 503 } ``` ##### Model A successful delete returns `204` with no body. Errors return: ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash NOTE="user:12345-user@example.com-note:d02c903b-17f8-4241-a263-2be9e7359d55:e5514ee8-22e5-414d-aa67-86e8476ece09" curl -X DELETE "https://api.useapi.net/v1/gemini-notebook/notes/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$NOTE")" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const note = "user:12345-user@example.com-note:d02c903b-17f8-4241-a263-2be9e7359d55:e5514ee8-22e5-414d-aa67-86e8476ece09"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/notes/${encodeURIComponent(note)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", response.status); ``` **Python** ``` python import requests, urllib.parse token = "API token" note = "user:12345-user@example.com-note:d02c903b-17f8-4241-a263-2be9e7359d55:e5514ee8-22e5-414d-aa67-86e8476ece09" apiUrl = "https://api.useapi.net/v1/gemini-notebook/notes/" + urllib.parse.quote(note, safe="") headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-sources-source === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/delete-gemini-notebook-sources-source --- layout: default title: DELETE sources/`source` description: "Remove a source from its notebook via DELETE sources/source in the useapi.net Gemini Notebook API — later chat answers and Studio artifacts stop using it." parent: Gemini Notebook API v1 nav_order: 330 permalink: /docs/api-gemini-notebook-v1/delete-gemini-notebook-sources-source --- ## Delete a source September 29, 2026 --- Remove a source from its notebook on Google. Chat answers and Studio artifacts created afterwards no longer use it. The rest of the notebook is not touched. To delete the whole notebook use [DELETE /notebooks/`notebook`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-notebooks-notebook). > **https://api.useapi.net/v1/gemini-notebook/sources/`source`** - `source` is the source id, URL-encoded in the path (it contains `:` and `@`). Source ids are returned by [POST /sources](/docs/api-gemini-notebook-v1/post-gemini-notebook-sources), [POST /sources/upload](/docs/api-gemini-notebook-v1/post-gemini-notebook-sources-upload) and [GET /notebooks/`notebook`](/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks-notebook). The id names its account, so no `email` is needed. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **204** **204 No Content** The source was deleted. No body. **400** **400 Bad Request** The path does not hold a valid source id, for example it holds a notebook id. ```json { "error": "Path parameter source (user%3A12345-user%40example.com-notebook%3Ad02c903b-17f8-4241-a263-2be9e7359d55) is not a valid source id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The source id was issued to a different API token. ```json { "error": "user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:9df5b3d2-0afd-4ea7-9c20-e42c4af17d46 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The account named in the source id is no longer configured, or Google reports the source or its notebook as not found. ```json { "error": "Account user@example.com of user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:9df5b3d2-0afd-4ea7-9c20-e42c4af17d46 is not configured", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` **503** **503 Service Unavailable** Google is temporarily unavailable or is challenging our network. Retry in a few minutes. A `502` means Google answered with an unexpected error. ```json { "error": "Google is temporarily unavailable (tGMBJ grpc 14), please retry", "code": 503 } ``` ##### Model A successful delete returns `204 No Content` with no body. Error responses carry a JSON `{ error, code }`. ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash SOURCE="user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:9df5b3d2-0afd-4ea7-9c20-e42c4af17d46" curl -X DELETE -H "Authorization: Bearer …" \ "https://api.useapi.net/v1/gemini-notebook/sources/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$SOURCE")" ``` **JavaScript** ``` javascript const token = "API token"; const source = "user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:9df5b3d2-0afd-4ea7-9c20-e42c4af17d46"; const response = await fetch(`https://api.useapi.net/v1/gemini-notebook/sources/${encodeURIComponent(source)}`, { method: "DELETE", headers: { "Authorization": `Bearer ${token}` } }); console.log("response", response.status); ``` **Python** ``` python import requests, urllib.parse token = "API token" source = "user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:9df5b3d2-0afd-4ea7-9c20-e42c4af17d46" response = requests.delete("https://api.useapi.net/v1/gemini-notebook/sources/" + urllib.parse.quote(source, safe=""), headers={"Authorization": f"Bearer {token}"}) print(response.status_code) # 204 ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email --- layout: default title: GET accounts/`email` description: "Read one Gemini Notebook account live via GET accounts/email in the useapi.net API — Google plan, session state, 5-hour and weekly usage, and each Studio action's estimated cost." parent: Gemini Notebook API v1 nav_order: 120 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email --- ## Retrieve an account September 29, 2026 --- Get one connected account with a live read from Google: whether the session is still signed in, the account's current plan, and its usage in the 5-hour and weekly windows. Google does not count generations. Each Studio action has an estimated cost as a percentage of the 5-hour window (`estimatedCostPercent`), and Google refuses a new job once its estimate is more than the `remainingPercent` of a window. Compare the two before you start a large job such as an Audio Overview or a slide deck. See [How much one account can generate](/docs/api-gemini-notebook-v1) for the Free, Pro and Ultra estimates. A signed-out session found here is handled like on any other request. The API re-checks it once, and if it is still signed out the account is paused and you receive an email with the re-add link. The response can be up to 60 seconds old. > **https://api.useapi.net/v1/gemini-notebook/accounts/`email`** - `email` is the email of a connected account, URL-encoded in the path. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "email": "user@example.com", "tier": "pro", "googleTier": "TIER_PRO", "googleTierCode": 2, "maxJobs": 3, "added": "2026-09-27T22:48:12.588Z", "cookies": [ "SID", "HSID", "SSID", "APISID", "SAPISID", "LSID", "OSID", "__Secure-OSID" ], "cookiesExpireAt": "2027-11-01T22:48:08.442Z", "addedVia": "setup-browser", "limits": { "notebooks": 500, "sourcesPerNotebook": 300 }, "health": "OK", "session": "signed-in", "outputLanguage": null, "quota": { "windows": [ { "window": "5h", "resetsAt": "2026-09-28T04:25:40.000Z", "usedPercent": 63.11, "remainingPercent": 36.89 }, { "window": "weekly", "resetsAt": "2026-10-04T23:25:40.000Z", "usedPercent": 3.01, "remainingPercent": 96.99 } ], "blocked": [ "cinematic" ], "actions": [ { "action": "audio", "allowed": true, "costTier": 3, "estimatedCostPercent": 11.03 }, { "action": "video", "allowed": true, "costTier": 3, "estimatedCostPercent": 10.92 }, { "action": "cinematic", "allowed": false, "costTier": 4, "estimatedCostPercent": 77.02 }, { "action": "video_short", "allowed": true, "costTier": 3, "estimatedCostPercent": 8.73 }, { "action": "infographic", "allowed": true, "costTier": 2, "estimatedCostPercent": 2.68 }, { "action": "slides", "allowed": true, "costTier": 3, "estimatedCostPercent": 13.63 }, { "action": "report", "allowed": true, "costTier": 2, "estimatedCostPercent": 1.08 }, { "action": "quiz", "allowed": true, "costTier": 1, "estimatedCostPercent": 0.57 }, ... ] } } ``` - Here the 5-hour window has 36.89% left, so an Audio Overview (11.03%) can start, while a cinematic video (77.02%) is refused until the window resets at `resetsAt`. - `session` tells what the live read found: - `signed-in` — the account works. `tier`, `googleTier`, `googleTierCode` and `quota` are fresh from Google. - `signed-out` — Google signed the account out. It is paused, `health` holds the re-add message and you receive an email with the re-add link. - `verifying` — another request is re-checking the session right now. Retry in about a minute. - `signed-in (re-checked)` — Google briefly reported the account as signed out, and the re-check found it signed in. - `unknown (could not reach Google to re-check)`, `unavailable (bot-check)`, `unavailable (shell-error)` — Google could not be reached. The account is not paused. Retry later. - `unknown` — the session works but the usage read failed. `quotaError` holds the reason. - `outputLanguage` is Google's account-wide language for Studio artifacts, as a language code such as `es`, or `null` when it was never set. Change it with [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts). It is returned only with `session: signed-in`. - `quota` is returned only with `session: signed-in`. - An account that is already paused (its `health` is the re-add message) is returned as stored, without `session` or `quota`. Re-add it with [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts). **400** **400 Bad Request** — the `email` in the path is not a valid email, or no account is connected yet. ```json { "error": "Path parameter email (not-an-email) not a valid email", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **404** **404 Not Found** — no account is connected for this `email`. ```json { "error": "Account user@example.com not found", "code": 404 } ``` ##### Model ```typescript { // TypeScript, all fields are optional {% include gemini-notebook/account-fields.md nullable_tier=true %} session?: string // what the live read found, see Responses outputLanguage?: string | null // Google's account-wide Studio output language, null when unset quota?: { windows: { window: '5h' | 'weekly' resetsAt: string | null // ISO 8601 usedPercent: number remainingPercent: number }[] blocked: string[] // actions Google refuses right now actions: { action: string // 'audio' | 'video' | 'cinematic' | 'video_short' | 'infographic' | 'slides' | 'report' | 'table' | 'flashcards' | 'quiz' | 'mindmap' | 'qna' | … allowed: boolean costTier: number | null estimatedCostPercent: number | null // Google's estimate, as % of the 5h window }[] } quotaError?: string // present with session 'unknown' } ``` With `session: signed-in`, `tier`, `googleTier` and `googleTierCode` come from the live read, and `googleTier` / `googleTierCode` are `null` when Google's answer carries no plan code. [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts) and [GET /accounts](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts) return the stored record, which omits both fields instead of returning `null`. ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v1/gemini-notebook/accounts/user%40example.com" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const email = "Previously configured account email"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/accounts/${encodeURIComponent(email)}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests from urllib.parse import quote token = "API token" email = "Previously configured account email" apiUrl = f"https://api.useapi.net/v1/gemini-notebook/accounts/{quote(email, safe='')}" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts --- layout: default title: GET accounts description: "List every Google account connected to the useapi.net Gemini Notebook API via GET accounts, with plan, health, running jobs and the last-known 5-hour and weekly usage." parent: Gemini Notebook API v1 nav_order: 110 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-accounts --- ## List accounts September 29, 2026 --- List the Google accounts connected with [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts). Each entry shows the account's plan, its `health`, how many jobs it is running against its `maxJobs`, and the last usage the API read from Google. This endpoint does not call Google. For the live plan and usage of one account use [GET /accounts/`email`](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email). The response can be up to 60 seconds old. > **https://api.useapi.net/v1/gemini-notebook/accounts** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "user@example.com": { "email": "user@example.com", "tier": "pro", "googleTier": "TIER_PRO", "googleTierCode": 2, "maxJobs": 3, "added": "2026-09-27T22:48:12.588Z", "cookies": [ "SID", "HSID", "SSID", "APISID", "SAPISID", "LSID", "OSID", "__Secure-OSID" ], "cookiesExpireAt": "2027-11-01T22:48:08.442Z", "addedVia": "setup-browser", "limits": { "notebooks": 500, "sourcesPerNotebook": 300 }, "health": "OK", "runningJobs": 1, "lastKnownQuota": { "windows": [ { "window": "5h", "resetsAt": "2026-09-28T04:25:40.000Z", "usedPercent": 63.11, "remainingPercent": 36.89 }, { "window": "weekly", "resetsAt": "2026-10-04T23:25:40.000Z", "usedPercent": 3.01, "remainingPercent": 96.99 } ], "blocked": [ "cinematic" ], "at": "2026-09-28T00:09:55.412Z" } }, "user2@example.com": { "email": "user2@example.com", "tier": "free", "googleTier": "TIER_FREE", "googleTierCode": 1, "maxJobs": 2, "added": "2026-09-27T19:18:45.721Z", "updated": "2026-09-27T20:11:41.537Z", "cookies": [ "SID", "HSID", "SSID", "APISID", "SAPISID", "LSID", "OSID", "__Secure-OSID" ], "cookiesExpireAt": "2027-11-01T00:00:00.000Z", "limits": { "notebooks": 100, "sourcesPerNotebook": 50 }, "health": "Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "runningJobs": 0 } } ``` - The response is an object keyed by account email, `{}` when no account is connected. - `health` is `OK` for a working account. `verifying` means Google reported the account as signed out and the API is re-checking it, which takes about a minute. Any other value says why the account must be re-added through [POST /accounts](/docs/api-gemini-notebook-v1/post-gemini-notebook-accounts) or the [automated setup](/assets/setup-browser/gemini-notebook.html). When Google signs an account out, it is paused and you also receive an email with the re-add link. - `lastKnownQuota` is the usage the API last read from Google, at the time given in `at`. It is refreshed by every [GET /accounts/`email`](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email) and after every job, and it is dropped after 5 hours. One-shot requests of [POST /artifacts](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts) use it to skip accounts where Google would refuse the job. **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` ##### Model An object keyed by account email. ```typescript { // TypeScript, all fields are optional [email: string]: { email: string tier: string // Google's plan, short form: 'free' | 'pro' | 'ultra' | 'plus' | … | 'unknown' googleTier?: string // Google's own plan name: 'TIER_FREE' | 'TIER_PRO' | 'TIER_ULTRA' | 'TIER_PLUS' | … googleTierCode?: number // Google's plan code: 1 = Free, 2 = Pro, 3 = Ultra, 4 = Plus, … maxJobs: number added: string // ISO 8601, when the account was first connected updated?: string // ISO 8601, the last re-add or maxJobs change cookies: string[] // names of the stored cookies, never their values cookiesExpireAt: string | null // ISO 8601, the earliest expiry Google stated for the stored cookies addedVia?: 'setup-browser' // present when the account was added by the automated setup limits?: { notebooks: number | null // notebooks allowed on the plan sourcesPerNotebook: number | null // sources allowed per notebook } health: string // 'OK', 'verifying', or the reason the account must be re-added runningJobs: number // jobs running on this account now, out of maxJobs lastKnownQuota?: { windows: { window: '5h' | 'weekly' resetsAt: string | null // ISO 8601 usedPercent: number remainingPercent: number }[] blocked: string[] // actions Google refused at that time at: string // ISO 8601, when this usage was read } } } ``` ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v1/gemini-notebook/accounts" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/gemini-notebook/accounts"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/gemini-notebook/accounts" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact --- layout: default title: GET artifacts/`artifact` description: "Fetch one Studio artifact with its result via GET artifacts/artifact in the useapi.net Gemini Notebook API — download links, slide captions, report text, table rows or quiz JSON." parent: Gemini Notebook API v1 nav_order: 610 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact --- ## Retrieve an artifact September 29, 2026 --- Fetch one Studio artifact by its id, read live from Google. A `completed` artifact carries its full result in the same shape as the `result` of a finished [job](/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid): download links for audio, video, slide decks and infographics, the text of reports, the rows of a data table, and the JSON of quizzes, flashcards and mind maps. Use it to read an artifact again after its job record has expired, to pick up an artifact created in the Gemini Notebook web app, or to check on an artifact whose job was [cancelled](/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid) or timed out (Google may still finish it). The artifact ids come from [GET /artifacts](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts) and from the `artifact` field of a job. > **https://api.useapi.net/v1/gemini-notebook/artifacts/`artifact`** - `artifact` is URL-encoded in the path (it contains `:` and `@`), for example `user%3A12345-user%40example.com-artifact%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3A07b94418-6c28-437c-98de-06bbeabb4e0c`. The id names the account and the notebook, so no `email` parameter is needed. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Result by type A `completed` artifact adds `title` plus the fields below. Any other status returns only `artifact`, `notebook`, `type`, `status`, `created` and `title`. | `type` | Fields | Files ([GET /artifacts/download](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download) `format`) | |---|---|---| | `audio` | `duration` (seconds), `files` | `m4a` | | `video` | `duration` (seconds), `files` | `mp4` | | `report` | `text` (Markdown) | — | | `interactive_report` | `text` (the report's paragraphs as plain text) | — | | `table` | `table` (rows of cells, the first row is the header) | — | | `quiz` | `content` (JSON: `quiz[]` with `question`, `answerOptions[]`, `hint`) | — | | `flashcards` | `content` (JSON: `flashcards[]`) | — | | `infographic` | `files` (with `width` / `height`), `text` | `png` | | `slides` | `files`, `slides[]` (`image`, `caption`, `text`) | `pdf`, `pptx`, and `slide` with `index` for each slide image (PNG) | | `mindmap` | `content` (JSON tree of `name` / `children`) | — | Every file link points at [GET /artifacts/download](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download), which streams the file from Google and needs your API token in the `Authorization` header. Google's own media URLs need the account's cookies, so they are never returned. ##### Responses **200** **200 OK** A completed quiz (long arrays shortened with `...`): ```json { "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c", "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "type": "quiz", "status": "completed", "created": "2026-09-27T23:26:36.000Z", "title": "Apollo Quiz", "content": { "quiz": [ { "question": "During Apollo 11's lunar landing phase, which Flight Director was at the helm in Mission Control leading Shift 2 (White Team)?", "answerOptions": [ { "text": "Gene Kranz", "rationale": "Gene Kranz served as the Flight Director for Shift 2 (White Team), which actively managed the critical lunar landing descent phase.", "isCorrect": true }, { "text": "Glynn Lunney", "rationale": "Glynn Lunney managed Shift 3 (Black Team), which oversaw lunar ascent rather than the landing phase.", "isCorrect": false }, "..." ], "hint": "..." }, "..." ], "topics": { "covered": ["Apollo 11 Mission Overview", "Spacecraft Engineering and Call Signs", "..."], "followUp": ["Project Gemini Precursor Missions", "..."] } } } ``` A completed slide deck: ```json { "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0", "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "type": "slides", "status": "completed", "created": "2026-09-27T23:31:15.000Z", "title": "Apollo 11 Flight Plan", "files": [ { "format": "pdf", "mimeType": "application/pdf", "url": "https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=user%3A12345-user%40example.com-artifact%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3Aae28f2a1-678b-4304-9806-09648fcb77a0&format=pdf" }, { "format": "pptx", "mimeType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "url": "https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=user%3A12345-user%40example.com-artifact%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3Aae28f2a1-678b-4304-9806-09648fcb77a0&format=pptx" } ], "slides": [ { "image": "https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=user%3A12345-user%40example.com-artifact%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3Aae28f2a1-678b-4304-9806-09648fcb77a0&format=slide&index=1", "caption": "Title slide for Apollo 11: Anatomy of a Miracle, featuring an astronaut on the lunar surface.", "text": "APOLLO_11: ANATOMY OF A MIRACLE\n\nJULY 16-24, 1969 | CREWED LUNAR LANDING\n\n..." }, "..." ] } ``` An artifact that is not `completed` yet (or `failed`) returns only `artifact`, `notebook`, `type`, `status`, `created` and `title`. **400** **400 Bad Request** The path value is not an artifact id (a notebook or source id is refused too). ```json { "error": "Path parameter artifact (…) is not a valid artifact id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The artifact id was issued to a different API token. ```json { "error": "user:12345-user@example.com-artifact:d02c903b-…:07b94418-… does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The artifact is no longer in the notebook (deleted here or in the web app), the notebook is gone, or its account is no longer configured. ```json { "error": "Artifact user:12345-user@example.com-artifact:d02c903b-…:07b94418-… not found", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` ##### Model ```typescript { // TypeScript, all fields are optional artifact: string // user:--artifact:: notebook: string // user:--notebook: type: 'audio' | 'video' | 'report' | 'interactive_report' | 'table' | 'quiz' | 'flashcards' | 'infographic' | 'slides' | 'mindmap' status: 'pending' | 'processing' | 'completed' | 'failed' | 'pending_review' created: string | null // ISO 8601 title: string // The fields below are present only when status is 'completed', and only for the types listed above duration: number // seconds, audio and video files: Array<{ format: 'm4a' | 'mp4' | 'pdf' | 'pptx' | 'png' mimeType: string url: string // GET /artifacts/download link, needs your API token width: number // infographic png only height: number // infographic png only }> slides: Array<{ // slide decks, in order image: string // GET /artifacts/download?…&format=slide&index=N (PNG) caption: string | null // Google's one-line description of the slide text: string | null // the slide's text as Google extracted it }> text: string // report (Markdown), interactive_report, infographic table: string[][] // data table, first row = column headers content: QuizContent | FlashcardsContent | MindmapNode // quiz, flashcards, mindmap } type QuizContent = { quiz: Array<{ question: string answerOptions: Array<{ text: string rationale: string // why this option is right or wrong isCorrect: boolean }> hint: string }> topics: { covered: string[] followUp: string[] } } type FlashcardsContent = { flashcards: Array<{ f: string // front of the card b: string // back of the card c: number // present on some cards (Google's own marker) }> topics: { covered: string[] followUp: string[] } } type MindmapNode = { name: string children: MindmapNode[] // absent on leaf nodes } ``` `content` is the JSON Google's own interactive quiz, flashcard and mind-map views render, passed through unchanged. If Google does not return it on a read, `content` is left out, so read the artifact again. ##### Examples **Curl** ``` bash ARTIFACT="user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c" curl -H "Authorization: Bearer …" \ "https://api.useapi.net/v1/gemini-notebook/artifacts/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$ARTIFACT")" ``` **JavaScript** ``` javascript const token = "API token"; const artifact = "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/artifacts/${encodeURIComponent(artifact)}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests, urllib.parse token = "API token" artifact = "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c" apiUrl = "https://api.useapi.net/v1/gemini-notebook/artifacts/" + urllib.parse.quote(artifact, safe="") headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download --- layout: default title: GET artifacts/download description: "Stream an artifact's file via GET artifacts/download in the useapi.net Gemini Notebook API — m4a audio, mp4 video, pdf or pptx decks, png infographics and slide images, with Range support." parent: Gemini Notebook API v1 nav_order: 640 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download --- ## Download an artifact file September 29, 2026 --- Download the file of a completed Studio artifact. The response body is the file itself, streamed from Google on each request and never stored by us. Google's media URLs only open with the Google account's cookies, so every file link in a finished [job](/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid) `result` and in [GET /artifacts/`artifact`](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact) points here instead. Those links are ready to use: call them with your API token in the `Authorization` header. They keep working as long as the artifact stays in its notebook. Once the artifact is [deleted](/docs/api-gemini-notebook-v1/delete-gemini-notebook-artifacts-artifact) they answer `404`, and deleting its notebook takes them with it. | Artifact `type` | `format` | Content type | |---|---|---| | `audio` | `m4a` | `audio/mp4` | | `video` | `mp4` | `video/mp4` | | `slides` | `pdf` | `application/pdf` | | `slides` | `pptx` | `application/vnd.openxmlformats-officedocument.presentationml.presentation` | | `slides` | `slide` + `index` | `image/png`, one slide image | | `infographic` | `png` | `image/png` | Reports, interactive reports, data tables, quizzes, flashcards and mind maps have no file: their text, rows or JSON are in the artifact itself. > **https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=`artifact`&format=`format`** ##### Request Headers ``` yaml Authorization: Bearer {API token} # Optional, passed through to Google Range: bytes=0-1048575 ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. - `Range` is optional. It is forwarded to Google, so a player can seek in long audio and video or a client can resume a download. A range request answers `206 Partial Content` with `Content-Range`. ##### Query Parameters - `artifact` is **required**, the artifact id from [GET /artifacts](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts) or a job. URL-encode it (it contains `:` and `@`). - `format` is **required**, which file to download. Supported values: `m4a`, `mp4`, `pdf`, `pptx`, `png`, `slide`. The artifact must have that file, see the table above. - `index` is required with `format=slide` and ignored otherwise, the 1-based slide number. Range: `1` to `500`, and at most the number of slides in the deck. ##### Response headers - `Content-Type`: the file's type from the table above. - `Content-Disposition`: `attachment; filename="."`, for a slide image `" slide .png"`. The title keeps letters, digits, spaces, `.`, `_` and `-`, is cut to 100 characters, and falls back to `artifact` when nothing is left. [Rename](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-artifact) the artifact to change it. - `Content-Length`, `Accept-Ranges`, `Content-Range`, `ETag`, `Last-Modified`: passed through from Google when it sends them. - `Cache-Control: private, no-store`. ##### Responses **200** **200 OK** The raw file bytes (not JSON), for example: ``` Content-Type: audio/mp4 Content-Disposition: attachment; filename="Fue suerte el descenso del Eagle.m4a" Cache-Control: private, no-store ``` **206** **206 Partial Content** The requested byte range of the file, when the request carried a `Range` header. **400** **400 Bad Request** A parameter is missing or invalid, or `format=slide` came without `index`. ```json { "error": "index (1-based slide number) is required with format slide", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The artifact id was issued to a different API token. ```json { "error": "user:12345-user@example.com-artifact:d02c903b-…:07b94418-… does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The artifact has no file in that `format` (wrong type, not completed yet, or a slide `index` past the last slide), or the artifact is gone from its notebook. The message lists the formats the artifact does have. ```json { "error": "No m4a file on this video (status completed); available: mp4", "code": 404 } ``` ```json { "error": "Artifact user:12345-user@example.com-artifact:d02c903b-…:07b94418-… not found", "code": 404 } ``` **502** **502 Bad Gateway** Google did not serve the file (the message names where the fetch stopped). Retry shortly. ```json { "error": "Google request failed: media fetch failed at lh3.googleusercontent.com (HTTP 403, text/html)", "code": 502 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` ##### Model A successful response is the file itself (not JSON), with the headers listed above. Errors return: ```typescript { // TypeScript, all fields are optional error: string code: number } ``` ##### Examples **Curl** ``` bash ARTIFACT="user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0" # The whole deck as PDF, saved under the filename from Content-Disposition curl -G -OJ "https://api.useapi.net/v1/gemini-notebook/artifacts/download" \ -H "Authorization: Bearer …" \ --data-urlencode "artifact=$ARTIFACT" \ --data-urlencode "format=pdf" # Slide 3 as PNG curl -G "https://api.useapi.net/v1/gemini-notebook/artifacts/download" \ -H "Authorization: Bearer …" \ --data-urlencode "artifact=$ARTIFACT" \ --data-urlencode "format=slide" \ --data-urlencode "index=3" \ --output slide-3.png ``` **JavaScript** ``` javascript const token = "API token"; const artifact = "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:0c2ba8dc-47dd-474f-a19c-c06896e269fd"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=${encodeURIComponent(artifact)}&format=m4a`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); if (!response.ok) console.log("error", response.status, await response.json()); else { const audio = await response.arrayBuffer(); console.log("downloaded", audio.byteLength, response.headers.get("content-disposition")); } ``` **Python** ``` python import requests token = "API token" artifact = "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:0449d123-6d1e-4864-ab28-ecac88a74c53" apiUrl = "https://api.useapi.net/v1/gemini-notebook/artifacts/download" headers = { "Authorization" : f"Bearer {token}" } with requests.get(apiUrl, headers=headers, params={"artifact": artifact, "format": "mp4"}, stream=True) as response: response.raise_for_status() with open("video.mp4", "wb") as f: for chunk in response.iter_content(chunk_size=1 << 20): f.write(chunk) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts --- layout: default title: GET artifacts description: "List every Studio artifact in one notebook via GET artifacts in the useapi.net Gemini Notebook API — id, title, type and generation status for each audio, video, report or quiz." parent: Gemini Notebook API v1 nav_order: 600 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts --- ## List artifacts September 29, 2026 --- List the Studio artifacts of one notebook: everything created with [POST /artifacts](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts), plus anything made in the Gemini Notebook web app on the same notebook. Each row carries the artifact id, which you pass to [GET /artifacts/`artifact`](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact) for the full result (files, slides, text, table or quiz / flashcards / mind map JSON). The list is read live from Google on every call. Artifacts that are still generating appear with status `pending` or `processing`. > **https://api.useapi.net/v1/gemini-notebook/artifacts?notebook=`notebook`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `notebook` is **required**, the notebook id returned by [POST /notebooks](/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks) or [GET /notebooks](/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks), for example `user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55`. The id names the account the notebook lives on, so no `email` parameter is needed. URL-encode it (it contains `:` and `@`). ##### Responses **200** **200 OK** An array, one row per artifact. An empty notebook returns `[]`. ```json [ { "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:0449d123-6d1e-4864-ab28-ecac88a74c53", "title": "Apollo 11: Ticking Clock", "type": "video", "status": "completed", "created": "2026-09-27T23:38:23.000Z" }, { "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:0c2ba8dc-47dd-474f-a19c-c06896e269fd", "title": "¿Fue suerte el descenso del Eagle?", "type": "audio", "status": "completed", "created": "2026-09-27T23:38:10.000Z" }, { "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0", "title": "Apollo 11 Flight Plan", "type": "slides", "status": "completed", "created": "2026-09-27T23:31:15.000Z" }, { "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:07b94418-6c28-437c-98de-06bbeabb4e0c", "title": "Apollo Quiz", "type": "quiz", "status": "completed", "created": "2026-09-27T23:26:36.000Z" } ] ``` **400** **400 Bad Request** `notebook` is missing or is not a notebook id. ```json { "error": "Parameter notebook is not a valid notebook id", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The notebook id was issued to a different API token. ```json { "error": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The account the notebook lives on is no longer configured, or Google no longer has the notebook. ```json { "error": "Account user@example.com of user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 is not configured", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` ##### Model ```typescript Array<{ artifact: string // user:--artifact:: title: string type: 'audio' | 'video' | 'report' | 'interactive_report' | 'table' | 'quiz' | 'flashcards' | 'infographic' | 'slides' | 'mindmap' status: 'pending' | 'processing' | 'completed' | 'failed' | 'pending_review' created: string | null // ISO 8601 }> ``` A `type` or `status` Google adds later that this API does not know yet is returned as `type` / `status` (Google's raw code). ##### Examples **Curl** ``` bash curl -G "https://api.useapi.net/v1/gemini-notebook/artifacts" \ -H "Authorization: Bearer …" \ --data-urlencode "notebook=user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" ``` **JavaScript** ``` javascript const token = "API token"; const notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/artifacts?notebook=${encodeURIComponent(notebook)}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" apiUrl = "https://api.useapi.net/v1/gemini-notebook/artifacts" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers, params={"notebook": notebook}) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-chat === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-chat --- layout: default title: GET chat description: "Read a notebook's chat history via GET chat in the useapi.net Gemini Notebook API — the latest or a named conversation, up to 100 turns, oldest first." parent: Gemini Notebook API v1 nav_order: 402 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-chat --- ## Retrieve chat history September 29, 2026 --- Read the questions and answers of a notebook's chat, live from Google, oldest turn first. Without `conversation` you get the notebook's latest conversation, which includes chats held in the Gemini Notebook web app. Up to 100 turns are returned. Each turn has a `role` (`user` for a question, `assistant` for an answer) and its `text`. The text is what Google stores for the turn: answers come back as plain text without the Markdown and the `[1]` citation markers of the [POST /chat](/docs/api-gemini-notebook-v1/post-gemini-notebook-chat) answer, and can include the quoted passages of the sources they cite. When the notebook has no conversation yet, `conversation` is `null` and `turns` is `[]`. Save a conversation as a note with the `conversation` parameter of [POST /notes](/docs/api-gemini-notebook-v1/post-gemini-notebook-notes), or clear it with [DELETE /chat](/docs/api-gemini-notebook-v1/delete-gemini-notebook-chat). > **https://api.useapi.net/v1/gemini-notebook/chat?notebook=`notebook`&conversation=`conversation`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `notebook` is **required**, the notebook id returned by [POST /notebooks](/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks) or [GET /notebooks](/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks). URL-encode it (it contains `:` and `@`). The id names its account, so no `email` is needed. - `conversation` is optional, a conversation id from [POST /chat](/docs/api-gemini-notebook-v1/post-gemini-notebook-chat). Default: the notebook's latest conversation. ##### Responses **200** **200 OK** Answers shortened. ```json { "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "conversation": "fd20f12d-611f-4008-9e61-94e02af005a9", "turns": [ { "role": "user", "text": "What were the 1202 alarms?" }, { "role": "assistant", "text": "The 1202 program alarms during lunar descent indicated \"executive overflows,\" meaning the guidance computer was overloaded and had to postpone lower-priority tasks to maintain real-time processing..." }, { "role": "user", "text": "Who told the crew it was safe to continue?" }, { "role": "assistant", "text": "Inside Mission Control, computer engineer Jack Garman informed Guidance Officer Steve Bales that the computer alarms were non-fatal..." } ] } ``` **400** **400 Bad Request** A missing notebook id, or a `conversation` that is not a conversation id. ```json { "error": "Parameter notebook is required", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The id was issued to a different API token. ```json { "error": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The notebook was deleted, or its account is no longer configured. ```json { "error": "Not found on account user@example.com (Google hPTbtc grpc 5)", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` **503** **503 Service Unavailable** Google is temporarily unavailable or is challenging our network. Retry in a few minutes. A `502` means Google answered with an unexpected error. ```json { "error": "Google is temporarily unavailable (khqZz grpc 14), please retry", "code": 503 } ``` ##### Model ```typescript { // TypeScript, all fields are optional notebook: string conversation: string | null // null when the notebook has no conversation turns: { // oldest first, up to 100 role: 'user' | 'assistant' text: string }[] error: string // error responses only code: number // error responses only, the HTTP status } ``` ##### Examples **Curl** ``` bash curl -G "https://api.useapi.net/v1/gemini-notebook/chat" \ -H "Authorization: Bearer …" \ --data-urlencode "notebook=user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" ``` **JavaScript** ``` javascript const token = "API token"; const notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/chat?notebook=${encodeURIComponent(notebook)}&conversation=fd20f12d-611f-4008-9e61-94e02af005a9`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` **Python** ``` python import requests token = "API token" notebook = "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55" apiUrl = "https://api.useapi.net/v1/gemini-notebook/chat" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers, params={"notebook": notebook}) print(response, response.json()) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid --- layout: default title: GET jobs/`jobid` description: "Poll a Studio generation or research job via GET jobs/jobid in the useapi.net Gemini Notebook API — the job record with its result or error, the same body a replyUrl webhook receives." parent: Gemini Notebook API v1 nav_order: 710 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-jobs-jobid --- ## Retrieve a job September 29, 2026 --- Fetch a job record by its `jobid`. Every Studio generation is a job: [POST /artifacts](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts), [POST /artifacts/retry](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-retry) and [POST /artifacts/revise](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-revise) all return one. So does a research run from [POST /research](/docs/api-gemini-notebook-v1/post-gemini-notebook-research). Poll this endpoint until `status` is `completed` or `failed`. The API advances every running job about every 15 seconds, so polling more often than that gains nothing. Generation takes from under a minute (flashcards, mind maps) to 10 minutes and more (video). A job still running after 40 minutes is failed with error code `timeout` and its slot is freed. Google may still finish the artifact in the notebook, and [GET /artifacts/`artifact`](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact) shows it when it does. Instead of polling, pass `replyUrl` (and optionally `replyRef`) with the POST: when the job completes or fails, the API sends one `POST` of this same job record, as JSON, to that URL. See [Model](#model). Job records are kept for 30 days. > **https://api.useapi.net/v1/gemini-notebook/jobs/`jobid`** - `jobid` is URL-encoded in the path (it contains `:` and `@`), for example `job%3A12597f9a-010c-4758-8e9a-b5cc17b0ccdb-user%3A12345-user%40example.com-bot%3Agemini_notebook`. ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** Completed (an audio overview): ```json { "jobid": "job:12597f9a-010c-4758-8e9a-b5cc17b0ccdb-user:12345-user@example.com-bot:gemini_notebook", "email": "user@example.com", "type": "audio", "status": "completed", "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:0c2ba8dc-47dd-474f-a19c-c06896e269fd", "created_at": "2026-09-27T23:38:15.692Z", "request": { "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "type": "audio", "format": "debate", "length": "short", "language": "es", "instructions": "Focus on the risks the crew took during the landing." }, "completed_at": "2026-09-27T23:43:41.173Z", "result": { "title": "¿Fue suerte el descenso del Eagle?", "duration": 277, "files": [ { "format": "m4a", "mimeType": "audio/mp4", "url": "https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=user%3A12345-user%40example.com-artifact%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3A0c2ba8dc-47dd-474f-a19c-c06896e269fd&format=m4a" } ] } } ``` Running (a cinematic video): ```json { "jobid": "job:21ade7e0-f2c0-48a1-904d-688096a3ff29-user:12345-user@example.com-bot:gemini_notebook", "email": "user@example.com", "type": "video", "status": "processing", "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:7f923bb5-fb59-4ee6-ade6-9ae559a660fe", "created_at": "2026-09-28T04:32:44.630Z", "request": { "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "type": "video", "format": "cinematic" } } ``` Completed (a research job, Discover sources, list shortened): ```json { "jobid": "job:526bc256-d897-493a-9ebc-7c9f35ca4428-user:12345-user@example.com-bot:gemini_notebook", "email": "user@example.com", "type": "research", "status": "completed", "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "created_at": "2026-09-29T04:10:07.338Z", "request": { "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "query": "Apollo 11 lunar module guidance computer alarms", "type": "fast" }, "completed_at": "2026-09-29T04:10:23.751Z", "result": { "mode": "fast", "query": "Apollo 11 lunar module guidance computer alarms", "summary": "Navigate the technical causes, software design, and human decisions behind the famous Apollo 11 guidance computer alarms.", "sources": [ { "url": "https://www.ibiblio.org/apollo/Documents/CherryApollo11Exegesis.pdf", "title": "Exegesis of the 1201 and 1202 Alarms Which Occurred During the Mission G Lunar Landing - Ibiblio", "description": "Technical exegesis explaining the exact mechanism of 1201/1202 alarms.", "cited": true } ] } } ``` Failed (cancelled with [DELETE /jobs/`jobid`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid)): ```json { "jobid": "job:09112e70-e1f3-422d-a1af-955de87508e4-user:12345-user@example.com-bot:gemini_notebook", "email": "user@example.com", "type": "flashcards", "status": "failed", "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "artifact": "user:12345-user@example.com-artifact:d02c903b-17f8-4241-a263-2be9e7359d55:064463cc-e0a3-4feb-9196-2cec98b55039", "created_at": "2026-09-28T03:23:42.051Z", "request": { "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "type": "flashcards", "quantity": "fewer" }, "completed_at": "2026-09-28T03:23:42.561Z", "error": { "code": "cancelled", "message": "Cancelled: the slot is freed. Google may still finish the artifact in the notebook." } } ``` **400** **400 Bad Request** The path value is not a Gemini Notebook jobid. ```json { "error": "Path parameter jobid (…) is not a valid jobid", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** ```json { "error": "jobid does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** No such job, or its record is older than 30 days. ```json { "error": "Job job:12597f9a-…-bot:gemini_notebook not found", "code": 404 } ``` ##### Model The job record. [POST /artifacts](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts), [POST /artifacts/retry](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-retry), [POST /artifacts/revise](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-revise) and [POST /research](/docs/api-gemini-notebook-v1/post-gemini-notebook-research) return it too, and it is the body of the `replyUrl` webhook. ```typescript { // TypeScript, all fields are optional jobid: string // job:-user:--bot:gemini_notebook email: string // the account the job runs on type: 'audio' | 'video' | 'report' | 'interactive_report' | 'table' | 'quiz' | 'flashcards' | 'infographic' | 'slides' | 'mindmap' | 'research' status: 'pending' | 'processing' | 'completed' | 'failed' notebook: string // notebook id; for a one-shot, the notebook created for it artifact?: string // artifact id, once Google has created it (never on a research job) created_at: string // ISO 8601, when the job was accepted updated_at?: string // one-shot only: when its artifact was created completed_at?: string // ISO 8601, when the job completed or failed request: Record // your request body echoed back (ids as strings), without mode, replyUrl and replyRef replyUrl?: string replyRef?: string warnings?: string[] // one-shot only: sources Google could not process and that were left out error?: { // status 'failed' code: 'quota' | 'account' | 'not_found' | 'sources' | 'generation_failed' | 'timeout' | 'google_error' | 'scheduler' | 'cancelled' message: string retryAt?: string // code 'quota', when Google names the window: ISO 8601 time it resets } result?: { // status 'completed', a Studio artifact title: string duration?: number // audio, video: seconds files?: Array<{ // audio, video, infographic, slides format: 'm4a' | 'mp4' | 'png' | 'pdf' | 'pptx' mimeType: string url: string // GET /artifacts/download link, needs your API token width?: number // infographic height?: number }> slides?: Array<{ // slides image: string // GET /artifacts/download link (format=slide&index=N) caption: string | null text: string | null }> text?: string // report (Markdown), interactive_report, infographic table?: string[][] // table: rows of cells, header row first content?: unknown // quiz, flashcards, mindmap: Google's JSON } | { // status 'completed', type 'research' (POST /research) mode: 'fast' | 'deep' query: string summary?: string // fast: Google's one-line summary of what it found report?: { // deep: the Deep Research report title: string markdown: string } noResults?: true // the run found nothing (sources is []) sources: Array<{ url: string title: string description: string | null cited: boolean // deep: the report cites it. fast: always true }> } } ``` For a Studio job, `result` has exactly the per-type shape of a completed artifact, described on [GET /artifacts/`artifact`](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact#result-by-type). Every file `url` points at [GET /artifacts/download](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-download), which needs your API token. For a research job (`type: research`), `result` lists what the run found, described on [POST /research](/docs/api-gemini-notebook-v1/post-gemini-notebook-research#model). Add it to the notebook with [POST /research/import](/docs/api-gemini-notebook-v1/post-gemini-notebook-research-import). While a job runs, `status` keeps the value it had when the job was accepted (`pending`, or `processing` when Google had already started) and changes only when the job completes or fails. A one-shot job starts `pending` while its sources are processed, and its `artifact` appears here once Google has created it. The `202` of a sync one-shot request can already show `processing` once its artifact exists, while this endpoint keeps showing `pending` until the job completes or fails. | `error.code` | Meaning | |---|---| | `quota` | Not enough of Google's 5-hour or weekly usage window was left for this job. `retryAt` says when it resets, when Google's refusal names the window. [GET /accounts/`email`](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email) shows what each action needs. | | `generation_failed` | Google reported the generation as failed. [POST /artifacts/retry](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-retry) re-runs it in place. For a research job, Google ended the run in a state the API does not recognise. | | `sources` | One-shot only: the notebook got no usable source, or its sources were still processing after 5 minutes. | | `not_found` | The artifact, research run or notebook disappeared while the job ran (deleted here or in the web app). | | `account` | Google signed the account out, and it must be re-added via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). The same code is used when the account was removed with [DELETE /accounts/`email`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-accounts-email) while the job ran, with the message `Account is no longer configured`. | | `timeout` | Still running after 40 minutes. Check [GET /artifacts/`artifact`](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts-artifact) later, Google may still finish it. For a research job, check the notebook in the Gemini Notebook web app. | | `cancelled` | Cancelled with [DELETE /jobs/`jobid`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid). A research run cancelled in the Gemini Notebook web app fails with this code too. | | `scheduler` | The job could not be scheduled on our side. Google may already have started the generation, so check [GET /artifacts](/docs/api-gemini-notebook-v1/get-gemini-notebook-artifacts) before you submit it again. | | `google_error` | Any other refusal from Google. `message` has the details. | The `replyUrl` webhook is one `POST` with `Content-Type: application/json` and this record as the body, sent once when the job completes or fails (a 10-second timeout, no retries). A job cancelled with [DELETE /jobs/`jobid`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid) sends no webhook. Use `replyRef` to match the callback to your own records. ##### Examples **Curl** ``` bash JOBID="job:12597f9a-010c-4758-8e9a-b5cc17b0ccdb-user:12345-user@example.com-bot:gemini_notebook" curl -H "Authorization: Bearer …" \ "https://api.useapi.net/v1/gemini-notebook/jobs/$(python3 -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1],safe=''))" "$JOBID")" ``` **JavaScript** ``` javascript const token = "API token"; const jobid = "job:12597f9a-010c-4758-8e9a-b5cc17b0ccdb-user:12345-user@example.com-bot:gemini_notebook"; const apiUrl = `https://api.useapi.net/v1/gemini-notebook/jobs/${encodeURIComponent(jobid)}`; let job; do { await new Promise(resolve => setTimeout(resolve, 15000)); const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); job = await response.json(); console.log(job.status); } while (job.status === "pending" || job.status === "processing"); console.log("job", job); ``` **Python** ``` python import requests, time, urllib.parse token = "API token" jobid = "job:12597f9a-010c-4758-8e9a-b5cc17b0ccdb-user:12345-user@example.com-bot:gemini_notebook" apiUrl = "https://api.useapi.net/v1/gemini-notebook/jobs/" + urllib.parse.quote(jobid, safe="") headers = { "Authorization" : f"Bearer {token}" } while True: time.sleep(15) job = requests.get(apiUrl, headers=headers).json() print(job.get("status")) if job.get("status") not in ("pending", "processing"): break print(job) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-jobs --- layout: default title: GET jobs description: "See each Gemini Notebook account's load via GET jobs in the useapi.net API — health, maxJobs, the Studio and research jobs running now and the last-known 5-hour and weekly usage." parent: Gemini Notebook API v1 nav_order: 700 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-jobs --- ## List running jobs September 29, 2026 --- 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](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts), [POST /artifacts/retry](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-retry) or [POST /artifacts/revise](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts-revise) or [POST /research](/docs/api-gemini-notebook-v1/post-gemini-notebook-research) accepts it until it completes, fails or is [cancelled](/docs/api-gemini-notebook-v1/delete-gemini-notebook-jobs-jobid). 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`](/docs/api-gemini-notebook-v1/get-gemini-notebook-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 ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Responses **200** **200 OK** ```json { "accounts": { "user@example.com": { "health": "OK", "maxJobs": 3, "running": 1, "jobs": [ { "jobid": "job:21ade7e0-f2c0-48a1-904d-688096a3ff29-user:12345-user@example.com-bot:gemini_notebook", "type": "video", "started_at": "2026-09-28T04:32:44.630Z", "artifact": "user:12345-user@example.com-artifact: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" } }, "another@example.com": { "health": "OK", "maxJobs": 2, "running": 0, "jobs": [] } } } ``` With no accounts configured the answer is `{ "accounts": {} }`. **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` ##### Model ```typescript { // 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`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-accounts-email) while jobs were still running on it. `quota` is refreshed every time [GET /accounts/`email`](/docs/api-gemini-notebook-v1/get-gemini-notebook-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`](/docs/api-gemini-notebook-v1/get-gemini-notebook-accounts-email). A one-shot [POST /artifacts](/docs/api-gemini-notebook-v1/post-gemini-notebook-artifacts) without `email` skips an account whose last-known usage shows a window at 100% or the requested action blocked. ##### Examples **Curl** ``` bash curl "https://api.useapi.net/v1/gemini-notebook/jobs" \ -H "Authorization: Bearer …" ``` **JavaScript** ``` javascript 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}); ``` **Python** ``` python 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()) ``` === URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-labels === Document URL: https://useapi.net/docs/api-gemini-notebook-v1/get-gemini-notebook-labels --- layout: default title: GET labels description: "List a notebook's source labels via GET labels in the useapi.net Gemini Notebook API — each label's name, emoji and the sources it groups." parent: Gemini Notebook API v1 nav_order: 490 permalink: /docs/api-gemini-notebook-v1/get-gemini-notebook-labels --- ## List source labels September 29, 2026 --- List the labels that group a notebook's sources, as the source panel of the Gemini Notebook web app shows them. Each label has a name, an optional emoji and the ids of its sources. A source can be in more than one label, and sources without a label are not listed here. Create labels with [POST /labels](/docs/api-gemini-notebook-v1/post-gemini-notebook-labels), either by letting Google label the sources by topic or by naming one yourself. Change one with [POST /labels/`label`](/docs/api-gemini-notebook-v1/post-gemini-notebook-labels-label) and remove it with [DELETE /labels/`label`](/docs/api-gemini-notebook-v1/delete-gemini-notebook-labels-label). > **https://api.useapi.net/v1/gemini-notebook/labels?notebook=`notebook`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](/docs/start-here/setup-useapi) for details. ##### Query Parameters - `notebook` is **required**, the notebook id returned by [POST /notebooks](/docs/api-gemini-notebook-v1/post-gemini-notebook-notebooks) or [GET /notebooks](/docs/api-gemini-notebook-v1/get-gemini-notebook-notebooks), for example `user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55`. The id names the account the notebook lives on, so no `email` parameter is needed. URL-encode it (it contains `:` and `@`). ##### Responses **200** **200 OK** A notebook without labels returns `"labels": []`. ```json { "notebook": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55", "labels": [ { "label": "user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:01a0466f-bd9f-48ab-a27d-5ae84181aa42", "name": "Apollo 11 Mission", "sources": [ "user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8", "user:12345-user@example.com-source:d02c903b-17f8-4241-a263-2be9e7359d55:2744eb7c-399a-4573-bd32-126143ba9514" ] }, { "label": "user:12345-user@example.com-label:d02c903b-17f8-4241-a263-2be9e7359d55:5973ba2b-845e-41b5-97b2-ef855d5746ad", "name": "The landing", "emoji": "🚀", "sources": [] } ] } ``` **400** **400 Bad Request** ```json { "error": "Parameter notebook is required", "code": 400 } ``` **401** **401 Unauthorized** Invalid API token. ```json { "error": "useapi.net ⁝ Unauthorized", "code": 401 } ``` **403** **403 Forbidden** The id was issued to a different API token. ```json { "error": "user:12345-user@example.com-notebook:d02c903b-17f8-4241-a263-2be9e7359d55 does not belong to this API token", "code": 403 } ``` **404** **404 Not Found** The notebook was deleted, or its account is no longer configured. ```json { "error": "Not found on account user@example.com (Google I3xc3c grpc 5)", "code": 404 } ``` **596** **596 Account Error** Google reported the account as signed out. While we re-check it, the answer is the first message below. Retry in about a minute. If it stays signed out, the account is paused, you receive an email, and the answer becomes the second message until you re-add it via [Setup Gemini Notebook](/docs/start-here/setup-gemini-notebook). ```json { "error": "Google reported this account as signed out. We are re-checking it — please retry in about a minute. If it stays signed out, you will receive a re-add email.", "code": 596 } ``` ```json { "error": "Account user@example.com: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } ``` **503** **503 Service Unavailable** Google is temporarily unavailable or is challenging our network. Retry in a few minutes. A `502` means Google answered with an unexpected error. ```json { "error": "Google is temporarily unavailable (I3xc3c grpc 14), please retry", "code": 503 } ``` ##### Model ```typescript { // TypeScript, all fields are optional notebook: string labels: { label: string // user:--label::