DUB APIdub.de ↗
Search and retrieve company-for-sale listings from DUB.de. Filter by sector, location, revenue, margin, and more. Returns financials, descriptions, and deal data.
What is the DUB API?
The DUB.de API provides 2 endpoints to search and retrieve company acquisition listings from Germany's DUB.de business marketplace. The search_listings endpoint returns paginated summaries across up to 12 listings per page, filterable by sector, location, revenue range, and profit margin. The get_listing endpoint returns the full public exposé for a single company, including structured financials, employee count, sector, and narrative sections.
curl -X GET 'https://api.parse.bot/scraper/c80bf8a4-aed5-4a0f-ac36-c1c16b510d38/search_listings?query=Software' \ -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 dub-de-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.
"""Walkthrough: DUB.de Unternehmensbörse SDK — search listings and drill into details."""
from parse_apis.dub_de_api import DubDe, Sector, ListingNotFound
client = DubDe()
# Search for tech-sector listings with at least €500k revenue, capped at 5 results.
for summary in client.listing_summaries.search(
sectors=Sector.ONLINE_TECH,
revenue_min=500_000,
limit=5,
):
print(summary.title, summary.location, summary.revenue_eur)
# Drill down: take the first software-related listing and fetch its full exposé.
hit = client.listing_summaries.search(query="Software", limit=1).first()
if hit is not None:
listing = hit.details()
print(listing.title, listing.sector, listing.share_offered)
print("Employees:", listing.employees)
# Show narrative sections the seller filled in.
for section in listing.sections:
print(f" [{section.key}] {section.heading}")
# Show historical/projected financials.
for fin in listing.financials:
label = "projected" if fin.projection else "actual"
print(f" {fin.year} ({label}): revenue €{fin.revenue_eur}, earnings €{fin.earnings_eur}")
# Point lookup by a known listing_id discovered from the search above.
if hit is not None:
try:
detail = client.listings.get(listing_id=hit.listing_id)
print(detail.title, detail.url)
except ListingNotFound:
print("Listing no longer available")
print("exercised: listing_summaries.search / details / listings.get")
Searches the DUB.de marketplace of companies for sale. Returns one page of up to 12 listing summaries (title, location, revenue, earnings, headcount, teaser description) ordered newest first, plus total_pages and has_more. All filters are optional and combine (AND across filters; multiple values within sectors/locations/share_types/sale_reasons are OR). Pagination is caller-driven via page (1-based, 12 listings per page); page beyond the last returns an empty list. If the keyword matches no listing, listings is empty with total_pages 0 (the site's unrelated suggestions are not returned). Monetary values are integers in EUR as displayed by the site; null means the seller gave no figure. One request per call.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page; 12 listings per page. |
| query | string | Free-text keyword matched against listing titles and descriptions. Omitted = all listings. |
| sectors | string | Comma-separated sector codes from the Sector enum, e.g. online_tech,services. Unknown codes are rejected. |
| locations | string | Comma-separated location codes: a lowercase ISO country code for a whole country (e.g. de, at, ch) or country-region for one state/region (e.g. de-by for Bayern, de-nw for Nordrhein-Westfalen, at-9 for Wien). Region codes follow the site's location picker; unknown codes simply match nothing. |
| margin_max | integer | Maximum profit margin in percent. |
| margin_min | integer | Minimum profit margin in percent. |
| revenue_max | integer | Maximum annual revenue in EUR. |
| revenue_min | integer | Minimum annual revenue in EUR. |
| share_types | string | Comma-separated share-offered codes from the ShareType enum. |
| earnings_max | integer | Maximum annual earnings (Ergebnis) in EUR. |
| earnings_min | integer | Minimum annual earnings (Ergebnis) in EUR. |
| sale_reasons | string | Comma-separated transaction-background codes from the SaleReason enum. |
| activation_to | string | Latest listing activation date, ISO YYYY-MM-DD. |
| employees_max | integer | Maximum number of employees. |
| employees_min | integer | Minimum number of employees. |
| activation_from | string | Earliest listing activation date, ISO YYYY-MM-DD. |
{
"type": "object",
"fields": {
"page": "integer, the page returned",
"has_more": "boolean, true when a later page exists",
"listings": "array of listing summaries: listing_id (UUID, input for get_listing), slug, title, location (German state/country label), description (teaser), revenue_eur, earnings_eur, employees (integers or null when not stated), url",
"total_pages": "integer, number of pages for this filter set as reported by the site (0 when nothing matches)"
},
"sample": {
"data": {
"page": 1,
"has_more": true,
"listings": [
{
"url": "https://www.dub.de/de/unternehmen-kaufen/expose/profitables-softwarehaus-mit-skalierbarer-technologieplattform/",
"slug": "profitables-softwarehaus-mit-skalierbarer-technologieplattform",
"title": "Profitables Softwarehaus mit skalierbarer Technologieplattform",
"location": "Nordrhein-Westfalen",
"employees": 17,
"listing_id": "6eccafbd-818b-4406-9db2-621d9a08d0a6",
"description": "Zum Verkauf steht ein wachstumsstarkes, inhabergeführtes Softwareunternehmen ...",
"revenue_eur": 4000000,
"earnings_eur": 1028000
}
],
"total_pages": 28
},
"status": "success"
}
}About the DUB API
Search Company Listings
The search_listings endpoint queries the DUB.de marketplace for companies offered for sale. Results are ordered newest first and paginated at 12 per page. The page parameter controls which page is returned, and total_pages plus has_more in the response let you walk through all results. Filters can be combined: query matches free text against titles and descriptions; sectors accepts comma-separated sector codes (e.g. online_tech,services); locations accepts ISO country codes (de, at, ch) or country-region codes. Financial filters — revenue_min, revenue_max, margin_min, margin_max — are all in EUR and percent respectively. Each listing summary in the listings array includes a listing_id UUID, slug, title, location, and a teaser description.
Retrieve a Full Listing Exposé
Passing a listing_id from search results to get_listing returns the complete public record for that company. The response includes structured financials (an array of {year, revenue_eur, earnings_eur, projection} objects), employees (integer or null), sector and location labels in German, and a description field. The sections array holds narrative content such as products and services, customer profile, and market positioning — each section has a key, heading, and text. Fields are null or empty when the seller has not disclosed them.
Coverage and Data Shape
Listings originate from DUB.de's German-language marketplace. Sector labels and location labels are returned in German as shown on the site. Financial figures are denominated in EUR. The financials array may contain multiple years and can flag projections via the projection boolean. If a seller has not disclosed revenue, earnings, or headcount, those fields are null rather than omitted.
The DUB API is a managed, monitored endpoint for dub.de — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when dub.de 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 dub.de 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 deal-flow feed that surfaces new company listings in a target sector using
sectorsandrevenue_minfilters. - Aggregate financial profiles (revenue, earnings, margins) across a filtered set of listings for acquisition analysis.
- Monitor DUB.de for new listings in specific German states or countries by combining
locationsandpagepagination. - Enrich an M&A pipeline database with full exposé data — description, employees, financials — via
get_listing. - Screen listings by profit margin range using
margin_minandmargin_maxto find businesses meeting a return threshold. - Power a deal alert system that pages through
total_pagesnightly and flags listings with newly disclosed revenue figures.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does DUB.de offer an official developer API?+
What financial data does `get_listing` return, and how reliable is it?+
get_listing returns a financials array where each entry contains year, revenue_eur, earnings_eur, and a projection flag. These figures are sourced from the seller's public exposé. When a seller has not disclosed a figure, the field is null. The API does not verify or validate the numbers — they reflect what the seller has published.How does pagination work in `search_listings`?+
total_pages (total page count for the current filter set) and has_more (true if a later page exists). Use the page parameter — 1-based — to iterate. If no listings match the filters, total_pages returns 0.Are seller contact details or private due-diligence documents included?+
Can I filter listings by asking price or deal structure?+
revenue_min/revenue_max), margin range (margin_min/margin_max), sector, location, and free-text query. Asking price and deal structure (e.g. asset deal vs. share deal) are not available as filter parameters. You can fork this API on Parse and revise it to add those filters if the relevant data is publicly accessible on DUB.de.