Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ COPY programs/ ./programs/
# Round 48 pSEO — sanctions evasion typologies and jurisdiction risk ratings
COPY evasion/ ./evasion/
COPY risk-ratings/ ./risk-ratings/
# Round 49 pSEO — regulatory framework and compliance deadlines
COPY regulations/ ./regulations/
COPY deadlines/ ./deadlines/
# how-to expansion pages (static fallthrough from _howto_page method)
COPY how-to/ ./how-to/
# Interactive shareable tools (compliance-check, ai-spend-optimizer)
COPY tools/ ./tools/
# R17 UX system — shared design system across portfolio
Expand Down
52 changes: 51 additions & 1 deletion api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3597,7 +3597,7 @@ def do_GET(self):
if _os.path.isfile(_rp):
with open(_rp, "r", encoding="utf-8") as _fh:
return self._serve_text(_fh.read(), "text/html; charset=utf-8")
for _pfx in ("/vs/", "/faq/", "/learn/", "/alternatives-to/", "/penalties/", "/guides/", "/checklists/", "/cost-of/", "/best/", "/templates/", "/stats/", "/redflags/", "/scenarios/", "/programs/", "/benchmarks/", "/evasion/", "/risk-ratings/"):
for _pfx in ("/vs/", "/faq/", "/learn/", "/alternatives-to/", "/penalties/", "/guides/", "/checklists/", "/cost-of/", "/best/", "/templates/", "/stats/", "/redflags/", "/scenarios/", "/programs/", "/benchmarks/", "/evasion/", "/risk-ratings/", "/regulations/", "/deadlines/"):
if p.path.startswith(_pfx):
_slug = p.path[len(_pfx):].split("?")[0].split("/")[0]
if not _slug:
Expand Down Expand Up @@ -6507,6 +6507,45 @@ def _sitemap_xml(self):
("/best/best-sanctions-screening-for-insurance", "weekly", "0.9", "Best Sanctions Screening For Insurance"),
("/best/best-sanctions-screening-for-ecommerce", "weekly", "0.9", "Best Sanctions Screening For Ecommerce"),
("/best/best-sanctions-screening-for-startups", "weekly", "0.9", "Best Sanctions Screening For Startups"),
("/how-to/screen-beneficial-owners", "monthly", "0.8", "Screen Beneficial Owners"),
("/how-to/implement-travel-rule", "monthly", "0.8", "Implement Travel Rule"),
("/how-to/file-sar-for-sanctions", "monthly", "0.8", "File Sar For Sanctions"),
("/how-to/conduct-customer-due-diligence", "monthly", "0.8", "Conduct Customer Due Diligence"),
("/how-to/build-transaction-monitoring-system", "monthly", "0.8", "Build Transaction Monitoring System"),
("/how-to/respond-to-ofac-subpoena", "monthly", "0.8", "Respond To Ofac Subpoena"),
("/how-to/conduct-risk-assessment", "monthly", "0.8", "Conduct Risk Assessment"),
("/how-to/train-staff-on-sanctions", "monthly", "0.8", "Train Staff On Sanctions"),
("/how-to/handle-false-positive-alerts", "monthly", "0.8", "Handle False Positive Alerts"),
("/how-to/conduct-enhanced-due-diligence", "monthly", "0.8", "Conduct Enhanced Due Diligence"),
("/how-to/block-and-reject-transactions", "monthly", "0.8", "Block And Reject Transactions"),
("/how-to/screen-crypto-transactions", "monthly", "0.8", "Screen Crypto Transactions"),
("/how-to/conduct-ongoing-monitoring", "monthly", "0.8", "Conduct Ongoing Monitoring"),
("/how-to/prepare-for-ofac-examination", "monthly", "0.8", "Prepare For Ofac Examination"),
("/how-to/report-ofac-violations", "monthly", "0.8", "Report Ofac Violations"),
("/how-to/manage-correspondent-banking-risk", "monthly", "0.8", "Manage Correspondent Banking Risk"),
("/how-to/document-compliance-program", "monthly", "0.8", "Document Compliance Program"),
("/regulations/fatf-recommendation-15", "monthly", "0.8", "FATF Recommendation 15"),
("/regulations/fincen-cdd-rule", "monthly", "0.8", "FinCEN CDD Rule"),
("/regulations/fincen-travel-rule", "monthly", "0.8", "FinCEN Travel Rule"),
("/regulations/ofac-itsr", "monthly", "0.8", "OFAC ITSR"),
("/regulations/ofac-russia-eo14024", "monthly", "0.8", "OFAC Russia Eo14024"),
("/regulations/ofac-north-korea-nkspea", "monthly", "0.8", "OFAC North Korea NKSPEA"),
("/regulations/eu-sanctions-regulation", "monthly", "0.8", "EU Sanctions Regulation"),
("/regulations/uk-ofsi-regime", "monthly", "0.8", "UK OFSI Regime"),
("/regulations/ofac-reporting-requirements", "monthly", "0.8", "OFAC Reporting Requirements"),
("/regulations/fincen-aml-requirements", "monthly", "0.8", "FinCEN AML Requirements"),
("/regulations/ofac-general-licenses", "monthly", "0.8", "OFAC General Licenses"),
("/regulations/corporate-transparency-act", "monthly", "0.8", "Corporate Transparency Act"),
("/deadlines/ofac-blocking-report-deadline", "monthly", "0.8", "OFAC Blocking Report Deadline"),
("/deadlines/sar-filing-deadline", "monthly", "0.8", "SAR Filing Deadline"),
("/deadlines/voluntary-disclosure-timeline", "monthly", "0.8", "Voluntary Disclosure Timeline"),
("/deadlines/annual-report-deadline", "monthly", "0.8", "Annual Report Deadline"),
("/deadlines/ctr-filing-deadline", "monthly", "0.8", "CTR Filing Deadline"),
("/deadlines/sdb-recordkeeping-deadline", "monthly", "0.8", "SDB Recordkeeping Deadline"),
("/deadlines/sdn-list-update-frequency", "monthly", "0.8", "SDN List Update Frequency"),
("/deadlines/rescreening-frequency", "monthly", "0.8", "Rescreening Frequency"),
("/deadlines/license-application-timeline", "monthly", "0.8", "License Application Timeline"),
("/deadlines/audit-trail-retention", "monthly", "0.8", "Audit Trail Retention"),
]
import datetime
today = datetime.date.today().isoformat()
Expand Down Expand Up @@ -12204,6 +12243,17 @@ def _howto_page(self, slug):
}
h = HOWTO.get(slug)
if not h:
# Fall through to static file (Round 49 expansion pages)
import os as _os
_here = _os.path.dirname(_os.path.abspath(__file__))
for _fp in (
_os.path.join(_here, "how-to", slug, "index.html"),
_os.path.join("/home/agentmail/app", "how-to", slug, "index.html"),
):
_fp = _os.path.normpath(_fp)
if _os.path.isfile(_fp):
with open(_fp, "r", encoding="utf-8") as _fh:
return self._serve_text(_fh.read(), "text/html; charset=utf-8")
return _json(self, 404, {"error": "not found"})
today = "2026-07-13"
steps_html = "".join(f'<li><strong>Step {i+1}.</strong> {s}</li>' for i, s in enumerate(h["steps"]))
Expand Down
64 changes: 64 additions & 0 deletions deadlines/annual-report-deadline/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OFAC annual blocked property report deadline | SanctionsAI</title>
<meta name="description" content="OFAC annual report of blocked property deadline. File by September 30 each year summarizing all property held as blocked.">
<link rel="canonical" href="https://sanctionsai.dev/deadlines/annual-report-deadline">
<meta property="og:title" content="OFAC annual blocked property report deadline | SanctionsAI">
<meta property="og:description" content="OFAC annual report of blocked property deadline. File by September 30 each year summarizing all property held as blocked.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://sanctionsai.dev/deadlines/annual-report-deadline">
<meta property="og:image" content="https://sanctionsai.dev/og.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="robots" content="index, follow, max-image-preview:large">
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "Article", "headline": "OFAC annual blocked property report deadline", "description": "OFAC annual report of blocked property deadline. File by September 30 each year summarizing all property held as blocked.", "author": {"@type": "Organization", "name": "SanctionsAI", "url": "https://sanctionsai.dev"}, "publisher": {"@type": "Organization", "name": "SanctionsAI", "url": "https://sanctionsai.dev"}, "mainEntityOfPage": {"@type": "WebPage", "@id": "https://sanctionsai.dev/deadlines/annual-report-deadline"}, "datePublished": "2026-08-09", "dateModified": "2026-08-09"}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://sanctionsai.dev/"}, {"@type": "ListItem", "position": 2, "name": "Deadlines", "item": "https://sanctionsai.dev/deadlines"}, {"@type": "ListItem", "position": 3, "name": "OFAC annual blocked property report deadline", "item": "https://sanctionsai.dev/deadlines/annual-report-deadline"}]}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "When is the OFAC annual report due?", "acceptedAnswer": {"@type": "Answer", "text": "September 30 each year. Covers the reporting period October 1 to September 30."}}, {"@type": "Question", "name": "Must I file if I have no new blocked property?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, if you still hold blocked property from prior years. The annual report covers ALL property held, not just new blocks."}}, {"@type": "Question", "name": "What goes in the annual report?", "acceptedAnswer": {"@type": "Answer", "text": "Property descriptions, SDN references, block dates, current values, and interest earned."}}, {"@type": "Question", "name": "Where do I file?", "acceptedAnswer": {"@type": "Answer", "text": "Via the OFAC online reporting portal. The report is filed electronically."}}]}</script>

<style>
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;line-height:1.65;color:#0a0a0a;max-width:760px;margin:0 auto;padding:2rem 1.25rem}
h1{font-size:2.1rem;line-height:1.2;margin:.3em 0}
h2{font-size:1.45rem;margin-top:2rem;border-bottom:2px solid #e5e7eb;padding-bottom:.3rem}
h3{font-size:1.15rem;margin-top:1.5rem}
a{color:#0066cc;text-decoration:none}a:hover{text-decoration:underline}
.lede{font-size:1.1rem;color:#374151;margin-bottom:1.5rem}
table{border-collapse:collapse;width:100%;margin:1rem 0;font-size:.95rem}
th,td{border:1px solid #e5e7eb;padding:.6rem .75rem;text-align:left}
th{background:#f9fafb;font-weight:600}
.callout{background:#f0f7ff;border-left:4px solid #0066cc;padding:1rem 1.25rem;margin:1.5rem 0;border-radius:0 .375rem .375rem 0}
.callout.warn{background:#fef3c7;border-left-color:#d97706}
.callout.good{background:#ecfdf5;border-left-color:#059669}
.cta{background:#0a0a0a;color:#fff;padding:2rem;border-radius:.5rem;text-align:center;margin:2rem 0}
.cta h2{border:none;color:#fff}
.cta a{display:inline-block;background:#00d4aa;color:#0a0a0a;padding:.6rem 1.5rem;border-radius:.375rem;font-weight:600;margin-top:.5rem}
.faq-section dt{font-weight:600;margin-top:1.2rem;font-size:1.05rem}.faq-section dd{margin:.3rem 0 0 0;color:#374151}
.byline{color:#6b7280;font-size:.85rem;margin-bottom:2rem}
code{background:#f3f4f6;padding:.1em .3em;border-radius:3px;font-size:.9em}
</style>
</head>
<body>
<p class="byline">By SanctionsAI team &middot; Updated 2026-08-09</p>
<h1>OFAC annual blocked property report deadline</h1>
<p class="lede">If you hold blocked property at any time during the year, you must file an annual report with OFAC by September 30.</p>
<h2>The deadline</h2>
<div class="callout warn"><strong>September 30</strong> each year. Required if you held blocked property at any point during the reporting period (October 1 to September 30).</div>
<h2>Who must file</h2>
<p>Any person or entity that holds blocked property, including: banks with frozen accounts, financial institutions that blocked transactions, crypto platforms with frozen wallets, and any entity holding SDN property.</p>
<h2>What to include</h2>
<table><tr><th>Information</th><th>Detail</th></tr>
<tr><td>Property description</td><td>Type, amount, asset identifier (wallet address, account number)</td></tr>
<tr><td>SDN reference</td><td>Name and program of the designated person</td></tr>
<tr><td>Date blocked</td><td>When the property was originally blocked</td></tr>
<tr><td>Current value</td><td>As of September 30</td></tr>
<tr><td>Interest earned</td><td>Any interest accrued during the year</td></tr></table>
<p><strong>Even if you hold no new blocked property:</strong> If you still hold property from prior years, you must file the annual report.</p>
<div class="cta"><h2>Screen your agent's next payment</h2>
<p style="color:#9ca3af;margin:.5rem 0">Check any wallet, name, or entity against OFAC, EU, UN sanctions lists in real time.</p>
<a href="/tools/wallet-checker">Free wallet checker</a></div>
<div class="faq-section"><h2>Frequently Asked Questions</h2><dl>
<dt>When is the OFAC annual report due?</dt><dd>September 30 each year. Covers the reporting period October 1 to September 30.</dd><dt>Must I file if I have no new blocked property?</dt><dd>Yes, if you still hold blocked property from prior years. The annual report covers ALL property held, not just new blocks.</dd><dt>What goes in the annual report?</dt><dd>Property descriptions, SDN references, block dates, current values, and interest earned.</dd><dt>Where do I file?</dt><dd>Via the OFAC online reporting portal. The report is filed electronically.</dd>
</dl></div>
<p><a href="/deadlines">&larr; Back to deadlines</a> &middot; <a href="/">SanctionsAI</a></p>
</body></html>
Loading
Loading