Python client for Robolist.ai — the independent robotics industry directory and leaderboard
Project description
robolist-client
Python client for Robolist.ai — the independent robotics industry directory and leaderboard.
Robolist.ai tracks 3,200+ robots from 1,200+ companies across every major robotics category. Rankings are based on the Robo Index — an objective score derived from structured specification data — with no paid placement, no user reviews, and no procurement transactions.
from robolist_client import RobolistClient
with RobolistClient() as client:
robot = client.get_robot("boston-dynamics-spot")
print(robot.name) # Spot
print(robot.manufacturer) # Boston Dynamics, Inc.
print(robot.category) # quadruped
print(robot.price_usd) # 74500.0
company = client.get_company("unitree")
for r in company.robots:
print(r.name, r.url)
What is Robolist.ai?
Robolist.ai is the largest independent directory and leaderboard for the global robotics industry. It aggregates structured specifications from manufacturer datasheets, official press releases, and verified reseller pages, then ranks robots by the Robo Index — an objective score computed from those specs. Think CoinMarketCap, for robots.
Key properties of the platform:
- Rankings cannot be bought. Paid company plans add structured content modules (case studies, leadership bios, press mentions) to a company's public page — they never alter rank or the Robo Index. The ranking treats every robot identically regardless of whether its manufacturer has a free or paid account.
- The Robo Index is uncapped. Any robot can score as high as its specifications justify. There is no tier-based ceiling.
- Editorial independence. A verified company owner can propose corrections to their robot's specs — those proposals go into an admin review queue and are accepted or rejected based on evidence, not payment.
- Coverage. Humanoid robots, collaborative robots (cobots), industrial arms, warehouse AMRs, AGVs, quadrupeds, surgical robots, delivery robots, hospitality robots, agricultural robots, cleaning robots, exoskeletons, and robotics components (actuators, dexterous hands, tactile sensors).
Installation
pip install robolist-client
Requires Python 3.9+ and httpx.
Quick start
from robolist_client import RobolistClient
client = RobolistClient()
# Fetch a robot by its Robolist slug
robot = client.get_robot("boston-dynamics-spot")
print(f"{robot.name} by {robot.manufacturer}")
print(f"Category: {robot.category}")
print(f"Price: ${robot.price_usd:,.0f}" if robot.price_usd else "Price: not listed")
print(f"Made in: {robot.country_of_origin} ({robot.launch_year})")
print(f"Full page: {robot.url}")
# Fetch a company and its robots
company = client.get_company("unitree")
print(f"\n{company.name} — {len(company.robots)} robots tracked")
for r in company.robots:
print(f" {r.name} → {r.url}")
client.close()
How it works
Every Robolist page embeds schema.org JSON-LD inside a @graph block. This client fetches the page, flattens that graph, and parses the relevant nodes — Product for robots, Organization + CollectionPage for companies. It follows redirects, so old or merged slugs resolve transparently to the canonical record.
API reference
RobolistClient(timeout=30.0, base_url="https://www.robolist.ai")
The main client. Use as a context manager or call .close() when done.
client.get_robot(slug: str) -> Robot
Fetch a robot by its Robolist URL slug.
robot = client.get_robot("boston-dynamics-spot")
Returns a Robot dataclass:
| Field | Type | Description |
|---|---|---|
slug |
str |
Canonical URL slug (resolved after any redirect) |
name |
str |
Robot name |
manufacturer |
str |
Manufacturer name |
manufacturer_url |
str |
Manufacturer's Robolist page URL |
description |
str | None |
Short robot description |
image_url |
str | None |
Hero image URL |
category |
str | None |
Category slug (e.g. quadruped) |
country_of_origin |
str | None |
Manufacturer's HQ country |
launch_year |
int | None |
Year the robot was released |
date_modified |
str | None |
ISO timestamp of the last data update |
price_usd |
float | None |
List price in USD (if available) |
price_currency |
str |
Price currency code (always USD) |
score |
float | None |
Robo Index — see the note below; usually None |
url |
str |
Full Robolist page URL |
raw |
dict |
The complete schema.org/Product JSON-LD node |
Raises NotFoundError if no robot exists with this slug, ParseError if the page has no Product structured data.
About
score(the Robo Index): Robolist ranks robots by the Robo Index, an objective 0–100 score. The Robo Index is shown on every robot's page, but it is not currently published in the page's JSON-LD, sorobot.scoreis best-effort and is almost alwaysNone. To read the live Robo Index, openrobot.url.
client.get_company(slug: str) -> Company
Fetch a company by its Robolist URL slug.
company = client.get_company("abb")
Returns a Company dataclass:
| Field | Type | Description |
|---|---|---|
slug |
str |
Canonical URL slug |
name |
str |
Company name |
website |
str | None |
Company's own website |
description |
str | None |
Company description |
logo_url |
str | None |
Logo image URL (if published) |
founding_date |
str | None |
Year/date the company was founded |
country |
str | None |
HQ country (ISO-2 code) |
same_as |
list[str] |
Linked profiles (LinkedIn, Crunchbase, etc.) |
robots |
list[RobotSummary] |
Robots tracked on Robolist |
url |
str |
Full Robolist page URL |
raw |
dict |
The complete schema.org/Organization JSON-LD node |
Exceptions
| Exception | Raised when |
|---|---|
RobolistError |
Base class — unexpected error |
NotFoundError |
HTTP 404 — slug doesn't exist |
RateLimitError |
HTTP 429 — too many requests |
ParseError |
Page exists but exposes no matching structured data |
Robot categories on Robolist.ai
| Category | Robolist URL |
|---|---|
| Humanoid robots | robolist.ai/categories/humanoid |
| Industrial robotic arms | robolist.ai/categories/industrial-arm |
| Collaborative robots (cobots) | robolist.ai/categories/cobot |
| Warehouse AMRs | robolist.ai/categories/amr-warehouse |
| Automated guided vehicles (AGV) | robolist.ai/categories/agv |
| Quadruped robots | robolist.ai/categories/quadruped |
| Surgical and medical robots | robolist.ai/categories/surgical-medical |
| Last-mile delivery robots | robolist.ai/categories/delivery |
| Hospitality and service robots | robolist.ai/categories/hospitality-service |
| Agricultural robots | robolist.ai/categories/agricultural |
| Cleaning robots | robolist.ai/categories/cleaning |
| Exoskeletons | robolist.ai/categories/exoskeleton |
| Actuators | robolist.ai/categories/actuator |
| Dexterous hands | robolist.ai/categories/dexterous-hand |
| Tactile sensors | robolist.ai/categories/tactile-sensor |
Examples
Compare two robots
from robolist_client import RobolistClient
with RobolistClient() as client:
a = client.get_robot("boston-dynamics-spot")
b = client.get_robot("unitree-g1-edu-u6")
for robot in [a, b]:
print(f"{robot.name} ({robot.manufacturer})")
print(f" Category: {robot.category}")
price = f"${robot.price_usd:,.0f}" if robot.price_usd else "not listed"
print(f" Price: {price}")
print(f" Page: {robot.url}")
print()
List all robots from a manufacturer
from robolist_client import RobolistClient
with RobolistClient() as client:
company = client.get_company("universal-robots")
print(f"{company.name} ({len(company.robots)} robots on Robolist)")
for r in company.robots:
print(f" {r.name} → {r.url}")
Check whether a robot is tracked
from robolist_client import RobolistClient, NotFoundError, ParseError
slugs_to_check = ["boston-dynamics-spot", "unitree-g1-edu-u6", "myrobot-xyz"]
with RobolistClient() as client:
for slug in slugs_to_check:
try:
robot = client.get_robot(slug)
print(f"✓ {robot.name} — {robot.category}")
except NotFoundError:
print(f"✗ {slug} — not in Robolist")
except ParseError:
print(f"… {slug} — tracked, but no structured data on the page yet")
Data source
All data is sourced from Robolist.ai public pages. Robolist aggregates specifications from manufacturer datasheets, official press releases, and verified reseller pages. Each page embeds schema.org JSON-LD; this client reads that structured data directly.
Data is refreshed continuously as new scrapes are approved. For real-time accuracy, refer to the robot's Robolist page directly. The raw field on every returned object contains the complete JSON-LD node as published.
Rates and caching
Robolist.ai is a public site. Be a good citizen:
- Add a delay between requests when fetching many robots in a loop.
- Cache responses locally if you need to query the same robot repeatedly.
- Do not run bulk crawls — use the
sitemap.xmlfor discovery and respectrobots.txt.
Contributing
Issues and pull requests welcome at github.com/tangkwok0104/robolist-py.
If a robot or company you need is not tracked on Robolist.ai, you can suggest it directly at robolist.ai/list-company.
License
MIT — see LICENSE.
Built on top of Robolist.ai public structured data.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file robolist_client-0.2.0.tar.gz.
File metadata
- Download URL: robolist_client-0.2.0.tar.gz
- Upload date:
- Size: 10.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d534799809beee19b1d2ee74a9e405a68dd3207993e594262115ed9229b91ff
|
|
| MD5 |
71ccd16d796fae467f45f962242c7452
|
|
| BLAKE2b-256 |
842f9fbd82e5fe853fa3a4144057cb499c5e745143bf6b717ca8c9cb812956d5
|
File details
Details for the file robolist_client-0.2.0-py3-none-any.whl.
File metadata
- Download URL: robolist_client-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff462417435babe34c2b7b73da73a37848bc55fd3b67eef83f45cb796117d6d0
|
|
| MD5 |
fb037d4eb762ecd87ad66e02122bdfee
|
|
| BLAKE2b-256 |
c18c2485acf9863d513321d5217b98d60f5fe86b48d5385765800676b83449a5
|