Developers
Offerwall integration guide
Embed the ClixWall offerwall in your website or app, then credit your users automatically with postbacks.
To integrate the offerwall, you need a publisher API key, a stable user ID for each person opening the Wall, and a postback URL on your server. Embed the Wall, then send a test conversion before launch.
New to offerwalls? Learn how they work, or see ClixWall for publishers.
- Websites
- React Native
- Expo
- Flutter
- Android
- iOS
Offerwall
Add the ClixWall offerwall to your website or app and give each user a stable ID.
Quick start
Four steps from sign up to your first credited conversion.
Add your website
Create a publisher account, then add your site or app under Websites. Each website gets its own API key.
Embed the Wall
Load the Wall URL in an iframe or WebView with your API key and the signed in user's ID.
Set your postback URL
We call it for every conversion and reversal so your server can credit the user.
Send a test postback
Open the website, then Settings, then Test, and check that your server credits the sample.
The Wall URL
Every integration loads the same URL. It identifies your website and the user who is earning.
https:/wall?api=YOUR_API_KEY&user=USER_ID
apiRequired- Your website's API key, from the website page.
userRequired- Your user's unique ID, URL encoded.
themeOptional- Color theme: light or dark.
Embed the Wall
Pick your platform. Every sample loads the Wall URL above.
Embed the Wall in any page with an iframe. Replace USER_ID with your signed in user's ID, URL encoded.
<iframesrc="https://clixwall.com/wall?api=YOUR_API_KEY&user=USER_ID"title="ClixWall offers"width="100%"height="600"frameborder="0"allow="clipboard-write"></iframe>
Install
For Expo, install the native module with Expo's installer. For a bare React Native app, add the package directly and follow its platform setup instructions.
# Exponpx expo install react-native-webview# Bare React Nativenpm install react-native-webview
React Native component
Use the user ID from your app. Each value is URL encoded before it goes into the URL.
import { WebView } from "react-native-webview";const API_KEY = "YOUR_API_KEY";const userId = "USER_ID_FROM_YOUR_APP";const offerwallUrl =`https://clixwall.com/wall?api=${encodeURIComponent(API_KEY)}&user=${encodeURIComponent(userId)}`;export default function OffersScreen() {return (<WebViewsource={{ uri: offerwallUrl }}style={{ flex: 1 }}javaScriptEnableddomStorageEnabledstartInLoadingState/>);}
Expo screen
Expo Go supports WebView. If you add other native modules, create a development build as those modules require.
import { WebView } from "react-native-webview";import { SafeAreaView } from "react-native-safe-area-context";export default function App() {const apiKey = "YOUR_API_KEY";const userId = "USER_ID_FROM_YOUR_APP";const uri = `https://clixwall.com/wall?api=${encodeURIComponent(apiKey)}&user=${encodeURIComponent(userId)}`;return (<SafeAreaView style={{ flex: 1 }}><WebViewsource={{ uri }}style={{ flex: 1 }}javaScriptEnableddomStorageEnabledstartInLoadingState/></SafeAreaView>);}
Install
Add webview_flutter and load the Wall in a WebViewWidget.
flutter pub add webview_flutter
Offerwall screen
import 'package:flutter/material.dart';import 'package:webview_flutter/webview_flutter.dart';class OffersScreen extends StatefulWidget {const OffersScreen({super.key});State<OffersScreen> createState() => _OffersScreenState();}class _OffersScreenState extends State<OffersScreen> {late final WebViewController controller;void initState() {super.initState();const apiKey = 'YOUR_API_KEY';const userId = 'USER_ID_FROM_YOUR_APP';final uri = Uri.https('clixwall.com', '/wall', {'api': apiKey,'user': userId,});controller = WebViewController()..setJavaScriptMode(JavaScriptMode.unrestricted)..loadRequest(uri);}Widget build(BuildContext context) {return Scaffold(body: WebViewWidget(controller: controller));}}
Android (Kotlin)
Add the Internet permission to AndroidManifest.xml and enable JavaScript only for the Wall'sWebView.
<!-- AndroidManifest.xml --><uses-permission android:name="android.permission.INTERNET" />
val offerwall = findViewById<WebView>(R.id.offerwall)offerwall.settings.javaScriptEnabled = trueofferwall.settings.domStorageEnabled = trueval uri = Uri.Builder().scheme("https").authority("clixwall.com").appendPath("wall").appendQueryParameter("api", "YOUR_API_KEY").appendQueryParameter("user", userIdFromYourBackend).build()offerwall.loadUrl(uri.toString())
iOS (Swift)
Use WKWebView and build the URL with URLComponents so query values are encoded safely.
import UIKitimport WebKitlet webView = WKWebView(frame: .zero)var components = URLComponents(string: "https://clixwall.com/wall")!components.queryItems = [URLQueryItem(name: "api", value: "YOUR_API_KEY"),URLQueryItem(name: "user", value: userIdFromYourBackend)]if let url = components.url {webView.load(URLRequest(url: url))}
Vue, Angular, Svelte and other frameworks use the same iframe. Set its source after your app has signed the user in and has their ID from your backend.
<iframesrc="https://clixwall.com/wall?api=YOUR_API_KEY&user=URL_ENCODED_USER_ID"title="ClixWall offers"width="100%"height="600"frameborder="0"allow="clipboard-write"></iframe>
Security and user IDs
YOUR_API_KEY with the key from your website page.Postback
A postback is a server to server call. When a user completes an offer or task, ClixWall calls your URL so you can credit them automatically.
URL format
https:/postback?user_id={user_id}&secret={secret}&user_payout={user_payout}&user_payout_usd={user_payout_usd}&publisher_payout={publisher_payout}&offer_id={offer_id}&offer_name={offer_name}&transaction_id={transaction_id}&status={status}
Use these readable variables anywhere in your URL. If the URL has no query parameters, ClixWall keeps sending the default fields: u, c, user_payout_usd, payout, cid and the other standard fields.
Use secret={secret} to receive the postback secret under the secret parameter. If you do not specify it in the URL, ClixWall sends it as pwd.
Variables
{user_id}- Your user's identifierDefault field:
u {secret}- Your website's postback secret. If omitted from your URL, it is sent as `pwd`.Default field:
pwd {user_payout}- User credit in your in-app currency (USD until you set a currency value)Default field:
c {user_payout_usd}- User's share in USD, before conversion to your in-app currencyDefault field:
user_payout_usd {publisher_payout}- Your payout in USDDefault field:
payout {offer_id}- Offer or task IDDefault field:
cid {offer_name}- Offer or task nameDefault field:
cname {transaction_id}- Unique conversion IDDefault field:
transaction_id {status}- Credit or reversal statusDefault field:
s
Test before you go live
If the test does not credit your user
If no request arrives, check that your HTTPS URL is public and your handler accepts a form-encoded POST. If the request arrives but the balance stays the same, compare the user ID, user payout, transaction ID and status with your server log. A successful HTTP response alone does not prove the reward was credited. Read more about how postback URLs work.
Offers API
Build your own offer list by fetching available offers from your server.
Base URL
https:/v1
Authentication
Use your active publisher API key as a Bearer token. Keep it on your server; do not put it in browser or app code.
Authorization: Bearer YOUR_API_KEYContent-Type: application/json
Get available offers
curl "https://api.clixwall.com/v1/offers?country=US&user_id=user_123" \-H "Authorization: Bearer YOUR_PUBLISHER_API_KEY"
Response:
{"success": true,"data": [{"id": 123,"name": "Complete Survey","description": "Complete a short survey","payout": 0.5,"currency": "$","category": "Surveys","click_url": "https://api.clixwall.com/v1/clicks"}]}
Need help?
Stuck on an integration step? Our team can check your setup with you.
Contact support