Copy sources to another notebook

October 15, 2026

Table of contents

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

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
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"
}
  • sources is required, an array of 1 to 300 source ids, all from the same notebook.
  • notebook is required, the id of the notebook to copy into. It must be on the same account as the sources.
Responses
  • 201 Created

    from is the original’s id and source is 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"
        }
      ]
    }
    
  • 400 Bad Request

    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
    }
    
  • 401 Unauthorized

    Invalid API token.

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

    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
    }
    
  • 404 Not Found

    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
    }
    
  • 503 Service Unavailable

    Google is temporarily unavailable or is challenging our network. Check the target notebook, then retry in a few minutes. A 502 means 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())
    
Try It