BACB APIservices.bacb.com ↗
Search and look up BACB-certified behavior analysts (RBT, BCaBA, BCBA, BCBA-D) by name, location, status, and credential type via a simple REST API.
What is the BACB API?
The BACB Certificant Registry API exposes 2 endpoints that query the public Behavior Analyst Certification Board registry, returning up to 12 fields per record including certification number, status, expiration date, and disciplinary action flags. Use search_certificants to filter by credential type, name, location, and status across all BACB credentials, or call get_certificant to retrieve a single record directly by certification number.
curl -X GET 'https://api.parse.bot/scraper/e8682241-2562-4c46-9692-73f2c5ac41e4/search_certificants?state=CO&status=Active&last_name=Smith&certification_type=BCBA' \ -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 services-bacb-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: BACB Certificant Registry — search, drill down, point lookup."""
from parse_apis.services_bacb_com_api import BACB, CertificationType, CertificationStatus, CertificantNotFound
client = BACB()
# Search for active BCBAs in Colorado, capped to 5 total results.
for cert in client.certificants.search(
certification_type=CertificationType.BCBA,
status=CertificationStatus.ACTIVE,
state="CO",
last_name="Smith",
limit=5,
):
print(cert.display_name, cert.certification_number, cert.expiration_date)
# Drill down: take one result and fetch its full record by certification number.
hit = client.certificants.search(
certification_type=CertificationType.BCBA,
state="CO",
last_name="Smith",
limit=1,
).first()
if hit is not None:
detail = client.certificants.get(certification_number=hit.certification_number)
print(detail.display_name, detail.certification_level, detail.status)
print("Supervises BCaBAs:", detail.willing_to_supervise_bcabas)
print("Supervisors:", [s.name for s in detail.rbt_supervisors])
# Point lookup with error handling for an unknown certification number.
try:
client.certificants.get(certification_number="1-00-00000")
except CertificantNotFound:
print("Certificant not found — number may be invalid or undashed.")
print("exercised: certificants.search / certificants.get / CertificantNotFound")
Searches the public BACB Certificant Registry and returns one record per matching certificant, each carrying the summary columns (name, location, certification type, status) plus the full detail block the registry attaches to every row (certification_number, original_certification_date, next_recertification_date, expiration_date, supervision flags, RBT supervisors). Dates are ISO YYYY-MM-DD; next_recertification_date and supervision_training_completed_on are null when the registry does not show them (RBT records have no recertification date). The registry itself requires at least one of state, city or last_name, requires last_name when first_name is given, and returns at most 100 rows per search with no paging: total_results is the registry's own match count, returned_count the rows delivered, and truncated is true when total_results exceeds returned_count, in which case narrow the search (add a name or city). A valid search with no matches returns an empty results array with total_results 0. Each call performs one registry round trip preceded by an automatic verification-challenge solve, so expect several seconds per call. certification_number values here feed get_certificant unchanged.
| Param | Type | Description |
|---|---|---|
| city | string | City name filter; omitted = no city restriction. |
| state | string | Region code within country: a 2-letter US state/territory code for United States (e.g. CO), a province code for Canada, a state code for Australia, or EN/NI/SL/WL for United Kingdom. Case-insensitive. |
| status | string | Certification status filter; All returns every status. |
| country | string | Country name exactly as the registry lists it (e.g. United States, Canada, Australia, United Kingdom). Only United States was exercised in this build; state applies to these four countries only. |
| last_name | string | Last-name filter, at least 2 characters; matches the certificant's surname (including hyphenated and multi-word surnames containing it). |
| first_name | string | First-name filter; only accepted together with last_name. |
| certification_typerequired | string | Credential to search. Exactly one type per search. |
{
"type": "object",
"fields": {
"results": "array of certificant records; each has name (LAST, FIRST as listed), display_name, location (city, region), country, certification (short code), certification_level (full credential name), certification_number, status, original_certification_date, next_recertification_date (null for RBTs), expiration_date, supervision_training_completed_on (nullable), willing_to_supervise_bcabas, willing_to_supervise_trainees, rbt_supervisors (array of {name, certification_number}), has_disciplinary_action",
"truncated": "boolean, true when total_results exceeds returned_count",
"total_results": "integer, the registry's total match count for the search",
"returned_count": "integer, number of records in results (registry delivers at most 100)"
},
"sample": {
"data": {
"results": [
{
"name": "SMITH, MELISSA",
"status": "Active",
"country": "United States",
"location": "Pueblo, CO",
"display_name": "MELISSA SMITH",
"certification": "BCBA",
"expiration_date": "2028-08-30",
"rbt_supervisors": [],
"certification_level": "Board Certified Behavior Analyst",
"certification_number": "1-16-23660",
"has_disciplinary_action": false,
"next_recertification_date": "2028-08-30",
"original_certification_date": "2016-08-31",
"willing_to_supervise_bcabas": false,
"willing_to_supervise_trainees": false,
"supervision_training_completed_on": "2016-10-28"
}
],
"truncated": false,
"total_results": 1,
"returned_count": 1
},
"status": "success"
}
}About the BACB API
What the API Returns
Both endpoints return the same record shape: name (registry-formatted as LAST, FIRST), display_name, certification (short code: RBT, BCaBA, BCBA, or BCBA-D), certification_level (full credential name), certification_number (dashed registry form, e.g. 1-16-23660 or RBT-25-458903), status (Active / Inactive / Expired), expiration_date (ISO date), location, country, has_disciplinary_action (boolean), and rbt_supervisors (an array of {name, certification_number} pairs, populated only for RBT records).
search_certificants
The search_certificants endpoint requires exactly one certification_type and accepts optional filters for last_name (minimum 2 characters), first_name (only valid alongside last_name), city, state, country, and status. The registry delivers at most 100 records per call; the truncated boolean and total_results integer tell you when a result set has been clipped. For United States searches, state takes a 2-letter code (e.g. CO); international searches use the country's province or region code.
get_certificant
get_certificant accepts a single required parameter — certification_number in dashed form exactly as emitted by search_certificants — and returns the complete record for that individual, including their supervisor list if they hold an RBT credential. This endpoint is the reliable way to refresh or verify a single record without running a broad search.
The BACB API is a managed, monitored endpoint for services.bacb.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when services.bacb.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 services.bacb.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?+
- Verify a prospective employee's BCBA certification status and expiration date before hire
- Build a directory of active RBT certificants in a specific US state using the
stateandstatusfilters - Check whether a certificant has a current disciplinary action flag before contracting with them
- Enumerate all BCaBA holders in a given country for market-size research
- Automate periodic re-verification of a caseload of certificants using their stored
certification_numbervalues - Identify the listed supervisors for an RBT record via the
rbt_supervisorsarray - Build compliance workflows that alert when a practitioner's
expiration_dateis approaching
| 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 BACB offer an official developer API for the certificant registry?+
How many records does search_certificants return, and what happens when there are more matches?+
truncated: true, and total_results reflects the full count while returned_count reflects what was actually returned. Narrowing your filters — for example, adding last_name, city, or state — is the way to bring a result set under the 100-record cap.What does the `has_disciplinary_action` field actually indicate?+
has_disciplinary_action is a boolean drawn directly from the registry record. When true, the BACB's registry is flagging that the certificant currently has an active disciplinary action on file. It does not include the detail or history of that action — only its presence.Does the API return historical certification records or a certificant's credential history?+
Can I search across multiple certification types in a single call?+
search_certificants requires exactly one certification_type per call. Searching RBT, BCaBA, BCBA, and BCBA-D simultaneously is not supported in a single request. You can fork this API on Parse and revise it to batch multiple certification-type requests and merge the results if that behavior is needed.