Copy sources to another notebook
October 15, 2026
Table of contents
Copy sources from one notebook into another notebook on the same account. Nothing is fetched or uploaded again. Each copy gets a new source id in the target notebook, and the originals stay where they are.
All sources must come from one notebook, and the target notebook must be a different notebook on the same account. To copy a whole notebook use POST /notebooks/copy, and to copy Studio artifacts use POST /artifacts/copy.
The copies start with status: "processing" and turn ready on their own. Check them with GET /notebooks/notebook on the target.
The API does not retry this call, so after a 502, 503 or 504 check GET /notebooks/notebook on the target before you try again.
https://api.useapi.net/v1/gemini-notebook/sources/copy
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API tokenis required, see Setup useapi.net for details.
Request Body
{
"sources": [
"user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8",
"user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:2744eb7c-399a-4573-bd32-126143ba9514"
],
"notebook": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95"
}
sourcesis required, an array of1to300source ids, all from the same notebook.notebookis required, the id of the notebook to copy into. It must be on the same account as the sources.
Responses
-
fromis the original’s id andsourceis the copy’s new id.{ "notebook": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95", "sources": [ { "from": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:2744eb7c-399a-4573-bd32-126143ba9514", "source": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95:61bea6fc-1c65-4fd8-b733-a5be55ecf37d", "title": "Apollo 13 - Wikipedia", "kind": "web", "status": "processing" }, { "from": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8", "source": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95:b3cffe4a-130b-42eb-b6d0-1edf33675051", "title": "Apollo 11 - Wikipedia", "kind": "web", "status": "processing" } ] } -
A missing or invalid parameter, sources from more than one notebook, sources already in the target, or a target on another account.
{ "error": "sources must all come from one notebook", "code": 400 }{ "error": "the sources are already in this notebook", "code": 400 }{ "error": "source user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8 is on another account than notebook user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95", "code": 400 } -
Invalid API token.
{ "error": "useapi.net ⁝ Unauthorized", "code": 401 } -
The notebook id belongs to a different API token.
{ "error": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95 does not belong to this API token", "code": 403 } -
The account the notebook names is not configured, or a notebook or source no longer exists at Google.
{ "error": "Account [email protected] of user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95 is not configured", "code": 404 } -
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.
{ "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 }{ "error": "Account [email protected]: Google signed this account out. Re-add it at https://useapi.net/docs/start-here/setup-gemini-notebook", "code": 596 } -
Google is temporarily unavailable or is challenging our network. Check the target notebook, then retry in a few minutes. A
502means Google answered with an unexpected error.{ "error": "GOOGLE_BOT_CHECK: Google is challenging our network right now, please retry in a few minutes", "code": 503 }
Model
{ // TypeScript, all fields are optional
notebook: string // the target notebook
sources: {
from: string // the original source's id
source: string // the copy's id in the target notebook
title: string
kind: string // see POST /sources, "Source kinds and statuses"
status: 'preparing' | 'processing' | 'ready' | 'error'
words?: number
url?: string // web and YouTube sources
mimeType?: string
driveFileId?: string
created?: string // ISO 8601
}[]
error: string // error responses only
code: number // error responses only, the HTTP status
}
Examples
-
curl -X POST "https://api.useapi.net/v1/gemini-notebook/sources/copy" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -d '{ "sources": ["user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8"], "notebook": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95" }' -
const token = "API token"; const response = await fetch("https://api.useapi.net/v1/gemini-notebook/sources/copy", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` }, body: JSON.stringify({ sources: [ "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8", "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:2744eb7c-399a-4573-bd32-126143ba9514" ], notebook: "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95" }) }); const result = await response.json(); console.log("response", response.status, result); -
import requests token = "API token" response = requests.post( "https://api.useapi.net/v1/gemini-notebook/sources/copy", headers={"Content-Type": "application/json", "Authorization": f"Bearer {token}"}, json={ "sources": ["user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:1761af94-f5aa-47f3-9539-0b4ebcd547f8"], "notebook": "user:[email protected]:5b7e2a41-9c0d-4e8f-a1b3-6d2c8f0e7a95" } ) print(response.status_code, response.json())