Dwpv APIdwpv.com ↗
Search and filter Davies Ward Phillips & Vineberg lawyers and professionals via the dwpv.com Our People directory. Returns names, titles, offices, and practice areas.
What is the Dwpv API?
The dwpv.com API exposes a single search_people endpoint that returns structured records from the Davies Ward Phillips & Vineberg Our People directory, covering each professional's name, position, office locations, practice area expertise, law school, and year of call. Responses include up to 100 records per page and support an all mode that collapses the full filtered roster into one response, making bulk extraction straightforward without manual pagination.
curl -X GET 'https://api.parse.bot/scraper/52828a75-aee6-46e4-8618-c93135d36c28/search_people?all=true&office=Montr%C3%A9al&position=Lawyer' \ -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 dwpv-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.
"""Walkthrough: Davies Ward Phillips & Vineberg people directory — bounded, re-runnable."""
from parse_apis.dwpv_com_api import Davies, Sort, InputFormatInvalid
client = Davies()
# List Montréal partners sorted alphabetically, capped at 5.
for person in client.people.search(office="Montréal", position="Partner", sort=Sort.TITLE_ASCENDING, limit=5):
schools = ", ".join(person.law_schools) if person.law_schools else "n/a"
print(f"{person.name} — {person.position} | Schools: {schools}")
# Drill into the first tax-expertise associate to read their full bio.
try:
associate = client.people.search(expertise="Tax", position="Associate", limit=1).first()
except InputFormatInvalid as e:
print(f"Invalid input: {e.message}")
associate = None
if associate is not None:
areas = ", ".join(associate.expertise)
print(f"\n{associate.name} ({areas})")
print(f" Years of call: {associate.years_of_call}")
print(f" Bio: {associate.description or 'No description available'}")
print(f" Profile: {associate.profile_url}")
print("\nexercised: people.search (filtered list / drill-down)")
Returns professionals from the firm's Our People directory, one record per person, sorted by surname A-Z unless another sort is chosen. Filters mirror the directory's facets (position, office, expertise, law school, year of call) and a free-text keyword; a filter value that matches no facet member yields an empty result (total 0), never the unfiltered roster. Each record carries the person's display name, position title, office list, practice-area (expertise) list, law schools and years_of_call (the year(s) of bar admission shown as the directory's 'Year of Call' facet; the list is empty for people the directory does not tag with a year, e.g. students). By default results are paginated: page (1-based) and page_size (1-100, default 12) select a slice of the filtered roster and has_more reports whether later pages exist. When all=true the endpoint walks every page internally and returns the entire filtered roster in one response (page and page_size are ignored and echoed as null; has_more is false once the roster is complete). Cost: one directory request per 100 people plus a bounded set of additional lookups (batched, at most one per distinct year of call present in the filtered set) to attach years_of_call; supplying year_of_call skips those lookups. Invalid sort, page or page_size values return a stale_input error before any request is made.
| Param | Type | Description |
|---|---|---|
| all | boolean | When true, every page of the filtered roster is fetched internally and returned in a single response; page and page_size are ignored. |
| page | integer | 1-based page number of the filtered roster. Ignored when all=true. |
| sort | string | Result ordering, one of the directory's Sort By options. |
| query | string | Free-text keyword searched against the directory (name and biography). Omitted = no keyword filter. |
| office | string | Office facet label exactly as the directory spells it (with accents). Comma-separated values are OR-ed. Confirmed this run: Montréal, Toronto. Omitted = every office. |
| position | string | Position facet as labelled in the directory's Position filter. Comma-separated values are OR-ed (e.g. Partner,Counsel). Confirmed values this run: Lawyer (all lawyer positions), Partner. Other labels shown in the directory (Associate, Counsel, Student, Law Clerk / Paralegal, Other Professional, Affiliated Scholar) are forwarded as-is; an unknown label yields an empty result. |
| expertise | string | Practice-area (Expertise facet) label as shown in the directory, e.g. Tax. Comma-separated values are OR-ed. Omitted = every practice area. |
| page_size | integer | People per page, 1 to 100. Ignored when all=true. |
| law_school | string | Law School facet label as shown in the directory (e.g. McGill University). Comma-separated values are OR-ed. Omitted = no law-school filter. |
| year_of_call | string | Four-digit year of call (bar admission year) as listed in the directory's Year of Call facet, e.g. 2015. Comma-separated years are OR-ed. Omitted = every year. |
{
"type": "object",
"fields": {
"all": "boolean, echoes whether the full-roster mode was used",
"page": "integer page number, or null when all=true",
"items": "array of person records: id (directory item GUID), name, position (title string), offices (array of office names), expertise (array of practice-area names, de-duplicated), years_of_call (array of integer bar-admission years, empty when the directory has none), law_schools (array), is_student (boolean), description (short bio line or null), profile_url (public profile page)",
"total": "integer, number of people in the filtered roster as reported by the directory",
"has_more": "boolean, true when further pages of the filtered roster exist beyond this response",
"returned": "integer, number of records in items",
"page_size": "integer page size, or null when all=true"
},
"sample": {
"data": {
"all": false,
"page": 1,
"items": [
{
"id": "d996ae8d-ab51-4446-9800-be1999972a64",
"name": "Noah Abitbol",
"offices": [
"Montréal"
],
"position": "Associate",
"expertise": [
"Corporate",
"Mergers and Acquisitions",
"Private M&A"
],
"is_student": false,
"description": "Noah is developing a broad corporate practice.",
"law_schools": [
"Université de Montréal"
],
"profile_url": "https://www.dwpv.com/our-people/noah-abitbol",
"years_of_call": [
2023
]
},
{
"id": "20e8b4de-8b3d-41ac-aa60-b576f4abfef1",
"name": "Jordan Altman",
"offices": [
"Montréal"
],
"position": "Partner",
"expertise": [
"Corporate",
"Mergers and Acquisitions",
"Private M&A"
],
"is_student": false,
"description": "Jordan provides practical, innovative advice to clients on a broad spectrum of corporate transactions.",
"law_schools": [
"McGill University"
],
"profile_url": "https://www.dwpv.com/our-people/jordan-altman",
"years_of_call": [
2015
]
}
],
"total": 117,
"has_more": true,
"returned": 12,
"page_size": 12
},
"status": "success"
}
}About the Dwpv API
What the API Returns
The search_people endpoint returns an array of person records under the items field. Each record includes a unique directory id (GUID), name, position (title string, e.g. "Partner"), offices (array of office names), expertise (array of practice area labels), law school, and year(s) of call. The envelope also carries total (directory count for the active filter set), returned (records in this response), has_more (boolean for further pages), and echoed page, page_size, and all values.
Filtering and Pagination
Filters map directly to the directory's facets. position accepts labels such as Partner or Associate; office accepts accented names exactly as the directory spells them (e.g. Montréal); expertise matches practice-area labels like Tax or Capital Markets; query runs a free-text search against names and biographies. Multiple values for the same filter are comma-separated and OR-ed. Pagination is controlled with page and page_size (1–100); setting all=true overrides both and returns every matching record in a single response.
Sorting and Coverage
Results default to surname A–Z. The sort parameter accepts the same ordering options exposed by the directory's Sort By control. The API covers all professionals listed publicly in the Davies Our People directory across their Toronto, Montréal, and New York offices. Data reflects what the directory publishes per person — contact details such as direct phone numbers or email addresses are not part of the returned record set.
The Dwpv API is a managed, monitored endpoint for dwpv.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when dwpv.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 dwpv.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 structured roster of all Davies partners filtered by office (e.g.
Montréal) for business development research - Pull every lawyer whose
expertiseincludes a specific practice area such asMergers & Acquisitionsfor competitive landscape analysis - Track changes in headcount by position over time by periodically querying
position=Partnerand comparingtotal - Populate a legal-industry database with law school and year-of-call data for attorney career-trajectory research
- Identify overlap between two practice areas by querying
expertisecombinations across the full roster usingall=true - Generate a filterable internal directory of Davies professionals for a client-facing portal or CRM integration
| 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 Davies (dwpv.com) have an official public developer API?+
What does the `all=true` parameter do, and when should I use it?+
all=true, the API fetches every page of the filtered roster internally and returns all matching records in a single response. The page and page_size fields in the response are set to null. Use it when you need the complete filtered set — for example, all lawyers in a given practice area — and want to avoid writing pagination loops. For large unfiltered queries this will return more records per call, so paginated mode is preferable when you only need a subset.What personal contact details are returned per professional?+
name, position, offices, expertise, law school, and year(s) of call. Direct contact fields such as email addresses or phone numbers are not included in the returned data. The API covers what the public Our People directory exposes per profile listing.Can I retrieve full biography text for individual lawyers?+
How do I filter by multiple offices at once?+
office parameter, e.g. office=Toronto,Montréal. Values are OR-ed, so the response includes professionals from any of the listed offices. Office names must match the directory's spelling exactly, including accented characters.