{"id":21130393,"url":"https://github.com/serpapi/serpapi-rust","last_synced_at":"2025-10-08T06:09:53.931Z","repository":{"id":212964229,"uuid":"617200600","full_name":"serpapi/serpapi-rust","owner":"serpapi","description":"Scrape any major search engine from our easy, fast, scalable and feature rich API powered by SerpApi","archived":false,"fork":false,"pushed_at":"2024-04-29T12:59:22.000Z","size":61,"stargazers_count":6,"open_issues_count":1,"forks_count":2,"subscribers_count":7,"default_branch":"dev","last_synced_at":"2025-10-01T08:50:55.753Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/serpapi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-03-21T22:27:41.000Z","updated_at":"2025-09-20T18:15:36.000Z","dependencies_parsed_at":"2025-06-04T03:09:45.228Z","dependency_job_id":"03ecdaf2-8d27-46b5-b2de-9f3f57f6e38c","html_url":"https://github.com/serpapi/serpapi-rust","commit_stats":null,"previous_names":["serpapi/serpapi-rust"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/serpapi/serpapi-rust","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serpapi%2Fserpapi-rust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serpapi%2Fserpapi-rust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serpapi%2Fserpapi-rust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serpapi%2Fserpapi-rust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/serpapi","download_url":"https://codeload.github.com/serpapi/serpapi-rust/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serpapi%2Fserpapi-rust/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278897936,"owners_count":26064903,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-20T05:32:52.813Z","updated_at":"2025-10-08T06:09:53.906Z","avatar_url":"https://github.com/serpapi.png","language":"Rust","readme":"\n# SerpApi Search in Rust\n[![serpapi-rust](https://github.com/serpapi/serpapi-rust/actions/workflows/ci.yml/badge.svg)](https://github.com/serpapi/serpapi-rust/actions/workflows/ci.yml) [![serpapi-rust](https://img.shields.io/crates/v/serpapi.svg)](https://crates.io/crates/serpapi)\n\nThis Rust package enables to scrape and parse search results from Google, Bing, Baidu, Yandex, Yahoo, Ebay, Apple, Youtube, Naver, Home depot and more. It's powered by [SerpApi](https://serpapi.com) which delivered a consistent JSON format accross search engines.\nSerpApi.com enables to do localized search, leverage advanced search engine features and a lot more...\nA completed documentation is available at [SerpApi](https://serpapi.com).\n\n## Installation\n\nTo install in your rust application, update Cargo.toml\n```sh\nserpapi=\"1.0.0\"\n```\n\n## Usage\n\nLet's start by searching for Coffee on Google:\n\n```rust\n// search example for google\n//\nuse serpapi::serpapi::Client;\nuse std::collections::HashMap;\nuse std::env;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    // Read your private API Key from an environment variable.\n    // Copy/paste from [https://serpapi.com/dashboard] to your shell:\n    // ```bash\n    // export API_key=\"paste_your_private_api_key\"\n    // ```\n    let api_key = match env::var_os(\"API_KEY\") {\n        Some(v) =\u003e v.into_string().unwrap(),\n        None =\u003e panic!(\"$API_KEY environment variable is not set!\"),\n    };\n\n    println!(\"let's initiliaze the client to search on google\");\n    let mut default = HashMap::new();\n    default.insert(\"api_key\".to_string(), api_key);\n    default.insert(\"engine\".to_string(), \"google\".to_string());\n    // initialize the search engine\n    let client = Client::new(default);\n\n    // let's search for coffee in Austin, TX\n    let mut parameter = HashMap::new();\n    parameter.insert(\"q\".to_string(), \"coffee\".to_string());\n    parameter.insert(\"engine\".to_string(), \"google\".to_string());\n    // copy search parameter for the html search\n    let mut html_parameter = HashMap::new();\n    html_parameter.clone_from(\u0026parameter);\n\n    // search returns a JSON as serde_json::Value which can be accessed like a HashMap.\n    println!(\"waiting...\");\n    let results = client.search(parameter).await?;\n    let organic_results = results[\"organic_results\"].as_array().unwrap();\n    println!(\"results received\");\n    println!(\"--- JSON ---\");\n    let status = \u0026results[\"search_metadata\"][\"status\"];\n    if status != \"Success\" {\n        println!(\"search failed with status: {}\", status);\n    } else {\n        println!(\"search is successfull\");\n\n        println!(\" - number of organic_results: {}\", organic_results.len());\n        println!(\n            \" - organic_results first result description: {}\",\n            results[\"organic_results\"][0]\n        );\n\n        // search returns text\n        println!(\"--- HTML search ---\");\n        let raw = client.html(html_parameter).await.expect(\"html content\");\n        println!(\" - raw HTML size {} bytes\\n\", raw.len());\n        println!(\n            \" - async search completed with {}\\n\",\n            results[\"search_parameters\"][\"engine\"]\n        );\n    }\n\n    print!(\"ok\");\n    Ok(())\n}\n```\n\n[Google search documentation](https://serpapi.com/search-api).\nMore hands on examples are available below.\n\n#### Documentations\n\n * [Full documentation on SerpApi.com](https://serpapi.com)\n * [API health status](https://serpapi.com/status)\n\nFor more information how to build a paramaters HashMap see [serpapi.com documentation](https://serpapi.com/search-api)\n\n### Location API\n\n```rust\nlet default = HashMap::\u003cString, String\u003e::new();\nlet client = Client::new(default);\nlet mut parameter = HashMap::\u003cString, String\u003e::new();\nparameter.insert(\"q\".to_string(), \"Austin\".to_string());\nlet data = client.location(parameter).await.expect(\"request\");\nlet locations = data.as_array().unwrap();\n```\n\nIt returns the first 3 locations matching Austin (Texas, Texas, Rochester)\n\n\n### Search Archive API\n\n```rust\nlet mut default = HashMap::\u003cString, String\u003e::new();\ndefault.insert(\"engine\".to_string(), \"google\".to_string());\ndefault.insert(\"api_key\".to_string(), \"your_secret_key\".to_string());\nlet client = Client::new(default);\n\n// initialize the search engine\nlet mut parameter = HashMap::\u003cString, String\u003e::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\nparameter.insert(\n    \"location\".to_string(),\n    \"Austin, TX, Texas, United States\".to_string(),\n);\nlet initial_results = client.search(parameter).await.expect(\"request\");\nlet mut id = initial_results[\"search_metadata\"][\"id\"].to_string();\n// remove extra quote \" from string convertion\nid = id.replace(\"\\\"\", \"\");\n\nprintln!(\"{}\", initial_results[\"search_metadata\"]);\nassert_ne!(id, \"\");\n\n// search in archive\nlet archived_results = client.search_archive(\u0026id).await.expect(\"request\");\nlet archive_id = archived_results[\"search_metadata\"][\"id\"].as_str();\nlet search_id = initial_results[\"search_metadata\"][\"id\"].as_str();\nprintln!(\"{}\", archived_results);\nassert_eq!(archive_id, search_id);\n```\n\n### Account API\n```rust\nlet client = Client::new(HashMap::\u003cString, String\u003e::new());\nlet mut parameter = HashMap::\u003cString, String\u003e::new();\nparameter.insert(\"api_key\".to_string(), \"your_secret_key\".to_string());\nlet account = client.account(parameter).await.expect(\"request\");\n```\n\nIt returns your account information.\n\n### Technical features\n- Dynamic JSON decoding using Serde JSON\n- Asyncronous HTTP request handle method using tokio and reqwest\n- Async tests using Tokio\n\n### References\n * https://www.lpalmieri.com/posts/how-to-write-a-rest-client-in-rust-with-reqwest-and-wiremock/\n *  Serdes JSON\n\n## Examples in rust\n\nTo run an example:\n```sh\ncargo build --example google_search\n```\nfile: (examples/google_search.rs)\n\nThe keyword google can be replaced by any supported search engine:\n- google\n- baidu\n- bing\n- duckduckgo\n- yahoo\n- yandex\n- ebay\n- youtube\n- walmart\n- home_depot\n- apple_app_store\n- naver\n\n### Search bing\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"bing\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/bing_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/bing_search.rs)\nsee: [https://serpapi.com/bing-search-api](https://serpapi.com/bing-search-api)\n\n### Search baidu\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"baidu\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/baidu_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/baidu_search.rs)\nsee: [https://serpapi.com/baidu-search-api](https://serpapi.com/baidu-search-api)\n\n### Search yahoo\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"yahoo\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"p\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/yahoo_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/yahoo_search.rs)\nsee: [https://serpapi.com/yahoo-search-api](https://serpapi.com/yahoo-search-api)\n\n### Search youtube\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"youtube\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"search_query\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet video_results = results[\"video_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of video_results: {}\", video_results.len());\n    println!(\n        \" - video_results first result description: {}\",\n        results[\"video_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/youtube_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/youtube_search.rs)\nsee: [https://serpapi.com/youtube-search-api](https://serpapi.com/youtube-search-api)\n\n### Search walmart\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"walmart\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"query\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/walmart_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/walmart_search.rs)\nsee: [https://serpapi.com/walmart-search-api](https://serpapi.com/walmart-search-api)\n\n### Search ebay\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"ebay\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"_nkw\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/ebay_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/ebay_search.rs)\nsee: [https://serpapi.com/ebay-search-api](https://serpapi.com/ebay-search-api)\n\n### Search naver\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"naver\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"query\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet ads_results = results[\"ads_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of ads_results: {}\", ads_results.len());\n    println!(\n        \" - ads_results first result description: {}\",\n        results[\"ads_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/naver_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/naver_search.rs)\nsee: [https://serpapi.com/naver-search-api](https://serpapi.com/naver-search-api)\n\n### Search home depot\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"home_depot\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"table\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet products = results[\"products\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of products: {}\", products.len());\n    println!(\n        \" - products first result description: {}\",\n        results[\"products\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/home_depot_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/home_depot_search.rs)\nsee: [https://serpapi.com/home-depot-search-api](https://serpapi.com/home-depot-search-api)\n\n### Search apple app store\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"apple_app_store\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"term\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/apple_app_store_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/apple_app_store_search.rs)\nsee: [https://serpapi.com/apple-app-store](https://serpapi.com/apple-app-store)\n\n### Search duckduckgo\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"duckduckgo\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/duckduckgo_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/duckduckgo_search.rs)\nsee: [https://serpapi.com/duckduckgo-search-api](https://serpapi.com/duckduckgo-search-api)\n\n### Search google\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\nparameter.insert(\"engine\".to_string(), \"google\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_search.rs)\nsee: [https://serpapi.com/search-api](https://serpapi.com/search-api)\n\n### Search google scholar\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_scholar\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_scholar_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_scholar_search.rs)\nsee: [https://serpapi.com/google-scholar-api](https://serpapi.com/google-scholar-api)\n\n### Search google autocomplete\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_autocomplete\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet suggestions = results[\"suggestions\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of suggestions: {}\", suggestions.len());\n    println!(\n        \" - suggestions first result description: {}\",\n        results[\"suggestions\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_autocomplete_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_autocomplete_search.rs)\nsee: [https://serpapi.com/google-autocomplete-api](https://serpapi.com/google-autocomplete-api)\n\n### Search google product\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_product\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\nparameter.insert(\"product_id\".to_string(), \"4887235756540435899\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet product_results = results[\"product_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of product_results: {}\", product_results.len());\n    println!(\n        \" - product_results first result description: {}\",\n        results[\"product_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_product_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_product_search.rs)\nsee: [https://serpapi.com/google-product-api](https://serpapi.com/google-product-api)\n\n### Search google reverse image\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_reverse_image\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"image_url\".to_string(), \"https://i.imgur.com/5bGzZi7.jpg\".to_string());\nparameter.insert(\"max_results\".to_string(), \"1\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet image_sizes = results[\"image_sizes\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of image_sizes: {}\", image_sizes.len());\n    println!(\n        \" - image_sizes first result description: {}\",\n        results[\"image_sizes\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_reverse_image_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_reverse_image_search.rs)\nsee: [https://serpapi.com/google-reverse-image](https://serpapi.com/google-reverse-image)\n\n### Search google events\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_events\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet events_results = results[\"events_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of events_results: {}\", events_results.len());\n    println!(\n        \" - events_results first result description: {}\",\n        results[\"events_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_events_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_events_search.rs)\nsee: [https://serpapi.com/google-events-api](https://serpapi.com/google-events-api)\n\n### Search google local services\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_local_services\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"electrician\".to_string());\nparameter.insert(\"data_cid\".to_string(), \"6745062158417646970\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet local_ads = results[\"local_ads\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of local_ads: {}\", local_ads.len());\n    println!(\n        \" - local_ads first result description: {}\",\n        results[\"local_ads\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_local_services_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_local_services_search.rs)\nsee: [https://serpapi.com/google-local-services-api](https://serpapi.com/google-local-services-api)\n\n### Search google maps\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_maps\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"pizza\".to_string());\nparameter.insert(\"ll\".to_string(), \"@40.7455096,-74.0083012,15.1z\".to_string());\nparameter.insert(\"type\".to_string(), \"search\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet local_results = results[\"local_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of local_results: {}\", local_results.len());\n    println!(\n        \" - local_results first result description: {}\",\n        results[\"local_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_maps_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_maps_search.rs)\nsee: [https://serpapi.com/google-maps-api](https://serpapi.com/google-maps-api)\n\n### Search google jobs\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_jobs\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet jobs_results = results[\"jobs_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of jobs_results: {}\", jobs_results.len());\n    println!(\n        \" - jobs_results first result description: {}\",\n        results[\"jobs_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_jobs_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_jobs_search.rs)\nsee: [https://serpapi.com/google-jobs-api](https://serpapi.com/google-jobs-api)\n\n### Search google play\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_play\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"q\".to_string(), \"kite\".to_string());\nparameter.insert(\"store\".to_string(), \"apps\".to_string());\nparameter.insert(\"max_results\".to_string(), \"2\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet organic_results = results[\"organic_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of organic_results: {}\", organic_results.len());\n    println!(\n        \" - organic_results first result description: {}\",\n        results[\"organic_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_play_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_play_search.rs)\nsee: [https://serpapi.com/google-play-api](https://serpapi.com/google-play-api)\n\n### Search google images\n```rust\nlet mut default = HashMap::new();\ndefault.insert(\"api_key\".to_string(), \"your_secret_api_key\".to_string());\ndefault.insert(\"engine\".to_string(), \"google_images\".to_string());\n// initialize the search engine\nlet client = Client::new(default);\n\n// let's search for coffee in Austin, TX\nlet mut parameter = HashMap::new();\nparameter.insert(\"engine\".to_string(), \"google_images\".to_string());\nparameter.insert(\"tbm\".to_string(), \"isch\".to_string());\nparameter.insert(\"q\".to_string(), \"coffee\".to_string());\n// copy search parameter for the html search\nlet mut html_parameter = HashMap::new();\nhtml_parameter.clone_from(\u0026parameter);\n\n// search returns a JSON as serde_json::Value which can be accessed like a HashMap.\nprintln!(\"waiting...\");\nlet results = client.search(parameter).await?;\nlet images_results = results[\"images_results\"].as_array().unwrap();\nprintln!(\"results received\");\nprintln!(\"--- JSON ---\");\nlet status = \u0026results[\"search_metadata\"][\"status\"];\nif status != \"Success\" {\n    println!(\"search failed with status: {}\", status);\n} else {\n    println!(\"search is successfull\");\n\n    println!(\" - number of images_results: {}\", images_results.len());\n    println!(\n        \" - images_results first result description: {}\",\n        results[\"images_results\"][0]\n    );\n\n    // search returns text\n    println!(\"--- HTML search ---\");\n    println!(\" - raw HTML size {} bytes\\n\", raw.len());\n    println!(\n        \" - async search completed with {}\\n\",\n        results[\"search_parameters\"][\"engine\"]\n    );\n}\n\nprint!(\"ok\");\nOk(())\n\n```\n\n * source code: [examples/google_images_search.rs](https://github.com/serpapi/serpapi-rust/blob/master/examples/google_images_search.rs)\nsee: [https://serpapi.com/images-results](https://serpapi.com/images-results)\n\n## License\n\nMIT License\n\n## Continuous integration\nWe love \"true open source\" and \"continuous integration\", and Test Drive Development (TDD).\n We are using RSpec to test [our infrastructure around the clock]) using Github Action to achieve the best QoS (Quality Of Service).\n\nThe directory spec/ includes specification which serves the dual purposes of examples and functional tests.\n\nSet your secret API key in your shell before running a test.\n```bash\nexport API_KEY=\"your_secret_key\"\ncargo test\n```\n\nContributions are welcome. Feel to submit a pull request!\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserpapi%2Fserpapi-rust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserpapi%2Fserpapi-rust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserpapi%2Fserpapi-rust/lists"}