Ca APIsco.ca.gov ↗
Access California state personnel office contacts via the CPOD API. Retrieve department lists and staff names, titles, phone numbers, and emails for all state agencies.
What is the Ca API?
The California Personnel Office Directory (CPOD) API provides structured access to personnel contact data across California state departments through 2 endpoints. The get_department_personnel endpoint returns staff records including name, job title, phone number, and email address for a given department. The list_departments endpoint enumerates all departments with their slug identifiers, which are required inputs for fetching personnel details.
curl -X GET 'https://api.parse.bot/scraper/503dde2f-26e7-434f-893c-29d363be47b6/list_departments?letter=A' \ -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 sco-ca-gov-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: cpod SDK — bounded, re-runnable; every call capped."""
from parse_apis.sco_ca_gov_api import Cpod, Letter, DepartmentNotFound
client = Cpod()
# List departments under the "A" tab
for dept in client.departments.list(letter=Letter.A, limit=3):
print(dept.slug, dept.name)
# Drill into a specific department's personnel
dept = client.departments.list(letter=Letter.A, limit=1).first()
for person in dept.personnel.list(limit=3):
print(person.name, person.title, person.email)
# Construct a known department directly and fetch its personnel
aging = client.department("aging")
try:
for person in aging.personnel.list(limit=3):
print(person.name, person.title, person.phone, person.email)
except DepartmentNotFound as e:
print(f"not found: {e.department_slug}")
print("exercised: departments.list, personnel.list")
Lists all California state departments in the Personnel Office Directory. Each department entry includes its slug identifier and official name. Results can be filtered by alphabetical group tab (A, B, C, ... XYZ, CSU). The slug is used to fetch personnel details for a specific department.
| Param | Type | Description |
|---|---|---|
| letter | string | Alphabetical group tab to filter departments. Omit to return all departments. |
{
"type": "object",
"fields": {
"total": "integer count of departments returned",
"letter": "the letter filter applied, or 'all'",
"departments": "array of department entries with slug and name"
},
"sample": {
"data": {
"total": 6,
"letter": "A",
"departments": [
{
"name": "AFRICAN AMERICAN MUSEUM, CALIFORNIA",
"slug": "african_american_museum"
},
{
"name": "AGING, CALIFORNIA DEPARTMENT OF",
"slug": "aging"
},
{
"name": "AGRICULTURAL LABOR RELATIONS BOARD",
"slug": "agricultural_labor"
},
{
"name": "AIR RESOURCES BOARD",
"slug": "air_resources"
},
{
"name": "ALCOHOLIC BEVERAGE CONTROL",
"slug": "alcoholic_beverage_control"
},
{
"name": "AUDITOR'S OFFICE, CALIFORNIA STATE",
"slug": "auditor"
}
]
},
"status": "success"
}
}About the Ca API
What This API Covers
The California State Controller's Office publishes the Personnel Office Directory (CPOD) as a reference for HR and personnel staff contacts across state departments. This API exposes that directory in structured JSON form, covering every department listed in the CPOD — from the Department of Aging to the California State University system.
Endpoints and Parameters
list_departments accepts an optional letter parameter to filter results by alphabetical tab (e.g., A, B, or CSU for California State University entries). Omitting the parameter returns all departments at once. Each entry in the departments array includes a slug (e.g., aging, finance, lottery) and the department's official name. The total field gives a count of matched departments and letter reflects the filter applied or 'all' when no filter is used.
get_department_personnel takes a required department_slug — sourced from list_departments results — and returns an array of personnel records. Each record contains the staff member's name, title, phone, and email. The response also includes department_name, department_slug, and total_personnel so responses are self-describing without cross-referencing another call.
Data Scope and Freshness
Coverage maps directly to what the California State Controller's Office publishes in CPOD. The directory focuses on personnel office contacts — HR staff and similar roles — rather than general employee directories. Data reflects the current published state of the CPOD page; departments are organized consistently with the alphabetical tab structure used on the source site.
The Ca API is a managed, monitored endpoint for sco.ca.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when sco.ca.gov 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 sco.ca.gov 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 an internal HR contact tool that maps state agency names to their personnel office phone numbers and emails.
- Automate routing of inter-agency correspondence by looking up the correct personnel office contact for a given department slug.
- Audit or sync a CRM with current California state HR contact records using the full department list from
list_departments. - Generate a filtered directory of personnel contacts for departments starting with a specific letter using the
letterparameter. - Cross-reference job applications or civil service processes with the correct departmental HR contact via
get_department_personnel. - Build a lookup tool for state vendors or contractors to identify the right HR point of contact at a target agency.
| 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 sco.ca.gov provide an official developer API for the CPOD directory?+
What does `list_departments` return and how does the `letter` filter work?+
departments array where each entry has a slug and a department name, plus a total count and the letter value applied. The letter parameter accepts single alphabetical characters (e.g., C) or the special value CSU for California State University entries. Omitting letter returns all departments regardless of alphabetical group.Does the API return general employee directories, not just HR personnel contacts?+
personnel array in get_department_personnel reflects only the contacts published in the CPOD for each agency. You can fork this API on Parse and revise it to incorporate other California state employee directories if a broader scope is needed.Is it possible to search personnel records by name or title across all departments at once?+
get_department_personnel for each relevant department. You can fork this API on Parse and revise it to add a cross-department search endpoint.