# Verification Flows
Source: https://docs.fortepayments.io/access_levels_flows
Preview UI flows and identity requirements for access levels 1 through 3 in the Forte Compliance widget.
# Forte Compliance Widget – Product Guide
This guide helps developers quickly visualize how the Forte Compliance widget behaves at different access levels. Each level unlocks a new set of contact details, identity requirements, and UI steps.
## Access Level 1
### Identity Requirements
* Email address verification
* Wallet screening
### UI Screens
1. Email address collection
2. Email OTP verification
> 🧪 Use the OTP code sent to your email in sandbox mode to complete email verification.
## Access Level 2
### Identity Requirements
* Full name
* Verified phone number
### UI Screens
1. Requirements preview
2. Full name
3. Phone input & verification (SMS OTP)
> 🧪 Use the OTP `123456` in sandbox mode to bypass Phone SMS OTP verification.
4. Success / Pending / Rejected
## Access Level 3
### Identity Requirements
* Full name
* Verified phone number
The above identity steps only apply if the user has not completed Level 2 verification.
* Residential address
* Government-issued ID
* Live selfie
### UI Screens
1. Requirements preview
2. Full name
3. Residential address
4. Phone input & verification (SMS OTP)
> 🧪 Use the OTP `123456` in sandbox mode to bypass Phone SMS OTP verification.
5. ID document verification & live selfie
> **QR code for verification flow link**
>
> Users can scan the QR code to prompt user flow that captures their ID photos and live selfie via their mobile devices
6. Success / Pending / Rejected
***
***
# Product Overview
Source: https://docs.fortepayments.io/access_levels_guide
Preview Forte Compliance features and access levels.
# Forte Compliance – Overview
This guide helps developers understand how the Forte Compliance Widget works across multiple access levels. Each level introduces new contact details and identity requirements and corresponding UI steps, ensuring verification without compromising user experience.
### Access Level Flow Architecture
Forte implements a **graduated access level model**, where each level builds upon the previous one.
> Example: If a user is prompted for Level 3 verification but has not completed Level 2, the widget will automatically walk them through all Level 2 and Level 3 requirements in sequence.
This progressive structure removes the need for custom logic or separate API calls at each step, simplifying integration for developers.
### Session Resumption
The Forte on-chain compliance widget is state-aware and supports **resumable flows**. If a user drops off mid-session, you can re-initiate the flow with the same wallet and level, and the widget will resume from the last completed checkpoint.
To resume:
* Use the same `wallet.address` and `level`
* Call the [Initiate Access Level Verification Request API](/api-reference/endpoint/initiate-kyc-request)
* Embed the returned `widget_data` again
### **On-Chain Compliance Levels**
Forte Compliance is **interoperable** with the Forte Rules Engine to publish a wallet’s access level as an **on-chain access signal**. This allows developers and smart contracts to enforce rules based on a wallet’s access level status, without accessing sensitive off-chain data or relying on external APIs.
While the Forte Compliance widget and API can operate independently of Rules Engine, publishing access levels on-chain makes them interoperable with on-chain protocols, decentralized applications, token-gated experiences, etc.
**How It Works**
1. A user completes an Access Level session via the Forte widget.
2. Forte and its partners verify user data and assign an access level (e.g., Level 2) to the associated wallet.
3. The assigned level is published to a dedicated **on-chain compliance contract** using the Rules Engine policy execution layer.
4. Smart contracts can query this registry to determine whether a wallet meets the minimum access level for gated actions.
Forte and its Regulated Partners will complete standard compliance checks before assigning a level, in order to ensure that eligible users are able to proceed while maintaining regulatory and AML compliance.
**Example Use Cases**
* **Smart Contract Access Control**: Permit mints, purchases, or staking only for wallets that have completed Level 2+ verification.
* **Gameplay Unlocks**: Enable reward claiming, in-game asset upgrades, or PvP matchmaking based on verified compliance level.
**Notes:**
* Access levels committed on-chain via the Forte Compliance \<> [Forte Rules Engine](https://docs.forterulesengine.io) integration do not require any custom policy to function out-of-the-box.
* If Forte Compliance widget is integrated, verification and on-chain access level updates are handled via Forte Compliance.
* No user PII is exposed on-chain; only the wallet address and corresponding level are stored.
## Next Steps
Preview widget verification flows
# Access Control Level Contract
Source: https://docs.fortepayments.io/acl_contract
Overview of the on-chain Access Control Level (ACL) smart contract.
The Access Control Level Contract is an on-chain component which can be used to manage user permissions based on compliance status. It enables your application to determine whether a user has passed specific verification steps, by checking against the on-chain access levels assigned through the Forte Compliance widget flow.\
\
This contract is especially useful for enforcing compliance logic directly within your dApp or smart contracts—such as allowing verified users to access payment flows.
## Deployment Details
> Network: Base Sepolia
>
> Contract Address: `Contract Address will be provided directly by Forte team`
>
> Status: Verified & Published
**Who can set Access Levels?**
Only the Forte Compliance widget is authorized to set or remove access levels. When a user completes a required compliance check, the system updates their access level on-chain using this contract. This creates a transparent, verifiable source of truth that can be queried by any smart contract or application.
## Retrieving a User’s Access Level
To check a user’s access level, call the `getAccessLevel` function, passing in their wallet address. This is a read-only function that can be queried on-chain or from your dApp's frontend.
> *function getAccessLevel(address \_account) public view returns (uint256)*
### Expected Output
This function will return a uint8 value:
* `0`: Indicates that the user has not been verified.
* `1-3`: Indicates the Access Level the user has reached through the Forte Compliance widget.
You can integrate this function into your dApp frontend using [ethers.js](http://ethers.js), or [web3.js](http://web3.js) to dynamically allow/disallow actions based on access level.
### ABI Definition
```javascript theme={null}
{
"type": "function",
"name": "getAccessLevel",
"inputs": [
{
"name": "_account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
```
# Request Access Token
Source: https://docs.fortepayments.io/api-reference/endpoint/authentication
api-reference/openapi-auth.json POST /auth/v1/oauth2/token
Use your `client_id` and `client_secret` to
request an access token to authorize your API requests.
# Create Payment Intent
Source: https://docs.fortepayments.io/api-reference/endpoint/create-payment-intent
api-reference/openapi-payments.json POST /payments/v2/intent
Create a payment intent for a specific transaction type.
# Create Redirect Intent
Source: https://docs.fortepayments.io/api-reference/endpoint/create-redirect-intent
api-reference/openapi-payments.json POST /payments/v2/intent/redirect
Create a payment intent for the customer to be redirected on hosted UI and make a purchase there.
# Get Payment Statuses
Source: https://docs.fortepayments.io/api-reference/endpoint/get-payment-statuses
api-reference/openapi-payments.json POST /payments/v1/payments/statuses
Request statuses in batch for payments by their intent ids.
# Create KYC Intent
Source: https://docs.fortepayments.io/api-reference/endpoint/initiate-kyc-request
api-reference/openapi-payments.json POST /compliance/v2/kyc
Request a KYC session for a specific action.
# Create Subscription
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/create-subscription
api-reference/openapi-notifications.json POST /notifications/v1/subscriptions
Creates and returns a new webhook subscription.
# Delete Subscription
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/delete-subscription
api-reference/openapi-notifications.json DELETE /notifications/v1/subscriptions/{id}
Delete a webhook subscription with specific ID if it is currently disabled. This action is irreversible.
# Disable Subscription
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/disable-subscription
api-reference/openapi-notifications.json POST /notifications/v1/subscriptions/{id}/disable
Disable a webhook subscription with specific ID if it is currently enabled.
# Enable Subscription
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/enable-subscription
api-reference/openapi-notifications.json POST /notifications/v1/subscriptions/{id}/enable
Enable a webhook subscription with specific ID if it is currently disabled.
# Get Subscriptions
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/get-subscriptions
api-reference/openapi-notifications.json GET /notifications/v1/subscriptions
Get webhook subscription(s) belonging to the merchant.
# Replay Webhook
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/replay-webhook
api-reference/openapi-notifications.json POST /notifications/v1/webhooks/replay/{webhook_id}
Replay webhook with the given id,
given linked subscription is still enabled.
# Replay Webhooks
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/replay-webhooks
api-reference/openapi-notifications.json POST /notifications/v1/webhooks/replay
Replay all webhooks sent out in time range,
given linked subscription is still enabled.
# Test Subscription
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/test-subscription
api-reference/openapi-notifications.json POST /notifications/v1/subscriptions/{id}/test
Post a test webhook to the webhook subscription with specific ID.
# Update Subscription
Source: https://docs.fortepayments.io/api-reference/endpoint/notifications/update-subscription
api-reference/openapi-notifications.json PATCH /notifications/v1/subscriptions/{id}
Update a webhook subscription with specific ID.
# Get Widget Manifest
Source: https://docs.fortepayments.io/api-reference/endpoint/widget-manifest
api-reference/openapi-payments.json GET /payments/v1/widget/manifest
Response payload includes widget version and integrity digest (SHA-384)
# Compliance Events
Source: https://docs.fortepayments.io/compliance/compliance-events
Client-side events emitted by the Forte Compliance widget. Use these to update your UI after verification completes or the widget is closed.
The Forte Compliance widget emits client-side `CustomEvent`s that you can listen to on your page. Use these to handle post-verification UX — such as showing a confirmation message, unlocking a feature, or re-prompting the user if they abandoned the flow.
Client-side events confirm user action in the widget UI — not on-chain state. For authoritative access level confirmation, query the [ACL contract](/acl_contract) directly.
***
## Event Types
Emitted once the widget script has loaded and the widget is ready to be initialized.
A common pattern is to wrap the initialization call inside this listener:
```javascript theme={null}
window.addEventListener('FortePaymentsWidgetLoaded', () => {
window.initFortePaymentsWidget({
containerId: 'forte-payments-widget-container',
data
});
});
```
Emitted when the user closes the widget from the **success screen** after completing verification for the requested access level.
Use this event to unlock features, display a confirmation message, or refresh on-chain state in your UI.
Emitted when the user closes the widget from the **failure screen** after an unsuccessful verification attempt.
Use this event to display a fallback message or prompt the user to try again later.
Emitted when the user closes the widget **before completing verification** — from any screen that is not a terminal success or failure screen.
Verification flows are resumable. Previously provided information is retained — the user will not need to re-enter it when they re-open the widget.
***
## Event Listener Snippet
Add event listeners **before** the script that loads the Forte widget.
```javascript theme={null}
window.addEventListener('FortePaymentsWidgetLoaded', () => {
window.initFortePaymentsWidget({
containerId: 'forte-payments-widget-container',
data
});
});
window.addEventListener('ForteKycSuccess', function(event) {
console.log('Verification complete');
// e.g. unlock feature, show "Access Granted" toast
});
window.addEventListener('ForteKycFailure', function(event) {
console.log('Verification failed');
// e.g. display retry prompt
});
window.addEventListener('FortePaymentsWidgetClosed', function(event) {
console.log('Widget closed before completion');
// e.g. re-show the verification prompt
});
```
***
## Authoritative Access Level Confirmation
Client-side events are UI signals, not on-chain state. Before gating features or granting access, query the ACL contract directly to confirm the wallet's verified level.
Query on-chain access levels via the Forte ACL smart contract
# Create KYC Intent
Source: https://docs.fortepayments.io/compliance/initiate-kyc-request
Initiate an identity verification request using the Forte Compliance widget.
Once you have an [access token](/obtain-access-token), create a KYC intent for the target verification level. Forte returns the `widget_data` needed to initialize the Compliance widget.
## Endpoint
```
POST /compliance/v2/kyc
Authorization: Bearer {{access_token}}
```
## Request Body
Pass the desired `level` (1–3) and the user's wallet. For a breakdown of what each level requires, see [Verification Flows](/access_levels_flows).
```json theme={null}
{
"action": {
"type": "OCC_RULES_ENGINE",
"level": 3
},
"customer": {
"wallet": {
"blockchain": "base_sepolia",
"address": "0xF84D68F29664F907eE9d03E534105b7aA6045A"
},
"external_id": "0xF84D68F29664F907eE9d03E534105b7aA6045A"
}
}
```
### Field Reference
| Field | Required | Description |
| ---------------------------- | ----------- | ------------------------------------------- |
| `action.type` | Yes | Always `OCC_RULES_ENGINE` |
| `action.level` | Yes | Target access level: `1`, `2`, or `3` |
| `customer.wallet.blockchain` | Yes | Blockchain identifier (e.g. `base_sepolia`) |
| `customer.wallet.address` | Yes | User's wallet address |
| `customer.external_id` | Recommended | Your internal identifier for the user |
If a user needs Level 3 but has only completed Level 1, the widget automatically walks them through all outstanding requirements in sequence — no additional API calls are needed.
## Response
```json theme={null}
{
"data": {
"flow": "KYC_OCC",
"error_code": null,
"widget_data": "eyJhY2Nlc3NfdG9rZW4i..."
}
}
```
Pass the full `data` object to `initFortePaymentsWidget` — see [Integrate Widget](/integrate-widget).
## Next Steps
Embed and initialize the Forte widget with the response data
# 🚀 Get Started
Source: https://docs.fortepayments.io/index
Integrate Forte Payments and Forte Compliance into your application.
Forte provides two complementary SDKs for digital asset platforms - payments and compliance - each available as a fully-managed drop-in widget.
## Forte Payments
Accept fiat and crypto payments for Virtual Digital Goods. Built-in AML screening, 3DS, crypto wallet support, and graduated KYC - no sensitive data touches your servers.
Transaction types and integration overview
Start integrating in three steps
## Forte Compliance
Trigger graduated identity verification for your users - from email verification to full document KYC - using a drop-in widget. Access levels are optionally published on-chain.
Access levels, rules engine, and on-chain signals
Preview widget UI screens for each level
***
Full endpoint reference for all Forte APIs
Define and enforce on-chain compliance rules
# Integrate Widget
Source: https://docs.fortepayments.io/integrate-widget
Embed and initialize the Forte widget in your frontend. This step is the same for both Forte Payments and Forte Compliance.
After receiving a `data` object from either a [payment intent](/payments/initiate-payment-request) or a [KYC request](/compliance/initiate-kyc-request), embed and initialize the widget in your page.
***
## Step 1 — Embed the Widget Script
Add a container `
` and a `