Sedarplus APIsedarplus.ca ↗
Access SEDAR+ company profiles, public filings, reporting issuers, cease trade orders, and disciplinary records via a structured JSON API.
What is the Sedarplus API?
This API exposes 6 endpoints covering SEDAR+, Canada's public capital markets filing database. Use search_profiles to look up issuers by name and retrieve profile numbers, search_documents to pull regulatory filings with download URLs, and search_cease_trade_orders to query trading restrictions — all returning structured JSON with fields like profile_id, legal_name, jurisdiction, and submitted_date.
curl -X GET 'https://api.parse.bot/scraper/e36e248d-0f76-4830-81f5-ef5af8099599/search_profiles?query=Royal+Bank' \ -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 sedarplus-ca-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.
"""SEDAR+ Canadian Securities Filings — compliance due diligence workflow."""
from parse_apis.sedar__canadian_securities_filings_api import (
Sedar, NotFoundError
)
client = Sedar()
# Search for company profiles matching a keyword
for profile in client.profilesummaries.search(query="Royal Bank", limit=3):
print(profile.name, profile.profile_number, profile.jurisdiction)
# Drill into the first result for full details
summary = client.profilesummaries.search(query="Royal Bank", limit=1).first()
if summary:
detail = summary.details()
print(detail.legal_name, detail.jurisdiction, detail.date_effective)
# Browse recent regulatory filings across the platform
for doc in client.documents.search(limit=3):
print(doc.document_name, doc.jurisdiction, doc.file_size)
# List reporting issuers registered on SEDAR+
for issuer in client.issuers.list(limit=3):
print(issuer.name, issuer.profile_number, issuer.type)
# Search cease trade orders for compliance screening
for cto in client.ceasetradeorders.search(query="mining", limit=3):
print(cto.details)
# Typed error handling when fetching a profile that may not exist
try:
profile = client.profiles.get(profile_id="000001161")
print(profile.legal_name, profile.jurisdiction)
except NotFoundError as exc:
print(f"Profile not found: {exc}")
print("exercised: profilesummaries.search / details / documents.search / issuers.list / ceasetradeorders.search / profiles.get")
Search for issuer/company profiles by name or keyword on the SEDAR+ platform. Returns up to 21 matching profiles with name, profile number, type, and jurisdiction. Profile numbers can be used with get_profile for full details.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword for company or issuer name |
{
"type": "object",
"fields": {
"items": "array of profile objects with name, profile_number, type, jurisdiction, status, and profile_id"
},
"sample": {
"data": {
"items": [
{
"name": "Royal Bank of Canada / Banque Royale du Canada",
"type": "Company",
"status": null,
"profile_id": "000001161",
"jurisdiction": "Québec",
"profile_number": "000001161"
}
]
},
"status": "success"
}
}About the Sedarplus API
Company Profiles and Issuer Data
The search_profiles endpoint accepts a query string and returns up to 21 matching issuer records, each containing name, profile_number, type, jurisdiction, status, and profile_id. That profile_id feeds directly into get_profile, which returns the full record for a single issuer including legal_name, date_effective, and current status. The get_reporting_issuers_list endpoint returns a paginated set of all reporting issuers with name, profile number, type, and jurisdiction — useful for building or refreshing a comprehensive issuer index.
Filing Documents
search_documents accepts an optional query string and an optional profile_id to scope results to a specific company. Each document record includes profile, document_name, submitted_date, jurisdiction, file_size, and a download_url pointing directly to the filing. This makes it straightforward to retrieve the most recent filings for a given issuer or to search across the full document corpus by keyword.
Regulatory Enforcement Records
Two enforcement endpoints cover the disciplinary and trading-restriction sides of SEDAR+. search_disciplined_list accepts an optional query and returns records where each entry's details field is an array of column values — typically name, order number, date, type, and regulator. search_cease_trade_orders follows the same shape, returning cease trade order records with columns for name, reference, date, document, type, status, and jurisdiction. Both endpoints can be called without a query to retrieve the full list, or filtered by a search term.
The Sedarplus API is a managed, monitored endpoint for sedarplus.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when sedarplus.ca 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 sedarplus.ca 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?+
- Monitor new regulatory filings for a specific Canadian issuer using
search_documentsfiltered byprofile_id - Build an issuer directory by combining
get_reporting_issuers_listresults with full profiles fromget_profile - Screen counterparties for active cease trade orders before executing transactions using
search_cease_trade_orders - Flag individuals or companies under disciplinary action using
search_disciplined_listas part of a KYC workflow - Track jurisdiction and status changes for a Canadian public company by polling
get_profileover time - Aggregate filing metadata — submission dates, file sizes, jurisdictions — across multiple issuers for compliance reporting
| 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 SEDAR+ have an official developer API?+
What does `search_documents` return, and can I filter by company?+
profile, document_name, submitted_date, jurisdiction, file_size, and download_url. You can pass a profile_id (obtained from search_profiles) to limit results to a single issuer, or a query string to search across document titles and content. Both parameters are optional and can be combined.How are disciplinary and cease trade order records structured?+
search_disciplined_list and search_cease_trade_orders return arrays where each object contains a details field — an ordered array of column values rather than named keys. For disciplinary records the columns are typically name, order number, date, type, and regulator. For cease trade orders they include name, reference, date, document, type, status, and jurisdiction.Does the API return the actual filing document content, or just metadata?+
download_url for each document, not the parsed text content of the filing itself. Document body extraction is not currently covered. You can fork this API on Parse and revise it to add an endpoint that fetches and parses filing content from the download URL.How many results does `search_profiles` return, and is there pagination?+
search_profiles returns up to 21 matching profiles per query. Pagination controls are not currently exposed — only the first result set is returned. The get_reporting_issuers_list endpoint provides a broader paginated issuer list for cases where exhaustive coverage is needed. You can fork this API on Parse and revise it to add pagination parameters to the profile search endpoint.