Integrate search data into your AI workflow, RAG, fine-tuning, or Ruby application using this official SerpApi Ruby SDK. SerpApi supports Google, Google Maps, Google Shopping, Baidu, Yandex, Yahoo, eBay, App Stores, and many more.
Ruby 2.7 or later is required.
Install the SDK directly with RubyGems:
gem install serpapiOr add it to your application's Gemfile:
gem "serpapi"Then install it with Bundler:
bundle installCreate a SerpApi account to get your API key, then store it in an environment variable:
export SERPAPI_KEY="your_api_key"Run a Google search and access the results as a Ruby Hash:
require "serpapi"
require "pp"
client = SerpApi::Client.new(
engine: "google",
api_key: ENV.fetch("SERPAPI_KEY")
)
results = client.search(q: "coffee")
pp results[:organic_results]
client.close- Asynchronous searches for submitting non-blocking jobs and retrieving completed results from the Search Archive API.
- Persistent connections and connection pooling for reusing HTTP connections across searches.
- JSON responses as Ruby hashes with
search, or raw search-engine HTML withhtml. - SDK methods for the Location API, Search Archive API, and Account API.
- Configurable HTTP timeouts and symbolized or string JSON keys.
Set defaults when creating a client, then override search parameters in individual calls:
client = SerpApi::Client.new(
api_key: ENV.fetch("SERPAPI_KEY"),
engine: "google",
hl: "en",
gl: "us",
persistent: true,
timeout: 120
)
results = client.search(
q: "coffee",
gl: "gb",
async: false,
symbolize_names: true
)| Option | Default | Description |
|---|---|---|
api_key |
None | Your SerpApi API key. Use an environment variable rather than committing it to source control. |
engine |
None | The search engine used by default, such as google or google_maps. |
persistent |
true |
Reuses the HTTP connection between requests. Call client.close when finished. |
timeout |
120 |
Timeout in seconds for non-persistent HTTP requests. |
async |
false |
Submits searches without waiting for them to complete. It can be set on the client or per search. |
symbolize_names |
true |
Returns JSON object keys as symbols. Pass false to a search to receive string keys. |
Search-engine-specific parameters can also be supplied when creating the client or calling search. Parameters passed to search override client defaults.
Search API features non-blocking search using the option: async=true.
- Non-blocking - async=true - a single parent process can handle unlimited concurrent searches.
- Blocking - async=false - many processes must be forked and synchronized to handle concurrent searches. This strategy is I/O usage because each client would hold a network connection.
Search API enables async search.
- Non-blocking (
async=true) : the development is more complex, but this allows handling many simultaneous connections. - Blocking (
async=false) : it is easy to write the code but more compute-intensive when the parent process needs to hold many connections.
Here is an example of asynchronous searches using Ruby
require 'serpapi'
company_list = %w[meta amazon apple netflix google]
client = SerpApi::Client.new(engine: 'google', async: true, persistent: true, api_key: ENV['SERPAPI_KEY'])
schedule_search = Queue.new
result = nil
company_list.each do |company|
result = client.search(q: company)
puts "#{company}: search results found in cache for: #{company}" if result[:search_metadata][:status] =~ /Cached/
schedule_search.push(result[:search_metadata][:id])
end
puts "Last search submited at: #{result[:search_metadata][:created_at]}"
puts 'wait 10s for all requests to be completed '
sleep(10)
puts 'wait until all searches are cached or success'
until schedule_search.empty?
search_id = schedule_search.pop
search_archived = client.search_archive(search_id)
company = search_archived[:search_parameters][:q]
if search_archived[:search_metadata][:status] =~ /Cached|Success/
puts "#{search_archived[:search_parameters][:q]}: search results found in archive for: #{company}"
next
end
schedule_search.push(search_id)
end
schedule_search.close
puts 'done'- source code: demo/demo_async.rb
This code shows a simple solution to batch searches asynchronously into a queue. Each search may take up to few seconds to complete. By the time the first element pops out of the queue, the search results might already be available in the archive. If not, the search_archive method blocks until the search results are available.
Here are some examples for some of our most popular APIs. You can find the full list of supported engines and parameters in our documentation.
Scrape Google Shopping results with product names, prices, ratings, and merchant information.
require 'serpapi'
client = SerpApi::Client.new(engine: 'google_shopping', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'Macbook M4')
pp results[:shopping_results]Google Shopping Light
A light variant engine called google_shopping_light is also available for faster, lower-cost shopping searches.
Scrape Google Images search results, including image URLs, thumbnails, titles, and source pages.
require 'serpapi'
client = SerpApi::Client.new(engine: 'google_images', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'coffee')
pp results[:images_results]Google Images Light
A light variant engine called google_images_light is also available for faster, lower-cost image searches.
Track search interest over time and compare the popularity of search terms.
require 'serpapi'
client = SerpApi::Client.new(engine: 'google_trends', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'coffee', data_type: 'TIMESERIES')
pp results[:interest_over_time]Search flight routes, schedules, prices, and booking options.
Note: The
google_flightsengine does not useq. Specify route and date parameters such asdeparture_id,arrival_id,outbound_date, andreturn_date.
require 'date'
require 'serpapi'
outbound_date = (Date.today + 30).iso8601
return_date = (Date.today + 37).iso8601
client = SerpApi::Client.new(engine: 'google_flights', api_key: ENV['SERPAPI_KEY'])
results = client.search(
departure_id: 'LAX',
arrival_id: 'AUS',
outbound_date: outbound_date,
return_date: return_date
)
flights = results[:best_flights] || results[:other_flights]
pp flightsThe Google AI Mode API returns AI-generated answers with structured text blocks, references, images, products, and more.
require 'serpapi'
client = SerpApi::Client.new(engine: 'google_ai_mode', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'best coffee maker')
pp results[:reconstructed_markdown]Scrape Bing web search results, including organic results, ads, related searches, and more.
require 'serpapi'
client = SerpApi::Client.new(engine: 'bing', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'coffee')
pp results[:organic_results]Scrape DuckDuckGo search results, including organic results, ads, knowledge graphs, and related searches.
require 'serpapi'
client = SerpApi::Client.new(engine: 'duckduckgo', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'coffee')
pp results[:organic_results]Scrape Baidu search results, including organic results, answer boxes, and related searches.
require 'serpapi'
client = SerpApi::Client.new(engine: 'baidu', api_key: ENV['SERPAPI_KEY'])
results = client.search(q: 'coffee')
pp results[:organic_results]Scrape Amazon product search results, including product names, prices, ratings, reviews, and availability.
Note: The
amazonengine uses thekparameter for a keyword search, notq.
require 'serpapi'
client = SerpApi::Client.new(engine: 'amazon', api_key: ENV['SERPAPI_KEY'])
results = client.search(k: 'coffee')
pp results[:organic_results]SerpApi supports Google Search, Google Maps, Google Shopping, Baidu, Yandex, Yahoo, eBay, Apple App Store, and many other APIs. Browse the SerpApi documentation to find supported APIs and parameters, or use the Playground to build a request and generate Ruby code.
Additional SDK resources:
| Metric | Ruby 2.7.8 | Ruby 3.4.4 | Ruby 4.0.0 | Improvement (3.4.4 vs 2.7.8) | Improvement (4.0.0 vs 3.4.4) |
|---|---|---|---|---|---|
| SerpApi Non-Persistent | 100.93 req/s | 114.97 req/s | 120.09 req/s | +13.9% | +4.5% |
| SerpApi Persistent | 226.82 req/s | 255.07 req/s | 296.05 req/s | +12.4% | +16.1% |
| HTTP.rb Non-Persistent | 270.62 req/s | 294.01 req/s | 319.81 req/s | +8.6% | +8.8% |
| HTTP.rb Persistent | 347.04 req/s | 570.95 req/s | 456.93 req/s | +64.5% | -20.0% |
- Upgrade to Ruby 3.4.4: Clear performance benefits across all scenarios
- Use Persistent Connections: 2x+ performance improvement in most cases
- HTTP.rb Performance: Particularly benefits from Ruby 3.4.4 with persistent connections
- SerpApi Optimization: Shows consistent ~2.2x improvement with persistent connections regardless of Ruby version
- Ruby 4.0.0 Performance: Shows mixed results with some regressions compared to 3.4.4, particularly for HTTP.rb persistent connections. Ruby 4.0.0 was just released for Christmas 2025, and HTTP.rb has not been optimized for it yet.
The older library (google-search-results-ruby) was performing at 55 req/s on Ruby 2.7.8, which is 2x slower than the current version (serpapi-ruby) on Ruby 3.4.4 or 4.0.0.
Context This benchmark was performed on warmup search results using a MacBook Pro 2025 connected via Wi-Fi 6.0 home network on AT&T fiber from Austin, TX (no network optimization).
Contributions are welcome. Make sure to read our contributing guide.
© 2026 SerpApi