direct gives the
share ChatGPT receives when it opens the page itself, as when someone gives it the URL. Every piece ChatGPT search
does not keep comes with the reason, and analysis turns the reasons into fixes.
Score a page
GET /v1/async/task/{id}, or add webhook.url to the request and receive it
when the task finishes. Most pages take 1 to 3 minutes, so poll every 10 to 15 seconds. The task works like
any other async task, and the result is in response. The request schema is in the
API reference.
Request fields
Any other field returns
400 VALIDATION_ERROR.
How a page is scored
- Access. robots.txt is read for OAI-SearchBot, ChatGPT-User and GPTBot. The page is fetched as each of them and as a browser, from a US address, where ChatGPT-User fetches pages from.
- What a person reads. A browser in
countryrenders the page and scrolls it to the end, and the text in its large images is read line by line. Lines about the page’s own subject become pieces. Menus, footers, other products, customer reviews, buttons and ads stay out of the score. - What ChatGPT search keeps. A browser renders the page as OAI-SearchBot, the crawler that fills ChatGPT search, from a US address, and lets no request for data out. Its copy is the text of the HTML the server sends and the text the page’s scripts draw from it, hidden text and image alt text included. Text inside images and content the page loads after it opens are not in it, as they are not in ChatGPT search.
- What ChatGPT receives when it opens the page. The HTML ChatGPT-User receives is read the way ChatGPT’s
reader reads it: its text, hidden text and image alt text, without scripts. An image counts when ChatGPT
can open and read it: the HTML gives the picture as an
imgsrc, as JPEG, PNG or WebP, at a size whose text stays legible. - Whether ChatGPT opens the page. Production ChatGPT is asked twice to open the page. Its answers are not scored: they show only whether it opened the page.
- Placing each piece. A piece is
readwhen the search copy holds it, andmissingwith its reason otherwise.directplaces it the same way in what ChatGPT receives when it opens the page. Code decides every piece, so a page that has not changed gets the same score.
Read the result
The OLIVE YOUNG page above reads like this, trimmed to the main fields:score
The share of pieces ChatGPT search keeps, from 0 to 100. Every piece weighs the same. The score is 0 when
robots.txt keeps the page out of ChatGPT search and when the site refuses ChatGPT search’s crawler.
reading.score holds the share before robots.txt sets the score to 0.
direct
What ChatGPT receives when it opens the page itself, as when someone gives it the URL. direct.score is the
share of pieces in the HTML ChatGPT-User receives and in the images ChatGPT can open, and direct.read counts
them. It is 0 when ChatGPT could not open the page. The two scores part where a page writes text in images or
draws it with scripts: ChatGPT search keeps no text inside images and keeps what scripts draw from the HTML,
while ChatGPT’s reader opens images it can read and runs no scripts. A grocery product page whose nutrition
label is a full-size JPEG scored 56 for search and 93 opened directly.
access
search.refused is true when the site refuses ChatGPT search’s crawler, which holds the score at 0, and
search.lines counts the lines of the search copy. blockedBy is user_agent when the site refuses the
ChatGPT-User agent from any address, openai_addresses when it serves that agent from our address and refuses
OpenAI’s, and site when it refuses a browser too. robots gives the deciding robots.txt line for each OpenAI
agent, noindex reports a noindex directive and where it was set, and probes lists the status each fetch received.
reading.items[]
One entry per piece:
reading.locations counts the pieces by where, which shows what remains to fix once ChatGPT can open the
page. causes[] groups the missing pieces by reason.
analysis
summary states the score, the largest issue and the score with the confirmed issues fixed (potential).
direct says what ChatGPT receives when it opens the page itself, or who keeps it from opening the page and
the fix. Each entry of issues[] has the cause (detail), the fix (fix), the pieces it costs (facts), its
evidence and the points it takes off the score. Access issues that hold the score at 0 come first, then the
rest by points. basis is confirmed: our own reading of the page (its HTML, renders, images, robots.txt, HTTP
answers) shows the issue. The text of analysis is in English.
markdown
The page a person sees, as Markdown, with the text of its images where the images sit. The page’s own
content, which the score checks, stands under its headings and labels. The menus, reviews and other parts around it
are folded to one line each. Each piece ChatGPT search does not keep is marked where it sits, _(missing: …)_
with the reason, and the header gives how many pieces ChatGPT receives when it opens the page. The header and the
marks are in the page’s language: English, Korean, Japanese, Chinese, Spanish, French, German or Portuguese, and
English for any other. A Korean page reads _(누락: …)_. An excerpt of the OLIVE YOUNG page, which is in English:
screenshot
The first four screens of the page as a person sees it, as a JPEG: a 1366×900 window, taken at the top once the
page was scrolled to the end. url is its own access key and opens the file until expiresAt, 30 days after the
task. A page whose picture could not be taken comes without screenshot, and a picture that could not be stored
has status: "failed".
rendering
The page rendered for AI agents. The copy is the HTML a person’s browser drew, without scripts, with the text of
each image added to its alt text, the text alternative WCAG asks of an image of text. rendering.score is the
share of pieces the copy holds in its text: what an AI agent served the copy receives without opening an image.
rendering.read counts them and reading.items[].rendering marks each piece; the copy itself is not part of
the result. The OLIVE YOUNG page above holds all 55 of its pieces in its copy, a score of 100: the text of
its ingredient and FAQ images as alt text, and the prices and ratings its scripts load.
rendering is absent when no browser could show the page or its drawn HTML is too large to copy.
Reading the score correctly
- ChatGPT search works from a copy its crawler made of the page: the text of the HTML and what scripts draw from it, without the text inside images or what the page loads after it opens. The copy dates from the last crawl, so a change reaches ChatGPT search after the crawler fetches the page again.
- When ChatGPT opens a page itself, it reads the HTML the server sends. It runs no scripts, reads image alt text,
and opens an image only through the
imgsrc that HTML gives. OpenAI reuses a page it opened for about 30 minutes. - The score moves only when the page or the way it renders changes. Of fifteen pages scored three times each, ten moved 3 points or less. A page that draws different parts on each visit moves more.
- GEO Score covers what ChatGPT has of one page. Which pages ChatGPT search picks for a question is what GEO monitors track.
Errors and billing
A completed task costs 10 credits for the page and 5 for each image whose text is read, at most 12 images:images.read
in the result. An image the host refused or that could not be read, counted in images.unread, is free. An image your account read in the last 90 days is reused instead, counted in images.reused, for 2 credits. Submitting holds
70 credits, the most a page costs, and completion charges what the task used. A failed task is not charged. See
Credits and limits.
Rejected at submit
Authentication, concurrency and rate errors are the same as for any task. See Errors.
Failed tasks
A failed task hasstatus: "FAILED" and an error string that starts with its code:
Next steps
Citation Analysis
See which sources shaped one answer.
GEO monitors
Track your brand across AI engines on a schedule.