Insights
Historical SEC Crypto Enforcement Actions by Date
Alphanume Team · July 28, 2026
Build a historical SEC crypto enforcement timeline by filtering the normalized enforcement feed to SEC actions, sorting on the agency's first-public date, and preserving each document's legal posture.
Alphanume Crypto Enforcement normalizes digital-asset actions from the SEC, CFTC, and DOJ from January 2024 forward. The SEC-only research job uses GET /v1/crypto/enforcement with agency=sec. It includes SEC litigation releases and administrative proceedings, while proposals, speeches, policy statements, and general rulemaking stay outside the enforcement-action cohort.
One public action can name several respondents, so the dataset returns one row per respondent. Those rows share action_key. A timeline of actions counts distinct action keys, while a respondent study retains the exploded rows. Mixing those units inflates action counts and any repeated monetary relief.
Use the structural public date
Field | Meaning | Timeline treatment |
|---|---|---|
published_date | Date on the agency's own index | First-public sort key and API date filter |
action_date | Date extracted from the document's words | Secondary clock with variable precision |
action_date_precision | Day, month, quarter, year, or unstated | Exclude coarse dates from day-level lag tests |
days_action_to_publication | Calendar gap between supported dates | Interpret only with precision fields |
document_url | SEC source document | Final authority for the row's posture |
published_date is structural and never inferred. action_date can refer to a complaint, order, judgment, or other action described inside the release. Sorting the event feed by the extracted date can move an imprecise or earlier legal act ahead of the day the public release appeared.
The endpoint's date and date-range parameters apply to published_date. Exact date cannot be combined with range filters.
Filter SEC actions and paginate
Results are ordered by published date descending, action key ascending, and respondent index ascending. Keyset pagination uses all three values. The response cursor returns published_date, action_key, and respondent_index; the request names them cursor_published_date, cursor_action_key, and cursor_respondent_index.
import os
import requests
url = "https://api.alphanume.com/v1/crypto/enforcement"
headers = {"X-API-Key": os.environ["ALPHANUME_API_KEY"]}
params = {"agency": "sec", "date_gte": "2024-01-08", "date_lte": "2025-12-31"}
rows = []
while True:
response = requests.get(url, headers=headers, params=params, timeout=30)
response.raise_for_status()
payload = response.json()
rows.extend(payload["data"])
if not payload.get("has_more"):
break
cursor = payload["next_cursor"]
params.update({
"cursor_published_date": cursor["published_date"],
"cursor_action_key": cursor["action_key"],
"cursor_respondent_index": cursor["respondent_index"],
})Save each page before deduplicating. A complete action-level timeline then groups by action_key and checks that shared fields agree across respondent rows. Keep a separate respondent-level export for questions about named parties.
Preserve the legal posture
Document posture | Safe description | Unsafe shortcut |
|---|---|---|
civil_complaint | SEC alleged the stated conduct | Respondent was found liable |
administrative_proceeding | SEC instituted the described proceeding | A final sanction already exists |
settled_order | The document states a settlement or order | Every allegation was adjudicated |
follow-up action | Later SEC stage linked within the agency | Original complaint and resolution are one date |
settled_flag null | The document did not state settlement status | The matter was contested |
action_type describes what the public document announces. allegation_categories records theories such as fraud, unregistered offering, market manipulation, AML/BSA, sanctions, or misappropriation. Those categories do not convert allegations into findings. Use the title, summary, settlement flag, follow-up chain, and source document together.
Follow-up linkage stays within one agency. An SEC complaint and a DOJ indictment involving similar conduct remain separate actions by design. This SEC-only timeline should not import a DOJ plea as though it were an SEC resolution.
Keep the original action and every SEC follow-up as separate dated records in the timeline. prior_action_key, followup_action_key, is_followup, and days_to_followup describe the within-agency chain. A later settlement or order belongs on its own publication date and does not rewrite the legal posture of the earlier complaint.
Do not double-count relief
- Repeated amounts.
monetary_relief_usdrepeats on every respondent row in one action, so aggregate distinct action-key and amount pairs. - Mixed relief types. The amount can combine penalty, disgorgement, interest, restitution, or forfeiture; retain
monetary_relief_basis. - Name keys.
respondent_keyis string normalization rather than entity resolution. - Asset literals. Asset arrays preserve document wording, so Bitcoin, bitcoin, and BTC need a declared normalization.
- Coverage boundary. Actions before January 8, 2024 are outside the dataset and cannot enter a long historical trend.
The feed also updates follow-up links through a later sweep. Poll updated_since and preserve revisions separately so a later settlement does not appear to have been known on the complaint's original publication date.
Publish an SEC-only timeline
Pull one year, export raw respondent rows and one deduplicated action row per action_key, then label complaint, proceeding, settled order, and later follow-up stages separately. Check every event used in a legal-status claim against document_url and show null settlement fields.
Explore the complete contract on the Crypto Enforcement page and reproduce its filters from the Crypto Enforcement documentation. Free access covers only a trailing 20-session delayed window, so the full 2024-forward timeline requires historical access.