{"id":50348082,"url":"https://github.com/redredchen01/seoserper","last_synced_at":"2026-05-29T20:01:33.335Z","repository":{"id":352610970,"uuid":"1215864281","full_name":"redredchen01/seoserper","owner":"redredchen01","description":"Self-use Streamlit tool that analyzes Google + Bing SERP surfaces (Suggestions / PAA / Related Searches) via SerpAPI. 3-surface mode (key set) or Suggest-only (key unset). SQLite-backed history + compare view + MD/CSV export.","archived":false,"fork":false,"pushed_at":"2026-04-20T10:46:27.000Z","size":307,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-20T12:35:10.461Z","etag":null,"topics":["autocomplete","bing","google-serp","paa","python","seo","serpapi","sqlite","streamlit"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/redredchen01.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":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-20T10:26:54.000Z","updated_at":"2026-04-20T10:46:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/redredchen01/seoserper","commit_stats":null,"previous_names":["redredchen01/seoserper"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/redredchen01/seoserper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redredchen01%2Fseoserper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redredchen01%2Fseoserper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redredchen01%2Fseoserper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redredchen01%2Fseoserper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redredchen01","download_url":"https://codeload.github.com/redredchen01/seoserper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redredchen01%2Fseoserper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33668186,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"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":["autocomplete","bing","google-serp","paa","python","seo","serpapi","sqlite","streamlit"],"created_at":"2026-05-29T20:01:31.637Z","updated_at":"2026-05-29T20:01:33.326Z","avatar_url":"https://github.com/redredchen01.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SEOSERPER\n\n[![tests](https://github.com/redredchen01/seoserper/actions/workflows/test.yml/badge.svg)](https://github.com/redredchen01/seoserper/actions/workflows/test.yml)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)\n\nLocal-first Google + Bing SERP analyzer. Pulls **Autocomplete Suggestions**, **People Also Ask**, and **Related Searches** for any query, saves history to SQLite, exports Markdown or CSV.\n\nSolo-operator tool, self-use. No account, no cloud — bring your own SerpAPI key (optional, free tier works).\n\n## Modes\n\n| Mode | Trigger | Surfaces |\n|------|---------|----------|\n| **Full (Google)** | engine=Google + `SERPAPI_KEY` set | Suggestions (free) + PAA + Related (via SerpAPI) — 1 credit/submit |\n| **Suggest-only (Google)** | engine=Google + `SERPAPI_KEY` unset | Suggestions only — 0 credits |\n| **Bing** | engine=Bing + `SERPAPI_KEY` set | PAA + Related (via SerpAPI `engine=bing`) — 1 credit/submit. **No Suggest** — Bing has no public/free autocomplete endpoint. |\n\nSerpAPI free tier is ~100-250 searches/month (depends on your plan — check https://serpapi.com/manage-api-key). No credit card. **Google and Bing share the same quota pool.** See `seoserper/config.py` module docstring for the full setup + locale + quota details.\n\n**Note on Bing PAA**: Google returns PAA on ~80% of queries; Bing on ~20-40%. Don't be surprised when Bing's PAA surface is EMPTY — it's upstream behavior, not a tool error.\n\n## Quick start\n\n```bash\n# 1. Clone + deps (Python 3.10+ required)\npip install -e .\n\n# 2. Optional: configure SerpAPI for Full mode\ncp .env.example .env          # edit and paste your key\nexport $(grep -v '^#' .env | xargs)\n\n# 3. Run\nstreamlit run app.py\n```\n\nOpen http://localhost:8501. Pick a locale (English / 简体中文 / 繁體中文 / 日本語), submit a query.\n\n## Screenshots\n\n![SEOSERPER UI](docs/screenshot.png)\n\nThe default view shows Google + Bing side by side with `🟰` markers on items both engines returned, a quota progress bar at the top, and a filterable history sidebar.\n\n## Export formats\n\n| Format | Content |\n|--------|---------|\n| Markdown | H1 + frontmatter + sections — paste into Notion / 飞书 / VS Code |\n| CSV | Flat `surface,rank,text,answer_preview` rows — open in Excel / LibreOffice (UTF-8 BOM for zh/ja compat) |\n\n## Cache\n\nFull-mode responses are cached by `(query, lang, country)` for 24 hours. Repeat queries don't burn SerpAPI quota. Reset / prune:\n\n```bash\npython3 scripts/reset_serp_cache.py              # nuke all\npython3 scripts/reset_serp_cache.py --prune-only # drop only expired\n```\n\n## Tests\n\n```bash\npip install -e '.[dev]'\npytest tests/ -q\n```\n\n## Plans\n\nDesign history lives under `docs/plans/` — active plan is the highest-numbered `status: active` file. Completed plans stay for context.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredredchen01%2Fseoserper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fredredchen01%2Fseoserper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredredchen01%2Fseoserper/lists"}