Changelog

What is new in Page Search API and its SDKs, newest first.

November 2, 2026

Citations that show where the answer is

  • SDKs 0.11.1: CITATIONS cites pages only; CITATIONS_WITH_BOXES adds the part of each page, for which the agent looks at each page it cites.
  • SDKs 0.11.0: CITATIONS, to add to an agent's instructions, has it cite each sentence with a tag, <cite doc="..." page="12"/>, and the part of the page it comes from, box="x0,y0,x1,y1". client.citations(answer) finds them, with each document's id, to open the page or show that part. See Show where the answer is.

A document is in one collection

  • A collection now holds its documents as a folder holds files: a document is in at most one collection, and has a collection_id. Adding documents to a collection moves them there from any other; a document already there that is the same file stops the move, with 409 document_exists.
  • The same file uploaded into another collection is another document there, with its own metadata. Uploaded again into the same collection, it is the document already there, as before.
  • Deleting a collection deletes its documents. Move any you want to keep out of it first.
  • Documents that were in more than one collection were copied into each, as documents of their own; we wrote to the account this concerned. See Organize documents.
  • SDKs 0.10.0: Document.collection_id; collections.add moves documents, and collections.delete deletes a collection's documents.

Agents find collections

  • SDKs 0.9.0: a seventh agent tool, list_collections, lists your collections, for free, and list_documents and search_documents take a collection_id. Made for all your documents, the tools, and the MCP server, find the collection a question names, so one setup serves them all; a collection or filter given when they are made still keeps the agent to those documents. See Agent tools.

An MCP server

  • The agent tools are an MCP server at https://api.search.pageindex.ai/mcp, for the OpenAI Responses API, Claude Code, Cursor and other MCP clients; add ?collection= or ?filter= to choose the documents. See MCP.
  • Python SDK 0.8.0: pageindex-search-mcp runs the server on your computer, for Claude Desktop (pip install "pageindex-search[mcp]"), and tools.mcp() gives it to run yourself.
  • Python SDK 0.8.1: search_documents and search_pages say what each search cost.

A search of documents may list none

  • Without top_k, a search of documents lists only the documents likely to help, which may be none, in place of always the most relevant one. more_documents lists the next most relevant, up to 10, as more_pages does for pages. See API reference.
  • SDKs 0.8.2: more_documents on each answer; the search_documents tool lists them, so an agent whose question the documents do not answer says so instead of searching a document that does not. The JavaScript SDK's search tools also say what each search cost.
  • SDKs 0.8.2: for a question about order or position, such as the first figure or page 5, an agent reads the pages in order, for free, instead of searching them.

Agent playground

  • The console's Agent page asks an agent about your documents, all of them, a collection's or one, with the model you choose, and shows each step and what the answer cost.

October 31, 2026

Lower prices

  • Page search is now $0.10 per 1,000 pages for the first question and $0.02 for each extra question, down from $0.30 and $0.10. Document search is now $0.30 per 1,000 documents for the first question and $0.10 for each extra question, down from $0.50 and $0.20. See Pricing.

Agents read pictures of pages

  • SDKs 0.7.1: in search_pages, a page that is a picture, such as a scan, comes with a note to look at it before answering from its text, which may be incomplete or wrong; read_pages asks the agent to zoom in where the print is small. With the OpenAI Agents SDK, pictures of pages go to the model at high detail.

Agents list documents for free

  • SDKs 0.7.0: a sixth agent tool, list_documents, lists the documents whose metadata meets a filter, for free. An agent finds the documents a question names this way, and searches documents only when a filter cannot pick them out. See Agent tools.
  • A search of documents without top_k now always lists at least the most relevant document.
  • Lists of documents and collections take an offset and give a total, how many there are in all, so you can go straight to any page. In the SDKs 0.7.0, list() takes offset in place of after.
  • Zooming takes a box, x0,y0,x1,y1 from the page's top left, as most tools write one, in place of region: page_image(doc, page, box=...) in the SDKs 0.7.0, and zoom_page takes {"x0", "y0", "x1", "y1"}.

Zoom in on part of a page

  • A page's image takes a region: top,left,bottom,right as fractions of the page, for only that part of it, drawn sharper. Free, as reading pages is. See Pages.
  • SDKs 0.6.0: documents.page_image(doc, page, region=...) in Python, documents.pageImage(doc, page, { region }) in JavaScript, and a fifth agent tool, zoom_page: an agent that cannot read a table's figures or small print zooms in on them. See Agent tools.

October 30, 2026

Lower page search price

  • Page search is now $0.30 per 1,000 pages for the first question and $0.10 for each extra question, down from $0.50 and $0.20. Document search is unchanged, at $0.50 per 1,000 documents and $0.20 for each extra question. See Pricing, now shown per 1,000.

The next pages, without searching again

  • Without top_k, each document a search lists also has more_pages: up to 10 of the next most relevant pages, without text. If the pages listed do not answer, read those for free rather than searching again.
  • SDKs 0.5.2: the agent tool search_pages searches one document, given as document_id; the agent calls it for each document it picked, at the same time. It lists more_pages too. Both searches take questions, up to 10 at once, which cost less than asking one at a time.

Agents

  • client.tools() in SDKs 0.5.0 gives an LLM agent four tools over your documents: search_documents, with your metadata's keys and values in its description so the agent can write filters; search_pages, with each page's text; read_pages and view_pages. They work with Claude and with OpenAI. See Agent tools.
  • Python SDK 0.5.1: tools.openai_agents() gives the tools ready for the OpenAI Agents SDK (pip install "pageindex-search[agents]").

Read pages

  • Each page a search lists says how it is best read: "text", or "image" for a scan or a chart. include_text lists each page with its text.
  • GET /v1/documents/{id}/pages, the text of up to 20 pages, and GET /v1/documents/{id}/pages/{page}/image, a page as a PNG. Free. SDKs 0.5.0: documents.pages and documents.page_image (pageImage in JavaScript).

October 29, 2026

Metadata schema

  • GET /v1/collections/{id}/schema and GET /v1/documents/schema: the metadata keys your documents have, with their types, how many documents have each, and their values, counted from the documents as they are now. SDKs 0.4.2: client.collections.schema and client.documents.schema.

Exactly K documents

  • document_top_k on POST /v1/search: across documents, open exactly this many for each question, the most relevant, however likely. SDKs 0.4.1: document_top_k= in Python, documentTopK in JavaScript. The Playground's search of pages across documents has a Top K for documents.

One search, of one document or across documents

  • Search across documents. POST /v1/search searches one document's pages (with document_id), or across your documents: all of them, the ones you name, a collection, or those whose metadata meets a filter. The documents likely to answer each question are found first, then the most relevant opened (max_documents, 3 by default) and their pages searched. Each answer lists documents, each with its pages. See Search pages.
  • POST /v1/documents/{id}/search still works as before.
  • Sharper document ranking. When several documents look alike for a question, such as one company's filings of different years, the one most likely to answer it now comes first, in document search and in a search across documents.
  • Playground. Two searches, as the API has: search pages (in one document, a collection or all your documents, with the pages found under each document) and search documents.
  • SDKs 0.4.0 (Python and JavaScript): client.search(questions, document=doc) (JavaScript: client.search(questions, { document: doc })), or with documents, collection, filter and max_documents to search across documents. Breaking: the questions now come first and the document is an option; each answer's pages are under answer.documents (in Python, answer.pages is still the first document's).

Document search, collections and metadata

  • Document search. POST /v1/documents/search finds which of your documents likely hold each question's answer: all of them, the ones you name, a collection, or those whose metadata meets a filter. Each document searched is priced as one page. See Search pages.
  • Collections. Named groups of your documents, to list and search within: /v1/collections, and collection_id on uploads, listing and document search. A document may be in many collections.
  • Metadata. Your own keys on each document (strings, numbers and booleans), set on upload or with the new PATCH /v1/documents/{id}, and a filter on listing and document search. Every document now has a metadata field, empty until you set it.
  • Console. Collections on the Documents page, and the Playground searches across documents too.
  • SDKs 0.3.0 (Python and JavaScript): client.documents.search, client.collections, client.documents.update, and collection, metadata and filter options on upload, list and search.
  • SDKs 0.3.1: document search results carry each document's metadata.
  • Pricing. Document search is on the pricing page: a card, and a mode of the cost calculator.

October 27, 2026

SDKs 0.2.0

  • Documents are managed under client.documents: upload, get, list (which goes through every page when looped over) and delete. The names before 0.2 still work, with a warning, and go in a later version.
  • Every search sends an Idempotency-Key, the same on retries, so a search retried after a timeout is not charged twice.

Page Search API

  • Upload a PDF, ask up to 10 questions at once, and get back the pages likely to answer each, with their relevance. Python and JavaScript SDKs, and a console with API keys, credit, usage and a playground.
  • GET /v1/documents/{id}/file returns the PDF a document was made from.