Revise a slide

September 29, 2026

Table of contents

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

Change one slide of a completed slide deck by describing what you want, for example “Make this slide a simple timeline graphic.” The deck must be a slides artifact from POST /artifacts whose status is completed.

Google produces the revised deck as a new artifact with its own id, and in our tests its title gained a ` (2) suffix. The job's artifact field names the new deck, and its result carries the full set of files (pdf, pptx) and every slide image, exactly like a new slide deck. In our tests a revision took about 160 seconds, so in sync mode expect a 202` and keep polling.

The revision is a job. It counts toward the account’s maxJobs, and Google can refuse it with 429 when its usage window is short. mode, replyUrl and replyRef behave as on POST /artifacts.

https://api.useapi.net/v1/gemini-notebook/artifacts/revise

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body
{
  "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0",
  "slide": 2,
  "prompt": "Make this slide a simple timeline graphic.",
  "mode": "async"
}
  • artifact is required, the id of a completed slide deck, from its job’s artifact field or from GET /artifacts. The id names its account and notebook, so no email is needed.
  • slide is required, the slide to change, counted from 1. It must not exceed the deck’s slide count, which is the length of result.slides in the deck’s job or in GET /artifacts/artifact.
    Range: 1 to 500.
  • prompt is required, what to change on that slide, 1 to 2,000 characters.
  • mode is optional, sync (default, waits up to 90 seconds) or async (returns 201 at once).
  • replyUrl is optional, a public http(s) URL that receives one POST of the job record when the job completes or fails. See GET /jobs/jobid for the record’s shape.
  • replyRef is optional, your own reference echoed back in the job record, up to 1024 characters.
Responses
  • 200 OK

    The completed job, as returned by sync mode or later by GET /jobs/jobid. artifact is the new, revised deck. request.artifact is the deck you revised.

    {
      "jobid": "job:7ec0b9b1-4a8b-4f27-9dfe-5761bc2acb18-user:[email protected]:gemini_notebook",
      "email": "[email protected]",
      "type": "slides",
      "status": "completed",
      "notebook": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55",
      "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:7f9b45c6-ebed-4e12-8542-0f28955d9b81",
      "created_at": "2026-09-28T00:05:09.001Z",
      "request": {
        "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0",
        "slide": 2,
        "prompt": "Make this slide a simple timeline graphic."
      },
      "completed_at": "2026-09-28T00:07:52.421Z",
      "result": {
        "title": "Apollo 11 Flight Plan (2)",
        "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%3A7f9b45c6-ebed-4e12-8542-0f28955d9b81&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%3A7f9b45c6-ebed-4e12-8542-0f28955d9b81&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%3A7f9b45c6-ebed-4e12-8542-0f28955d9b81&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..."
          },
          {
            "image": "https://api.useapi.net/v1/gemini-notebook/artifacts/download?artifact=user%3A12345-user%40example.com-artifact%3Ad02c903b-17f8-4241-a263-2be9e7359d55%3A7f9b45c6-ebed-4e12-8542-0f28955d9b81&format=slide&index=2",
            "caption": "A timeline comparing early Soviet space achievements with a US milestone under a famous JFK quote about going to the moon.",
            "text": "WE CHOOSE TO GO TO THE MOON IN THIS DECADE...\n\n[Horizontal timeline chart on a dark grid background tracking early space race milestones]\n..."
          },
          ...
        ]
      }
    }
    
  • 201 Created

    Async mode. Poll GET /jobs/jobid until status is completed or failed.

    {
      "jobid": "job:7ec0b9b1-4a8b-4f27-9dfe-5761bc2acb18-user:[email protected]:gemini_notebook",
      "email": "[email protected]",
      "type": "slides",
      "status": "pending",
      "notebook": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55",
      "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:7f9b45c6-ebed-4e12-8542-0f28955d9b81",
      "created_at": "2026-09-28T00:05:09.001Z",
      "request": {
        "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0",
        "slide": 2,
        "prompt": "Make this slide a simple timeline graphic."
      }
    }
    
  • 202 Accepted

    Sync mode, still running after 90 seconds. The body is the running job record, as in the 201 tab. Poll GET /jobs/jobid for the result.

  • 400 Bad Request

    A missing or invalid parameter, or a slide number beyond the deck’s last slide.

    {
      "error": "slide must be 1..12",
      "code": 400
    }
    
  • 401 Unauthorized

    Invalid API token.

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

    The artifact id belongs to a different API token.

    {
      "error": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0 does not belong to this API token",
      "code": 403
    }
    
  • 404 Not Found

    The deck is no longer in its notebook, or the account it names is not configured.

    {
      "error": "Artifact user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0 not found",
      "code": 404
    }
    
  • 409 Conflict

    The artifact is not a slide deck, or it has not completed.

    {
      "error": "Only a completed slide deck can be revised",
      "code": 409
    }
    
  • 422 Unprocessable Content

    Sync mode, Google reported the revised deck as failed. The body is the failed job record with error.code: "generation_failed". The failed deck can be re-run with POST /artifacts/retry.

  • 429 Too Many Requests

    The account already runs maxJobs jobs:

    {
      "error": "Account [email protected] is busy: 3/3 jobs running (maxJobs)",
      "code": 429
    }
    

    Or Google refused the job because not enough of its usage window is left, before any job was created. retryAt is when the window resets and window is 5h or weekly, both present only when Google’s refusal names the window. See GET /accounts/email:

    {
      "error": "Not enough of Google's 5h window is left on account [email protected] for this job; it resets at 2026-09-28T04:25:40.000Z. GET /accounts/[email protected] shows what each job needs",
      "code": 429,
      "retryAt": "2026-09-28T04:25:40.000Z",
      "window": "5h"
    }
    
  • 502 Bad Gateway

    Google accepted the revision but did not return the new deck, so there is no job to track. Look for it in GET /artifacts.

    {
      "error": "Google accepted the revision but returned no artifact to track; check GET /artifacts?notebook=",
      "code": 502
    }
    
  • 503 Service Unavailable

    A temporary condition, retry in a few minutes.

    {
      "error": "Async mode is unavailable right now, use mode sync",
      "code": 503
    }
    

    The job could not be added to our job schedule. It is failed at once with error.code: "scheduler". Google may already have started the generation, since only a one-shot request creates the artifact inside the job. Check GET /artifacts before you submit it again.

    {
      "error": "Unable to lock the job schedule of user 12345, please retry",
      "code": 503
    }
    
    {
      "error": "Failed to create the job schedule (QStash HTTP 500): …",
      "code": 503
    }
    
  • 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
    }
    

    In sync mode, a job whose account is confirmed signed out while it runs answers 596 with the failed job record (error.code: "account").

Model

The job record, the same shape as POST /artifacts returns for slides. Here artifact is the new, revised deck, and request echoes artifact (the deck you revised), slide and prompt. The full field list is on GET /jobs/jobid.

{ // TypeScript, all fields are optional
  jobid: string                  // job:<uuid>-user:<id>-<email>-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<string, unknown>   // 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
    }>
  }
}
Examples
  • curl -X POST "https://api.useapi.net/v1/gemini-notebook/artifacts/revise" \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer …" \
       -d '{
         "artifact": "user:[email protected]:d02c903b-17f8-4241-a263-2be9e7359d55:ae28f2a1-678b-4304-9806-09648fcb77a0",
         "slide": 2,
         "prompt": "Make this slide a simple timeline graphic.",
         "mode": "async"
       }'
    
  • const token = "API token";
    const artifact = "user:[email protected]:...";
    const response = await fetch("https://api.useapi.net/v1/gemini-notebook/artifacts/revise", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${token}`
      },
      body: JSON.stringify({
        artifact,
        slide: 2,
        prompt: "Make this slide a simple timeline graphic.",
        mode: "async"
      })
    });
    const job = await response.json();
    console.log("response", response.status, job);
    
  • import requests
    
    token = "API token"
    artifact = "user:[email protected]:..."
    response = requests.post(
        "https://api.useapi.net/v1/gemini-notebook/artifacts/revise",
        headers={"Content-Type": "application/json", "Authorization": f"Bearer {token}"},
        json={
            "artifact": artifact,
            "slide": 2,
            "prompt": "Make this slide a simple timeline graphic.",
            "mode": "async"
        }
    )
    print(response.status_code, response.json())
    
Try It