Country Restrictions & Sanctions Screening
Stables enforces strict geographic and sanctions-based restrictions to comply with global AML/CTF regulations, FATF guidelines, UN sanctions, OFAC requirements, and local licensing rules.
This page explains how country restrictions work, how they impact the API, and what your application should expect when onboarding customers or executing payments.
1. Why Country Restrictions Exist
Stables must block access for users in certain regions due to:
- OFAC sanctions
- UN Security Council sanctions
- EU, UK, and AU regulator restrictions
- High-risk FATF jurisdictions
- Local licensing compliance requirements
- Geo-blocks from banking partners
- Correspondent banking limitations
Because payments and digital assets interact with regulated financial infrastructure, these restrictions are legally mandatory.
2. Types of Geographic Controls
Stables applies geographic restrictions at three layers:
2.1 Account Creation Layer
Certain countries cannot create Stables accounts at all.
If attempted:
{ "error": "restricted_region" }2.2 Payment Corridor Layer
Some country → country corridors are blocked or require additional KYC/KYB.
Example:
User in Country A cannot send to Country B due to AML risk.
The API will return:
{ "error": "corridor_not_supported" }2.3 Rail & Network Layer
Some local bank rails impose their own geo-restrictions.
Examples:
- SEPA only for EEA countries
- ACH only for US users
- PIX only for Brazilian recipients
If a rail is unavailable:
{ "error": "unsupported_route" }3. Full Sanctions Screening Logic
Every customer is screened against:
- OFAC SDN list
- EU sanctions lists
- UK HMT
- UN sanctions lists
- Domestic watchlists (depending on region)
- Politically Exposed Persons (PEP) datasets
Screening occurs:
- At signup
- At KYC submission
- Continuously in the background
- Before high-value payments
If a sanctions match occurs:
error: "sanctions_match"or
error: "compliance_block"User account is frozen until manually reviewed.
4. High-Risk and Restricted Countries
Stables restricts usage for:
Comprehensively Sanctioned Countries
- Cuba
- Iran
- North Korea
- Syria
- Crimea, Donetsk, Luhansk regions
- Any other region under active UN/OFAC comprehensive sanctions
High-Risk FATF Jurisdictions
Enhanced checks or complete restrictions apply.
Examples:
- Myanmar
- Yemen
- Ethiopia
- South Sudan
- Pakistan (limited depending on corridor)
- Turkey (risk-based, not fully blocked)
Actual list may change based on regulatory updates.
5. How Restrictions Affect API Behavior
The API enforces restrictions automatically.
During Customer Creation
If a user is in a blocked country:
{
"error": "restricted_region",
"message": "Your region is not supported due to regulatory requirements."
}During KYC / KYB
If document country = sanctioned country:
error: "restricted_jurisdiction"During Payment Creation
If the corridor is not allowed:
error: "corridor_not_supported"If the payment destination is sanctioned:
error: "sanctions_match"If the payment rail is unavailable:
error: "unsupported_route"6. IP, GPS & Device-Based Geolocation Checks
Stables uses multiple signals to determine a user’s country:
- IP address
- Device location
- Document issuing country
- SIM card information (mobile usage)
- Card issuing country (BIN-based geolocation)
- Bank account country
- Transaction patterns
If inconsistencies arise (e.g., IP in Iran but document from Singapore):
error: "geo_mismatch"or a manual review is triggered.
7. Edge Cases Developers Should Handle
VPN usage
Users on VPN may trigger geo-blocks.
Prompt users to disable VPN if flagged.
Dual residency
User may live in one country but hold a document from another.
Allowed but may require L2 verification.
Temporary travel
User may travel to a restricted region.
Platform must prevent transacting from blocked IP ranges.
Virtual offices
Virtual/PO Box addresses often rejected for KYB.
Must provide a real operating address.
8. Webhooks for Sanctions & Geo Events
All blocks or escalations appear in:
kyc.updated
payment.updated
customer.updatedExample: Sanctions Match Detected
{
"event": "customer.updated",
"data": {
"customerId": "cus_001",
"status": "frozen",
"reason": "sanctions_match"
}
}Example: Geo Restriction
{
"event": "payment.updated",
"data": {
"paymentId": "pay_001",
"status": "failed",
"errorCode": "restricted_region"
}
}9. Developer Best Practices
- Always check and store the user’s country in your DB
- Geofence high-risk corridors in your app UI
- Validate recipient country before calling
POST /payments - Educate users about VPN issues
- Use clear messaging: “This corridor is not supported in your region.”
- Regularly sync lists of restricted jurisdictions
- Build graceful fallbacks when a corridor can't be used