CROA APIcroa.com ↗
Access 5000+ Canadian Railway Office of Arbitration awards, search by keyword, filter by case range or party, and retrieve arbitrator metadata via 8 endpoints.
What is the CROA API?
The CROA API provides structured access to over 5,000 Canadian Railway Office of Arbitration awards across 8 endpoints, covering case metadata, PDF links, arbitrator names, parties, and dispute subjects. The get_awards_index endpoint returns the full awards catalog with case numbers and PDF URLs, while get_award_detail surfaces per-case metadata including arbitrator, parties, and a text snippet extracted directly from the award document.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/514dfc91-459e-44e3-ad0c-d3a3ebb95e33/get_home' \ -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 croa-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: CROA SDK — browse, search, and drill into Canadian railway arbitration awards."""
from parse_apis.croa_canadian_railway_office_of_arbitration_api import CROA, AwardNotFound
client = CROA()
# Browse the most recent scheduled awards (capped at 5 items)
for award in client.scheduledawards.list_latest(limit=5):
print(award.case_number, award.description[:80])
# Filter recent awards by a specific railway party
for award in client.scheduledawards.filter_by_party(party="CPKCR", limit=3):
print(award.case_number, award.date, award.description[:60])
# Drill into one award's full detail via the summary → detail navigation
recent = client.scheduledawards.list_latest(limit=1).first()
if recent:
detail = recent.detail()
print(detail.case_number, detail.pdf_url, detail.full_text_snippet[:100])
# Search the archive by keyword
for result in client.searchresults.search(query="dismissal", limit=3):
print(result.title, result.url)
# Get a specific award by case number, with typed-error handling
try:
award = client.awards.get(case_number="5204")
print(award.case_number, award.pdf_url)
except AwardNotFound as exc:
print(f"Award not found: {exc.case_number}")
# List member organizations
for member in client.members.list(limit=3):
print(member.name, member.details[:50])
print("exercised: scheduledawards.list_latest / filter_by_party / detail / searchresults.search / awards.get / members.list")
Retrieve navigation links from the CROA English homepage. Returns the page title and a list of primary navigation links (search, latest awards, full index, rules, members, contact).
No input parameters required.
{
"type": "object",
"fields": {
"title": "string, page title",
"navigation_links": "array of objects with text and url keys"
},
"sample": {
"data": {
"title": "CROA Home",
"navigation_links": [
{
"url": "http://search.freefind.com/find.html?si=8864688&pid=a",
"text": "Click here to search all railway awards"
},
{
"url": "http://croa.com/Schedules%20with%20awards/May-Sept2025Awards.htm",
"text": "Latest awards: May to September 2025"
},
{
"url": "http://croa.com/LINKPDF.html",
"text": "All awards (1965 to date)"
}
]
},
"status": "success"
}
}About the CROA API
Award Discovery and Retrieval
The get_awards_index endpoint returns the complete catalog of CROA awards — over 5,000 records — each with a case_number, display_text, and pdf_url. For targeted lookups, get_awards_by_range accepts start_range and end_range integer parameters and returns only awards whose case numbers fall within that inclusive range. The get_latest_awards endpoint retrieves the most recently published awards, each record including a date, description, and pdf_url.
Case-Level Detail and Text Extraction
get_award_detail accepts a plain numeric case_number (e.g. '5204') and returns the award's pdf_url, arbitrator, parties, subject, and a full_text_snippet of up to 5,000 characters extracted from the PDF when a parsing library is available. Note that suffixed case number variants such as '4881 -S' are not supported and will return an input_not_found response — only standard numeric identifiers work.
Search and Filtering
search_awards accepts a query string and returns matching results with title, url, and snippet fields via the integrated FreeFind search engine. filter_awards_by_party narrows the latest awards by a case-insensitive match on the description field, using common party abbreviations like 'CNR', 'CPKCR', or 'TCRC'.
Members and Navigation
get_members returns the list of member railway companies and unions participating in CROA, with each member's name and available contact or address details. get_home returns the site's top-level navigation structure as an array of link objects with text and url keys.
The CROA API is a managed, monitored endpoint for croa.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when croa.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 croa.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 searchable database of Canadian railway labour arbitration decisions by ingesting the full awards index from
get_awards_index. - Track recent arbitration outcomes for CN Rail or CP by running
filter_awards_by_partywith identifiers like'CNR'or'CPKCR'. - Analyze arbitrator workload and decision patterns by aggregating the
arbitratorfield across multipleget_award_detailcalls. - Monitor newly published CROA awards by polling
get_latest_awardsand alerting on newcase_numberentries. - Build a case-range explorer that lets users step through specific decades of awards using
get_awards_by_rangewith configurablestart_rangeandend_rangeinputs. - Compile a directory of CROA member organizations with contact information using
get_membersfor labour relations research. - Keyword-search awards by dispute subject — e.g. discipline, scheduling, benefits — using the
queryparameter insearch_awards.
| 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 CROA provide an official developer API?+
What does `get_award_detail` return, and are all case number formats supported?+
pdf_url, arbitrator, parties, subject, and a full_text_snippet of up to 5,000 characters. Only plain numeric case numbers (e.g. '100', '5204') are supported. Suffixed variants like '4881 -S' are not currently handled and will return an input_not_found response. You can fork this API on Parse and revise it to add support for suffixed case number formats.Does `filter_awards_by_party` search the full historical awards index?+
get_latest_awards, matching against the description field. The full historical index is not searchable by party name through a dedicated endpoint. You can fork this API on Parse and revise it to add a party-filter endpoint that works across the complete awards catalog.Is the full text of every award available through the API?+
get_award_detail returns a full_text_snippet of up to 5,000 characters when PDF text extraction is available, along with structured fields like arbitrator, parties, and subject. Full-document text extraction across all 5,000+ awards in bulk is not currently supported. You can fork this API on Parse and revise it to add a batch text-extraction endpoint.How current are the awards returned by `get_latest_awards`?+
get_latest_awards reflects what appears on CROA's latest schedule page at the time of the request, including case_number, date, description, and pdf_url. Freshness depends on how frequently CROA updates that page — there is no guaranteed refresh interval, and the API does not cache a fixed historical snapshot.