Gemini Embedding 2 Pricing vs OpenAI, Tested on 495 Pages
Gemini Embedding 2 costs $0.20 per million tokens. OpenAI’s text-embedding-3-small costs $0.02. That is a tenfold difference on the model that decides which of your pages a chatbot reads before it answers, and the pricing page cannot tell you whether the extra money buys better answers. So on 12 October we embedded our entire site, 495 pages, with four embedding models from our production WordPress server, then asked 40 visitor questions and checked which model put the right page at the top.
The short version: Gemini Embedding 2 pricing is ten times OpenAI’s cheapest model, and it was only worth it when we sent text the way Google’s documentation asks. Sent as plain text, the way most chatbot plugins send it today, it ranked last.
- Embedding the whole site once cost $0.022 with text-embedding-3-small, $0.142 with 3-large, $0.171 with gemini-embedding-001 and $0.233 with Gemini Embedding 2. Google’s Batch rate would cut the last figure to $0.116.
- With Google’s task prefixes, Gemini Embedding 2 put the right page first for 23 of 40 questions and in the top five for 31. That was the best result of the six setups we ran.
- Without the prefixes, the same model managed 11 first and 24 in the top five, the worst result of the six. Same model, same price, same pages. The only difference was a few words of formatting.
- text-embedding-3-small, the cheapest model, scored 19 and 25. 3-large, at 6.5 times the price, scored 16 and 28. gemini-embedding-001 scored 21 and 28.
- Per 1,000 visitor questions, embedding the question cost $0.0003 on 3-small and $0.0044 on Gemini Embedding 2. The chat model that writes the reply costs hundreds of times more, so at chat time the embedding price barely registers.
- Chunk size mattered as much as the model. Cutting chunks from 4,000 to 1,000 characters lifted 3-small from 25 to 30 top-five hits without adding a single token.
Embedding prices on 12 October 2026
An embedding model turns text into a list of numbers so that pieces of text with similar meaning end up close together. A WordPress chatbot uses one twice. When you import your content, every chunk of every page is embedded once and stored. When a visitor asks a question, the question is embedded and compared against the stored chunks, and the closest matches are handed to the chat model as the knowledge it answers from. You pay for the embedding model on both sides: once per chunk at import, and once per question at chat time.
These are the list rates per million input tokens, read from Google’s and OpenAI’s pricing pages the same day. Embedding models charge for input only.
| Model | Price per 1M tokens | Dimensions | Max input | Status |
|---|---|---|---|---|
| text-embedding-3-small (OpenAI) | $0.02 | 1,536 | 8,191 tokens | Current |
| text-embedding-3-large (OpenAI) | $0.13 | 3,072 | 8,191 tokens | Current |
| text-embedding-ada-002 (OpenAI) | $0.10 | 1,536 | 8,191 tokens | Older, still listed |
| gemini-embedding-001 (Google) | $0.15 (last listed) | 128 to 3,072 | 2,048 tokens | Shutdown date 14 May 2028 |
| Gemini Embedding 2 (Google) | $0.20 text ($0.10 Batch) | 128 to 3,072 | 8,192 tokens | Stable since 22 April 2026 |
Three things on the Google side are easy to miss. First, Google’s Gemini API pricing page no longer prints a price for gemini-embedding-001 at all. Its deprecations page lists a shutdown date of 14 May 2028 and names Gemini Embedding 2 as the replacement. Second, the two Google models are not compatible. Google’s embeddings guide says that if you move to Embedding 2 you must re-embed all of your existing data. Third, Gemini Embedding 2 is multimodal. Images cost $0.45 per million tokens, audio $6.50 and video $12, and the free tier covers all of them, although Google’s terms say free-tier content is used to improve its products.
How we tested
The knowledge base was our own site: every published post, page and product on mxchat.ai, 495 items and 5.25 million characters of text. We split it with MxChat’s own chunker at its default setting of 4,000 characters, which produced 1,615 chunks. That is a realistic shape for a WordPress site: one very long documentation page, a few hundred blog posts, and some short product pages.
We then embedded all 1,615 chunks six ways from the production server, using the site’s own API keys:
- text-embedding-3-small, 1,536 dimensions. This is MxChat’s default embedding model.
- text-embedding-3-large, 3,072 dimensions.
- gemini-embedding-001 at 1,536 dimensions with no task type, which is exactly how MxChat sends it today.
- gemini-embedding-001 with task types:
RETRIEVAL_DOCUMENTon chunks andRETRIEVAL_QUERYon questions. - Gemini Embedding 2, plain text, 3,072 dimensions.
- Gemini Embedding 2 with prefixes. Embedding 2 drops the task type parameter. Instead Google’s guide asks you to write the task into the text:
title: {title} | text: {content}for documents andtask: search result | query: {content}for questions.
The 40 questions were written the way a visitor would ask them, avoiding the exact wording on the page. Twenty-two asked about a single setting buried in our documentation page, such as how to hide the widget on one page, where to find a Slack member ID, or the most text you can paste into the knowledge base in one go. Eighteen asked about the subject of a specific blog post, such as whether WP-Cron runs on a site with no visitors or whether an accessibility overlay can get you sued. For each question we knew which chunks held the answer, and we recorded where the first of them appeared in each model’s ranking.
Each question was embedded three times per setup to time the calls: 720 single-question requests in all, every one of which returned HTTP 200.
What it costs to embed a WordPress site
OpenAI counted 1,091,944 tokens for the full site, about 208 tokens per 1,000 characters. Google counted 1,136,765 tokens for the identical text, 4.1% more, so the Google models are a little dearer than their list price suggests on English web content. Adding Embedding 2’s document prefix pushed the count to 1,163,085, because every chunk now carries its page title.
| Setup | Tokens billed | Cost to embed the site | A site 10 times larger | Per 1,000 questions |
|---|---|---|---|---|
| text-embedding-3-small | 1,091,944 | $0.022 | $0.22 | $0.0003 |
| text-embedding-3-large | 1,091,944 | $0.142 | $1.42 | $0.0020 |
| gemini-embedding-001 | 1,136,765 | $0.171 | $1.71 | $0.0023 |
| Gemini Embedding 2 | 1,136,765 | $0.227 | $2.27 | $0.0030 |
| Gemini Embedding 2 with prefixes | 1,163,085 | $0.233 | $2.33 | $0.0044 |
| Gemini Embedding 2 with prefixes, Batch | 1,163,085 | $0.116 | $1.16 | Batch is not for live questions |
The ratio is large and the amounts are small. Even at Gemini Embedding 2’s rate, a site ten times the size of ours costs a little over two dollars to index from scratch. Re-importing after edits only re-embeds the pages that changed. The question side is smaller still: visitor questions averaged 15 tokens on OpenAI and 22 on Gemini Embedding 2 once the query prefix was added, so a million questions would cost $0.30 on 3-small and $4.40 on Embedding 2.
For scale, the chat model that writes the answer cost $0.53 per 1,000 replies on GPT-6 Luna and $0.75 on Claude Haiku 5.5 in our Haiku 5.5 measurement on the same kind of request. Embedding is under 1% of the per-question bill on any of these models. The real costs of choosing an embedding model are elsewhere: whether it finds the right page, and the work of re-embedding everything if you ever switch.
Which model found the right page
| Setup | Right page first (of 40) | Right page in top 5 (of 40) | Documentation questions, top 5 (of 22) | Blog questions, first (of 18) |
|---|---|---|---|---|
| text-embedding-3-small | 19 | 25 | 8 | 15 |
| text-embedding-3-large | 16 | 28 | 10 | 12 |
| gemini-embedding-001 (as MxChat sends it) | 21 | 28 | 10 | 16 |
| gemini-embedding-001 with task types | 21 | 29 | 11 | 16 |
| Gemini Embedding 2, plain text | 11 | 24 | 6 | 9 |
| Gemini Embedding 2 with prefixes | 23 | 31 | 13 | 18 |
The blog questions were the easy half. Each post is about one subject and runs to several chunks, so any of them counted as a hit. Prefixed Gemini Embedding 2 put the right post first for all 18. Plain Gemini Embedding 2 got 9 of the same 18, often ranking a closely related post above the one that answered the question. Every setup had the right post somewhere in its top five for at least 17 of 18.
The documentation questions were the hard half, and no model handled them well at 4,000-character chunks. Our documentation page is 119,000 characters long, and one chunk of it covers a dozen settings. A question about one setting has to match a chunk that is mostly about eleven others. The best setup found the right chunk in its top five for 13 of 22. Three questions defeated every model at this chunk size: how to test whether hosting supports streamed replies, whether the bot can pull in news articles, and how strict to make the match score.
text-embedding-3-large is the odd result. It costs 6.5 times as much as 3-small and ranked the right page first less often (16 against 19), although it did better on the top five (28 against 25). If your chatbot passes the top five chunks to the chat model, as many do, the top-five column is the one that matters, and on that column 3-large and gemini-embedding-001 tied.
The prefixes are the whole story for Gemini Embedding 2
Gemini Embedding 2 does not accept the task_type parameter that gemini-embedding-001 used. Google moved the instruction into the text itself. If you leave it out, the API still returns an embedding, without any warning, and the embedding is noticeably worse for search. In our run the difference between the two Gemini Embedding 2 setups (12 extra questions answered first) was larger than the difference between any two models.
gemini-embedding-001 was far less sensitive. Adding its task types changed one question in the top five and none at the top. So if you are moving from 001 to Embedding 2, the prefixes are not an optional tuning step. Without them you would pay a third more per token than 001 and get worse retrieval.
This matters because most WordPress chatbot plugins, MxChat included, send the raw chunk text to whichever embedding model you pick. A plugin that adds Gemini Embedding 2 as a dropdown option without also adding the prefixes would give its users the worst of the six results at the highest price.
Smaller vectors and smaller chunks
Gemini Embedding 2 and text-embedding-3-large both produce 3,072 numbers per chunk by default, and both are trained so that you can keep only the first part of the vector. We tested that by cutting the stored vectors down and renormalising them, without calling the API again.
| Setup | Dimensions kept | First (of 40) | Top 5 (of 40) |
|---|---|---|---|
| Gemini Embedding 2 with prefixes | 3,072 | 23 | 31 |
| Gemini Embedding 2 with prefixes | 1,536 | 23 | 30 |
| Gemini Embedding 2 with prefixes | 768 | 24 | 30 |
| text-embedding-3-large | 3,072 | 16 | 28 |
| text-embedding-3-large | 1,536 | 16 | 28 |
Keeping a quarter of Gemini Embedding 2’s vector lost one question from the top five and gained one at the top. Storage, not price, is where dimensions cost you. If your vectors live in the WordPress database rather than a vector service such as Pinecone, the size adds up quickly: on our install a stored 1,536-dimension vector averaged about 107 KB of text, so 1,615 chunks come to roughly 170 MB of table data. Fewer dimensions shrink that in proportion.
We then re-ran three of the setups with chunks of 1,000 characters, MxChat’s minimum, which turned the same site into 6,296 chunks.
| Setup | 4,000-character chunks: first / top 5 | 1,000-character chunks: first / top 5 | Tokens at 1,000 characters |
|---|---|---|---|
| text-embedding-3-small | 19 / 25 | 20 / 30 | 1,090,468 |
| gemini-embedding-001 | 21 / 28 | 22 / 29 | About the same as at 4,000 |
| Gemini Embedding 2 with prefixes | 23 / 31 | 22 / 33 | 1,234,220 |
Smaller chunks helped every model on the documentation questions, and they helped the cheapest model most: text-embedding-3-small went from 25 to 30 in the top five, overtaking 3-large at 4,000 characters, at the same token count and no extra cost. The trade is four times as many stored vectors. Embedding 2 with prefixes used 6% more tokens at the smaller size, because the title prefix is repeated on four times as many chunks.
Speed and rate limits
All four models were fast enough that speed should not decide anything. The median time to embed one visitor question, including the round trip from our US server, was 0.17 to 0.18 seconds on gemini-embedding-001, 0.19 s on text-embedding-3-small, 0.20 s on Gemini Embedding 2 and 0.21 s on 3-large. The slowest single call was a 3.03-second outlier on 3-large.
Bulk importing was different. OpenAI took the whole site in 17 requests of 96 chunks each without a single refusal, in 11 seconds of API time for 3-small. Google’s batch endpoint returned HTTP 429 “You exceeded your current quota” on five of our six full Gemini passes over the site, two to six times per pass on our paid key, and each pass succeeded after waiting 5 to 15 seconds and retrying. A plugin that imports one page at a time will rarely hit this. A bulk import script without retries will.
Which embedding model to use for a WordPress chatbot
- If you are on text-embedding-3-small, stay there and look at your chunk size first. It is the cheapest model by a factor of 6.5 or more, it was six questions short of the best setup on the top five, and smaller chunks closed most of that gap for nothing.
- If you want the best retrieval and your plugin sends Google’s prefixes, Gemini Embedding 2 is worth its price. The cost difference is cents per full index. Use the Batch rate for the initial import if your tooling supports it, and consider 768 dimensions if vectors are stored in WordPress.
- If your plugin sends plain text, do not switch to Gemini Embedding 2. It ranked last in that form.
- If you are on gemini-embedding-001, there is no rush. It scored second, and its shutdown date is May 2028. When you do move, plan to re-embed everything, because the two models’ vectors cannot be mixed.
- text-embedding-3-large is hard to justify for a site this size. It cost 6.5 times as much as 3-small for a result that smaller chunks on 3-small matched.
Switching embedding model always means re-importing the whole knowledge base, because a question embedded with one model cannot be compared with chunks embedded by another. In MxChat the embedding model is chosen in the chatbot settings and the import tools are covered in the documentation; our guide to vector embeddings in a WordPress chatbot explains the retrieval side in more detail. If you are pricing the rest of the stack, our tests of Gemini 3.8 Flash and its January price rise, OpenAI prompt caching and the OpenAI Batch API cover the chat-model half of the bill. Paid plans are on the MxChat Pro page.
FAQ
How much does Gemini Embedding 2 cost?
$0.20 per million text tokens on the Gemini API’s paid tier, or $0.10 through the Batch API. Images are $0.45 per million tokens, audio $6.50 and video $12. Google’s free tier covers all of them, with your content used to improve Google’s products. There is no charge for output.
Is Gemini Embedding 2 better than OpenAI’s text-embedding-3-small?
In our test, only when used with Google’s documented prefixes. With prefixes it found the right page first for 23 of 40 questions against 19 for 3-small. Without them it found 11. It costs ten times as much per token.
Can I switch embedding models without re-importing my content?
No. Vectors from different models live in different spaces and cannot be compared, even between Google’s own gemini-embedding-001 and Gemini Embedding 2. Every chunk has to be embedded again with the new model.
When does gemini-embedding-001 shut down?
Google’s deprecations page gives 14 May 2028 as the earliest shutdown date, with Gemini Embedding 2 as the replacement. Its price is no longer shown on the Gemini API pricing page.
How many tokens is a WordPress site?
Our 495 pages, 5.25 million characters of text, came to 1,091,944 tokens on OpenAI’s count and 1,136,765 on Google’s: roughly 208 to 217 tokens per 1,000 characters of English.
Does the embedding model affect the cost of each chat reply?
Barely. Embedding a visitor’s question cost $0.0003 to $0.0044 per 1,000 questions in our test. The chat model’s reply costs hundreds of times more. The embedding model’s effect on cost is indirect: if it retrieves the wrong page, the answer is wrong whatever you paid for it.
Method: all published posts, pages and products on mxchat.ai (495 items, 5.25 million characters) split with MxChat’s chunker at 4,000 and 1,000 characters, embedded from the mxchat.ai server on 12 October 2026 through the OpenAI embeddings endpoint and the Gemini API’s batchEmbedContents. 40 hand-written questions, 22 with answers in one documentation chunk and 18 with answers in one blog post, each embedded singly with embedContent or the embeddings endpoint three times per setup (720 requests). Ranking by cosine similarity over every chunk. Token counts are as reported by each API; gemini-embedding-001 counts came from Google’s countTokens. Prices are list rates read from the vendors’ pricing pages the same day. Reduced-dimension results were computed by truncating and renormalising stored vectors, not by new API calls.