geo-score-core
Score any web page for AI-search readiness — the same 7-factor engine behind marketanalyticx.com/tools/geo-lens, open-sourced.
As more discovery moves from ten blue links to a single AI-generated answer (ChatGPT, Perplexity, Google AI Overviews), pages need to be structured for extraction, not just ranking. geo-score-core gives you a repeatable, open scoring model for that — no API key, no black box.
pip install geo-score-core
geo-score https://example.com
GEO Score for https://example.com
============================================================
Overall: 71.5/100 (71.5%) Grade: B
Schema markup 13.0 / 20.0 (65.0%)
- Found 2 JSON-LD block(s): Organization, Article
- High-value types present: Article
Answer extractability 15.0 / 20.0 (75.0%)
- 3 question-style heading(s) found
- 8 concise (30-320 char) paragraph(s) in the first 10
...
The 7 factors
| Factor | Weight | What it checks |
|---|---|---|
| Schema markup | 20 | Valid JSON-LD, high-value types (FAQPage, HowTo, Article...) |
| Answer extractability | 20 | Question-style headings, concise self-contained paragraphs |
| Heading architecture | 15 | Single H1, no skipped levels, adequate structure |
| Chunk quality | 15 | Paragraph length distribution (ideal: 200–600 chars) |
| Entity clarity | 12 | Organization/Person schema, sameAs links, stable @id anchors |
| Technical directives | 10 | Meta robots, canonical tags, AI-bot friendliness signals |
| Freshness signals | 8 | datePublished / dateModified, recency |
Full breakdown and rationale for the weighting: marketanalyticx.com/tools/geo-lens.
Usage as a library
from geo_score_core import GEOScorer
scorer = GEOScorer()
result = scorer.score_url("https://example.com")
print(result.total_score, "/", result.max_score, result.grade)
for factor in result.factors:
print(factor.name, factor.score, factor.findings)
You can also score raw HTML you already have (e.g. from a crawl):
result = scorer.score_html(html_string, url="https://example.com")
Try it without installing anything
Hosted demo (Hugging Face Space): huggingface.co/spaces/Market-Analyticx/geo-score
Why we built this
We built the scoring engine to audit our own clients' pages for citation-readiness in ChatGPT, Perplexity, and Google AI Overviews. We're open-sourcing the core scoring logic because a shared, transparent standard for "AI-search readiness" is more useful to the ecosystem than a black-box audit tool — and because we'd rather be judged on the quality of the methodology in the open.
If you use this and find gaps in the scoring model, open an issue — we'd genuinely like to improve it.
Installation from source
git clone https://github.com/marketanalyticx-labs/geo-score-core
cd geo-score-core
pip install -e .
License
MIT — see LICENSE.
Built by Market Analyticx, a GEO/AEO marketing consultancy.
Metadata
Release files for geo-score-core 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| geo_score_core-0.1.3.tar.gz | 10.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| geo_score_core-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.0 kB
Release files / geo_score_core-0.1.3.tar.gz
| Download URL | geo_score_core-0.1.3.tar.gz |
|---|---|
| Size | 10.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
49bd925e19b5c541c0a3bc6d3f8b6c0ecfb80d048e7453c2a22c5ed7c823b9cb
|
|
BLAKE2b-256 checksum How to use checksums |
339cbb06a6471e7d51eed3a34f420a20eabe3eac0a670b2489fa5ebeadcf5965
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|
Release files / geo_score_core-0.1.3-py3-none-any.whl
| Download URL | geo_score_core-0.1.3-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c353a96fda1ed23285abb46e8ce2d4a5d3d7d35bc5f4cba661ae2982c287ee34
|
|
BLAKE2b-256 checksum How to use checksums |
7085e186c1f611335984b8a38fb2220899491ce4fdd70670685c2cdd555f82c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|