ehorses APIehorses.com ↗
Access ehorses.com horse listings, seller profiles, breed filters, and market stats via 6 structured API endpoints. Search, filter, and retrieve full listing details.
What is the ehorses API?
The ehorses.com API exposes 6 endpoints covering the full breadth of the world's largest horse marketplace — from paginated search results with breed, gender, color, and country filters to full listing details via get_horse_detail, including pedigree entries, images, and attributes. You can also pull seller profiles, a seller's active listings, available filter metadata, and live homepage statistics like total listings and horses sold today.
curl -X GET 'https://api.parse.bot/scraper/7c34dc91-e6dc-4111-9bd0-eb95278684f7/search_horses?page=1&sort=datum%2Bdesc&breed=94&color=15&query=dressage&age_to=30&gender=2&country=0&age_from=0&height_to=250&price_max=9999999&price_min=0&height_from=50' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ehorses-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""ehorses.com SDK — horse market search, detail, and seller profiles."""
from parse_apis.ehorses_api import Ehorses, Sort, Gender, NotFound
client = Ehorses()
# Search for mares sorted by newest, capped at 5 results
for horse in client.horses.search(gender=Gender.MARE, sort=Sort.NEWEST, limit=5):
print(horse.title, horse.price, horse.url)
# Drill into the first result for full details
horse = client.horses.search(sort=Sort.NEWEST, limit=1).first()
if horse:
detail = client.horsedetails.get(ad_id=horse.id)
print(detail.title, detail.price, detail.attributes)
# Fetch a seller profile and list their horses
try:
seller = client.sellers.get(username="gestuethillebrecht")
print(seller.name, seller.listing_count, seller.contact)
for h in seller.horses.list(limit=3):
print(h.title, h.price)
except NotFound as exc:
print(f"Seller not found: {exc}")
# Get available filter options (breeds, colors, genders)
filters = client.filteroptionses.get()
print(filters.breed[0].text, filters.breed[0].value)
# Get homepage statistics
stats = client.homepagestatses.get()
print(stats.total_listings, stats.new_today, stats.sold_today)
print("exercised: horses.search / horsedetails.get / sellers.get / seller.horses.list / filteroptionses.get / homepagestatses.get")
Search for horses on the ehorses.com marketplace. Returns paginated results with horse title, price, breed, URL, and listing details. Supports filtering by breed, gender, color, age, height, price, and country. Without filters returns the newest listings. Paginates via page number.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| sort | string | Sort order. Values: 'datum+desc' (newest first), 'preis+asc' (price ascending), 'preis+desc' (price descending). |
| breed | string | Breed ID from get_search_filters_metadata breed list. |
| color | string | Color ID from get_search_filters_metadata color list. |
| query | string | Keyword search term. |
| age_to | string | Maximum age in years. |
| gender | string | Gender ID: '3' for Mare, '2' for Stallion, '1' for Unknown, '4' for Gelding. |
| country | string | Country code as numeric ID from the site's country list. Use '0' for all countries. |
| age_from | string | Minimum age in years. |
| height_to | string | Maximum height in cm. |
| price_max | string | Maximum price. |
| price_min | string | Minimum price. |
| height_from | string | Minimum height in cm. |
{
"type": "object",
"fields": {
"page": "current page number (integer)",
"items": "array of horse listing summaries with id, title, url, price, location, breed, details",
"total": "total number of matching results (integer)"
},
"sample": {
"data": {
"page": 1,
"items": [
{
"id": "4853955",
"url": "https://www.ehorses.com/friesian-horses-stallion-5years-16-hh-carriagehorses-baroquehorses-leisurehorses-oosterzee/4853955.html",
"breed": "Friesian horses, Stallion, 5 years, 16 hh",
"price": "€10,000 to €15,000",
"title": "Friesian horses, Stallion, 5 years, 16 hh",
"details": [
"Friesian horses, Stallion, 5 years, 16 hh"
],
"location": null
}
],
"total": 17485
},
"status": "success"
}
}About the ehorses API
Search and Filter Horses
The search_horses endpoint accepts filters including breed (ID from get_search_filters_metadata), color, gender (e.g. '3' for Mare, '4' for Gelding), age_to, country (numeric country ID), and a free-text query. Results are paginated via the page parameter and sortable using sort values like datum+desc (newest first) or preis+asc (price ascending). Each result in the items array includes the listing id, title, url, price, location, breed, and summary details. The total field tells you the full result count across all pages.
Full Listing and Pedigree Details
get_horse_detail accepts a full listing url (preferred, taken directly from search_horses results) or a numeric ad_id. The response includes a complete attributes object covering Breed, Gender, Age, Height, Color, and Main discipline, plus an images array, a description text block, a seller object with name and profile URL, and a pedigree array where each entry carries a name and role. The URL form is preferred — ad_id-only lookup may not resolve correctly without the full slug.
Seller Profiles and Active Listings
get_seller_profile takes a seller username slug and returns the seller's display name, contact details as key-value pairs, a description, and listing_count. To enumerate their inventory, get_seller_horses accepts the same username along with an optional page parameter and returns an items array of that seller's active listings with id, title, url, breed, and price, plus the internal owner_id.
Filter Metadata and Market Statistics
get_search_filters_metadata requires no inputs and returns the full enumerated lists for breed, color, and gender — each as an array of {value, text} pairs — so you can map human-readable names to the IDs that search_horses expects. get_homepage_stats returns three integers scraped from the ehorses.com homepage: total_listings, new_today, and sold_today, useful for monitoring market activity over time.
The ehorses API is a managed, monitored endpoint for ehorses.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ehorses.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ehorses.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a horse price tracker by querying
search_horseswith breed and country filters and recordingpriceover time. - Aggregate pedigree data across listings using
get_horse_detail'spedigreearray to map bloodline relationships. - Monitor a specific breeder's inventory by polling
get_seller_horseswith theirusernameand tracking new listings. - Populate a breed-selector UI using the
breedarray fromget_search_filters_metadatato map display names to filter IDs. - Track daily market activity by logging
new_todayandsold_todayfromget_homepage_statsat regular intervals. - Compare asking prices across genders and disciplines by combining
gender,breed, andsortparameters insearch_horses. - Display seller contact details and listing counts on a directory page using
get_seller_profiledata.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ehorses.com have an official developer API?+
What does `get_horse_detail` return beyond basic listing info?+
get_horse_detail returns a full attributes object (Breed, Gender, Age, Height, Color, Main discipline), an images array of URLs, a pedigree array with each ancestor's name and role, a description text block, and a seller object containing the seller's name and profile URL. Always pass the full listing url from search_horses results rather than just ad_id, since slug-only lookups can fail to resolve.How do I get the correct IDs for breed, color, and gender filters in `search_horses`?+
get_search_filters_metadata first. It returns three arrays — breed, color, and gender — each containing {value, text} objects. The value field is the ID you pass to search_horses. For gender, the fixed values are: '3' Mare, '2' Stallion, '4' Gelding, '1' Unknown.Does the API return contact details like phone numbers or email addresses for sellers?+
get_seller_profile endpoint returns a contact object with whatever contact details appear publicly on the seller's profile page. Private contact information (e.g. phone numbers visible only after login) is not exposed. You can fork this API on Parse and revise it to add any additional profile fields that become accessible.Can I retrieve sold or expired horse listings?+
search_horses and get_seller_horses, and the homepage stats include a sold_today count but no detail on individual sold listings. You can fork this API on Parse and revise it to add an endpoint targeting sold listing data if that page structure is accessible.