Revise a slide
September 29, 2026
Table of contents
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
API tokenis required, see Setup useapi.net for details.
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"
}
artifactis required, the id of a completed slide deck, from its job’sartifactfield or from GET /artifacts. The id names its account and notebook, so noemailis needed.slideis required, the slide to change, counted from1. It must not exceed the deck’s slide count, which is the length ofresult.slidesin the deck’s job or in GET /artifacts/artifact.
Range:1to500.promptis required, what to change on that slide, 1 to 2,000 characters.modeis optional,sync(default, waits up to 90 seconds) orasync(returns201at once).replyUrlis optional, a publichttp(s)URL that receives onePOSTof the job record when the job completes or fails. See GET /jobs/jobidfor the record’s shape.replyRefis optional, your own reference echoed back in the job record, up to 1024 characters.
Responses
-
The completed job, as returned by sync mode or later by GET /jobs/
jobid.artifactis the new, revised deck.request.artifactis 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..." }, ... ] } } -
Async mode. Poll GET /jobs/
jobiduntilstatusiscompletedorfailed.{ "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." } } -
Sync mode, still running after 90 seconds. The body is the running job record, as in the
201tab. Poll GET /jobs/jobidfor the result. -
A missing or invalid parameter, or a
slidenumber beyond the deck’s last slide.{ "error": "slide must be 1..12", "code": 400 } -
Invalid API token.
{ "error": "useapi.net ⁝ Unauthorized", "code": 401 } -
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 } -
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 } -
The artifact is not a slide deck, or it has not completed.
{ "error": "Only a completed slide deck can be revised", "code": 409 } -
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. -
The account already runs
maxJobsjobs:{ "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.
retryAtis when the window resets andwindowis5horweekly, 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" } -
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 } -
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
596with 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())