Org APItheppra.org.za ↗
Search the South African PPRA public register for licensed property practitioners and firms by name or reference number. Verify FFC numbers and registration status.
What is the Org API?
The PPRA API exposes 1 endpoint — search_practitioners — that queries the South African Property Practitioners Regulatory Authority public register and returns up to several matched records per query, each containing the practitioner or firm's full name, FFC number, registration details, and more. It supports four distinct search modes: practitioner name, practitioner reference number, firm name, and firm reference number.
curl -X GET 'https://api.parse.bot/scraper/d631a33d-441f-4969-a229-8b3cb2a3c7b9/search_practitioners?query=John+Smith&search_type=practitioner_name' \ -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 theppra-org-za-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: PPRA Practitioner Search — find registered property practitioners in South Africa."""
from parse_apis.theppra_org_za_api import Ppra, SearchType, InvalidSearchType
client = Ppra()
# Search for practitioners by name, capped at 5 results.
for practitioner in client.practitioners.search(query="John Smith", search_type=SearchType.PRACTITIONER_NAME, limit=5):
print(practitioner.name, "|", practitioner.registration_status, "|", practitioner.firm_name)
# Search by firm name and drill into the first result.
hit = client.practitioners.search(query="Protea", search_type=SearchType.FIRM_NAME, limit=1).first()
if hit is not None:
print(f"{hit.full_name} ({hit.card_code}) — {hit.category}, status: {hit.registration_status}")
# Demonstrate error handling for an invalid search type.
try:
client.practitioners.search(query="test", search_type="invalid_type", limit=1).first()
except InvalidSearchType as e:
print(f"Caught expected error: {e.message}")
print("exercised: practitioners.search (by name / by firm) + InvalidSearchType handling")
Search the PPRA public register of property practitioners (estate agents) and firms. Accepts four search types: by practitioner name, practitioner reference number, firm name, or firm reference number. Returns matching results with details including full name, FFC number, registration status, firm name, capacity, and category. Each search makes one form submission plus one detail lookup per result (up to 10 results), so expect proportional latency. Fields like province, contact details, and FFC expiry date are not published by the register's public lookup.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | The search query. For practitioner_name, provide 'FirstName Surname' (e.g. 'John Smith'). For practitioner_reference, provide the 7-digit reference number. For firm_name, provide the firm or trading name. For firm_reference, provide the reference number starting with 'F' (e.g. 'F123456'). |
| search_typerequired | string | The type of search to perform on the PPRA register. |
{
"type": "object",
"fields": {
"query": "The search query that was submitted",
"results": "Array of practitioner/firm records with details",
"search_type": "The search type used",
"total_results": "Number of matching results returned"
},
"sample": {
"data": {
"query": "John Smith",
"results": [
{
"name": "John Edwin Smith",
"type": "agent",
"capacity": "Employee",
"category": "Estate Agency",
"card_code": "SMITHJO18",
"firm_name": "PROTEA PROPERTY MANAGERS (PTY) LTD",
"full_name": "JOHN EDWIN SMITH",
"ffc_number": "202570044500000",
"trade_name": "PROTEA PROPERTY MANAGERS",
"registration_status": "Valid"
}
],
"search_type": "practitioner_name",
"total_results": 10
},
"status": "success"
}
}About the Org API
What the API covers
The search_practitioners endpoint queries the PPRA public register, the official South African database of licensed property practitioners (estate agents) and registered firms. The register is maintained by the Property Practitioners Regulatory Authority under the Property Practitioners Act. Results include fields such as full name, FFC number (Fidelity Fund Certificate number), and registration details for each matched record.
Inputs and search modes
The endpoint takes two required parameters: query and search_type. The search_type field controls which part of the register is searched and must be one of four values: practitioner_name, practitioner_ref, firm_name, or firm_ref. For practitioner_name, supply a full name string such as 'Jane Dlamini'. For reference-based searches, supply the numeric or alphanumeric reference assigned by the PPRA. Mixing up the search type and query format (e.g. passing a name when a reference number is expected) will return zero results.
Response shape
The response envelope always includes query (the original search string), search_type (the mode used), total_results (integer count of matches), and results (array of practitioner or firm records). Each record in results carries identifying and registration data — at minimum the registrant's name and FFC number. A total_results value of 0 indicates no matching records exist in the register for the submitted query.
The Org API is a managed, monitored endpoint for theppra.org.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when theppra.org.za 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 theppra.org.za 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?+
- Verify that an estate agent holds a valid FFC number before signing a mandate agreement
- Check whether a property firm is registered with the PPRA before engaging their services
- Automate compliance checks on a list of agent reference numbers during onboarding
- Look up practitioner registration status by full name for due diligence workflows
- Cross-reference FFC numbers from agent business cards against the official PPRA register
- Build a South African real estate directory that surfaces only PPRA-registered practitioners
| 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 the PPRA provide an official developer API?+
What does the search_practitioners endpoint return for each matched record?+
results array includes the registrant's full name, FFC number, registration details, and whether the result is a practitioner or a firm. The total_results field tells you how many records matched. If no records match, results is an empty array and total_results is 0.Does the API return historical or expired registrations?+
Can the API return a full list of all registered practitioners without a specific query?+
search_practitioners endpoint requires a query string and a search_type, so results are always scoped to a specific name or reference number lookup rather than a bulk export. You can fork this API on Parse and revise it to add a pagination-based bulk listing endpoint if the register supports that access pattern.