Developer platformCustomerCompliance

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.updated

Example: 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

On this page