Developer API
Shorten links, generate QR codes, manage campaigns and read your statistics from your own applications with a simple JSON REST API.
Introduction
The API lets you use every main feature of RWZ programmatically. It is organized around REST: it has predictable resource-oriented URLs, accepts JSON or form-encoded request bodies and returns JSON responses with standard HTTP status codes.
Every request must be sent over HTTPS (in production) to the base URL below and must be authenticated with your API key. All dates are expressed in UTC using the YYYY-MM-DD HH:MM:SS format.
Links
Shorten, target, protect and update links in real time.
Statistics
Read clicks, countries, referrers, browsers and more.
QR codes & more
QR codes, domains, campaigns, channels and pixels.
Authentication
To authenticate, send your API key as a Bearer token in the Authorization header of every request. Keep your key secret: anyone with it can manage your account. You can regenerate it at any time, which immediately invalidates the previous one.
curl --location --request GET 'https://rwz.fr/api/account' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
Legacy clients may also send the key in the query string (?key=YOUR_API_KEY). Prefer the header: URLs are often logged.
Rate limits
To keep the service fast and stable, the number of requests per API key is limited per minute. The limit depends on your plan (default: 60 requests per minute). When it is exceeded the API answers with HTTP 429 until the window resets.
X-RateLimit-Limit | Maximum number of requests per minute. |
X-RateLimit-Remaining | Requests left in the current window. |
X-RateLimit-Reset | Unix timestamp at which the window resets. |
Retry-After | Seconds to wait (sent with 429 responses). |
- FreeNot included
- Pro60 / min
- Business300 / min
Responses & errors
Every response is a JSON object. Always check the error key first: 0 means the request succeeded, 1 means it failed and message explains why. The HTTP status code is also set accordingly. List endpoints are paginated with the limit and page parameters and return result (total), perpage, currentpage, nextpage and maxpage.
{
"error": 0,
"id": 3,
"shorturl": "https://rwz.fr/google"
}{
"error": 1,
"message": "This alias is already taken. Please choose another one.",
"field": "alias"
}| Status | Meaning |
|---|---|
| 200 | The request succeeded. |
| 400 | Invalid parameters: the message (and field) explain what is wrong. |
| 401 | Missing or invalid API key. |
| 403 | The feature is not available in your plan, your account is not active or the endpoint is reserved to administrators. |
| 404 | The resource does not exist or does not belong to you. |
| 409 | The resource already exists (domain, email, slug…). |
| 429 | Too many requests: wait until the rate limit window resets. |
| 500 | Unexpected server error. Please try again later. |
Account
Retrieve and update the account the API key belongs to.
Get account
/api/account
Returns the details of your account, your plan and your usage.
Example request
curl --location --request GET 'https://rwz.fr/api/account' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/account', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/account',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/account"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"id": 1,
"email": "sample@domain.com",
"username": "sampleuser",
"name": "Sample User",
"avatar": "https://rwz.fr/uploads/avatars/avatar.png",
"status": "pro",
"plan": {
"id": 2,
"name": "Pro",
"free": false
},
"expires": "2027-11-15 15:00:00",
"registered": "2026-01-10 18:01:43",
"timezone": "UTC",
"api": {
"rate_limit": 60
},
"usage": {
"links": {
"used": 120,
"limit": 5000
}
}
}
}
Update account
/api/account/update
Updates the email address and/or the password of your account. Changing the password logs out every browser session.
Parameters
| Parameter | Description |
|---|---|
emailstring |
optionalNew email address. |
passwordstring |
optionalNew password (at least 6 characters). |
namestring |
optionalDisplay name. |
Example request
curl --location --request PUT 'https://rwz.fr/api/account/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "newemail@google.com",
"password": "newpassword"
}'const response = await fetch('https://rwz.fr/api/account/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "newemail@google.com",
"password": "newpassword"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/account/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'email' => 'newemail@google.com',
'password' => 'newpassword'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/account/update"
payload = {
"email": "newemail@google.com",
"password": "newpassword"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"message": "Account has been successfully updated."
}
Links
Create, list, update and delete your short links.
List links
/api/urls
Returns your links, newest first. When the short parameter is used, every other parameter is ignored and a single link (same format as "Get a single link") is returned.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
orderstring |
optionalSort by date (default) or clicks. |
qstring |
optionalSearch in the alias, destination, title and notes. |
shortstring |
optionalFind a link by its short URL (or alias). |
campaigninteger |
optionalOnly links of this campaign. |
Example request
curl --location --request GET 'https://rwz.fr/api/urls?limit=2&page=1&order=date' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/urls?limit=2&page=1&order=date', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/urls?limit=2&page=1&order=date',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/urls?limit=2&page=1&order=date"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"urls": [
{
"id": 1,
"alias": "google",
"shorturl": "https://rwz.fr/google",
"longurl": "https://google.com",
"title": "Google",
"description": "For Facebook",
"kind": "link",
"domain": null,
"redirect_type": "direct",
"password": false,
"expires_at": null,
"clicks": 128,
"unique_clicks": 97,
"public_stats": false,
"status": "active",
"date": "2026-01-10 18:01:43"
},
{
"id": 2,
"alias": "googlecanada",
"shorturl": "https://rwz.fr/googlecanada",
"longurl": "https://google.ca",
"title": "Google Canada",
"description": null,
"kind": "link",
"domain": null,
"redirect_type": "direct",
"password": false,
"expires_at": null,
"clicks": 15,
"unique_clicks": 12,
"public_stats": false,
"status": "active",
"date": "2026-01-09 11:20:01"
}
]
}
}
Get a single link
/api/url/1
Returns the details of a link with an all-time statistics summary.
Example request
curl --location --request GET 'https://rwz.fr/api/url/1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/url/1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/url/1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/url/1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"id": 1,
"details": {
"id": 1,
"alias": "google",
"shorturl": "https://rwz.fr/google",
"longurl": "https://google.com",
"title": "Google",
"description": "For Facebook",
"kind": "link",
"domain": null,
"redirect_type": "direct",
"password": false,
"expires_at": null,
"clicks": 128,
"unique_clicks": 97,
"public_stats": false,
"status": "active",
"date": "2026-01-10 18:01:43",
"location": {
"canada": "https://google.ca",
"united states": "https://google.us"
},
"device": {
"iphone": "https://apps.apple.com",
"android": "https://play.google.com"
},
"expiry": null
},
"data": {
"clicks": 128,
"uniqueClicks": 97,
"topCountries": {
"United States": 54,
"Canada": 31
},
"topReferrers": {
"Direct, email & other": 70,
"twitter.com": 33
},
"topBrowsers": {
"Chrome": 80,
"Safari": 40
},
"topOs": {
"Windows": 60,
"iOS": 41
},
"socialCount": {
"facebook": 12,
"twitter": 33,
"instagram": 4
}
}
}
Shorten a link
/api/url/add
Creates a short link. Only the url parameter is required; every option is subject to the permissions of your plan.
Parameters
| Parameter | Description |
|---|---|
urlstring |
requiredThe long URL to shorten. |
customstring |
optionalCustom alias used instead of a random one. |
typestring |
optionalRedirect type: direct, frame, splash, splash-{id} (custom splash page) or overlay-{id} (CTA overlay). |
passwordstring |
optionalProtect the link with a password (send an empty value on update to remove it). |
domainstring |
optionalBranded domain to use, e.g. brand.link (see /api/domains). Defaults to your default domain. |
expirydatetime |
optionalExpiration date, e.g. 2030-12-31 23:59:00 (in your account timezone, or ISO 8601 with offset). |
expirationredirectstring |
optionalURL the visitors are sent to once the link has expired. |
clicklimitinteger |
optionalDisable the link after this number of clicks (0 = unlimited). |
geotargetarray |
optionalGeo targeting: list of { location, link } where location is a country name or ISO code. |
devicetargetarray |
optionalDevice targeting: list of { device, link }. Devices: iPhone, iPad, Android, Android Tablet, Windows Phone, Windows, macOS, Linux, Chrome OS, BlackBerry, Kindle, Mobile, Tablet, Desktop. |
languagetargetarray |
optionalLanguage targeting: list of { language, link } where language is an ISO 639-1 code (en, fr, ...). |
metatitlestring |
optionalCustom meta title shown in social previews. |
metadescriptionstring |
optionalCustom meta description shown in social previews. |
metaimagestring |
optionalURL of a custom image (jpg, png) shown in social previews. |
descriptionstring |
optionalPrivate note attached to the link. |
pixelsarray |
optionalList of tracking pixel IDs (see /api/pixels). |
campaigninteger |
optionalID of the campaign the link belongs to. |
channelinteger |
optionalID (or list of IDs) of the channels the link is added to. |
deeplinkobject |
optionalDeep links to mobile apps: { "apple": "https://apps.apple.com/...", "google": "https://play.google.com/..." }. |
parametersarray |
optionalParameters appended to the destination: list of { name, value }. |
statusstring |
optionalpublic to enable the public statistics page, private otherwise. |
Example request
curl --location --request POST 'https://rwz.fr/api/url/add' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https://google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2030-11-11 12:00:00",
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https://www.example.com/og.png",
"description": "For Facebook",
"pixels": [
1,
2
],
"channel": 1,
"campaign": 1,
"deeplink": {
"apple": "https://apps.apple.com/us/app/google/id284815942",
"google": "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox"
},
"geotarget": [
{
"location": "Canada",
"link": "https://google.ca"
},
{
"location": "United States",
"link": "https://google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https://google.com"
},
{
"device": "Android",
"link": "https://google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https://google.com"
},
{
"language": "fr",
"link": "https://google.ca"
}
],
"parameters": [
{
"name": "aff",
"value": "3"
},
{
"name": "utm_source",
"value": "api"
}
]
}'const response = await fetch('https://rwz.fr/api/url/add', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2030-11-11 12:00:00",
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https://www.example.com/og.png",
"description": "For Facebook",
"pixels": [
1,
2
],
"channel": 1,
"campaign": 1,
"deeplink": {
"apple": "https://apps.apple.com/us/app/google/id284815942",
"google": "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox"
},
"geotarget": [
{
"location": "Canada",
"link": "https://google.ca"
},
{
"location": "United States",
"link": "https://google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https://google.com"
},
{
"device": "Android",
"link": "https://google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https://google.com"
},
{
"language": "fr",
"link": "https://google.ca"
}
],
"parameters": [
{
"name": "aff",
"value": "3"
},
{
"name": "utm_source",
"value": "api"
}
]
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/url/add',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://google.com',
'status' => 'private',
'custom' => 'google',
'password' => 'mypass',
'expiry' => '2030-11-11 12:00:00',
'type' => 'splash',
'metatitle' => 'Not Google',
'metadescription' => 'Not Google description',
'metaimage' => 'https://www.example.com/og.png',
'description' => 'For Facebook',
'pixels' => [
1,
2
],
'channel' => 1,
'campaign' => 1,
'deeplink' => [
'apple' => 'https://apps.apple.com/us/app/google/id284815942',
'google' => 'https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox'
],
'geotarget' => [
[
'location' => 'Canada',
'link' => 'https://google.ca'
],
[
'location' => 'United States',
'link' => 'https://google.us'
]
],
'devicetarget' => [
[
'device' => 'iPhone',
'link' => 'https://google.com'
],
[
'device' => 'Android',
'link' => 'https://google.com'
]
],
'languagetarget' => [
[
'language' => 'en',
'link' => 'https://google.com'
],
[
'language' => 'fr',
'link' => 'https://google.ca'
]
],
'parameters' => [
[
'name' => 'aff',
'value' => '3'
],
[
'name' => 'utm_source',
'value' => 'api'
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/url/add"
payload = {
"url": "https://google.com",
"status": "private",
"custom": "google",
"password": "mypass",
"expiry": "2030-11-11 12:00:00",
"type": "splash",
"metatitle": "Not Google",
"metadescription": "Not Google description",
"metaimage": "https://www.example.com/og.png",
"description": "For Facebook",
"pixels": [
1,
2
],
"channel": 1,
"campaign": 1,
"deeplink": {
"apple": "https://apps.apple.com/us/app/google/id284815942",
"google": "https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox"
},
"geotarget": [
{
"location": "Canada",
"link": "https://google.ca"
},
{
"location": "United States",
"link": "https://google.us"
}
],
"devicetarget": [
{
"device": "iPhone",
"link": "https://google.com"
},
{
"device": "Android",
"link": "https://google.com"
}
],
"languagetarget": [
{
"language": "en",
"link": "https://google.com"
},
{
"language": "fr",
"link": "https://google.ca"
}
],
"parameters": [
{
"name": "aff",
"value": "3"
},
{
"name": "utm_source",
"value": "api"
}
]
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 3,
"shorturl": "https://rwz.fr/google"
}
Update a link
/api/url/1/update
Updates a link. Send only the parameters you want to change (same parameters as "Shorten a link").
Parameters
| Parameter | Description |
|---|---|
urlstring |
optionalThe long URL to shorten. |
customstring |
optionalCustom alias used instead of a random one. |
typestring |
optionalRedirect type: direct, frame, splash, splash-{id} (custom splash page) or overlay-{id} (CTA overlay). |
passwordstring |
optionalProtect the link with a password (send an empty value on update to remove it). |
domainstring |
optionalBranded domain to use, e.g. brand.link (see /api/domains). Defaults to your default domain. |
expirydatetime |
optionalExpiration date, e.g. 2030-12-31 23:59:00 (in your account timezone, or ISO 8601 with offset). |
expirationredirectstring |
optionalURL the visitors are sent to once the link has expired. |
clicklimitinteger |
optionalDisable the link after this number of clicks (0 = unlimited). |
geotargetarray |
optionalGeo targeting: list of { location, link } where location is a country name or ISO code. |
devicetargetarray |
optionalDevice targeting: list of { device, link }. Devices: iPhone, iPad, Android, Android Tablet, Windows Phone, Windows, macOS, Linux, Chrome OS, BlackBerry, Kindle, Mobile, Tablet, Desktop. |
languagetargetarray |
optionalLanguage targeting: list of { language, link } where language is an ISO 639-1 code (en, fr, ...). |
metatitlestring |
optionalCustom meta title shown in social previews. |
metadescriptionstring |
optionalCustom meta description shown in social previews. |
metaimagestring |
optionalURL of a custom image (jpg, png) shown in social previews. |
descriptionstring |
optionalPrivate note attached to the link. |
pixelsarray |
optionalList of tracking pixel IDs (see /api/pixels). |
campaigninteger |
optionalID of the campaign the link belongs to. |
channelinteger |
optionalID (or list of IDs) of the channels the link is added to. |
deeplinkobject |
optionalDeep links to mobile apps: { "apple": "https://apps.apple.com/...", "google": "https://play.google.com/..." }. |
parametersarray |
optionalParameters appended to the destination: list of { name, value }. |
statusstring |
optionalpublic to enable the public statistics page, private otherwise. |
Example request
curl --location --request PUT 'https://rwz.fr/api/url/1/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https://google.com/new",
"custom": "google",
"status": "public",
"geotarget": [
{
"location": "France",
"link": "https://google.fr"
}
]
}'const response = await fetch('https://rwz.fr/api/url/1/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://google.com/new",
"custom": "google",
"status": "public",
"geotarget": [
{
"location": "France",
"link": "https://google.fr"
}
]
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/url/1/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://google.com/new',
'custom' => 'google',
'status' => 'public',
'geotarget' => [
[
'location' => 'France',
'link' => 'https://google.fr'
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/url/1/update"
payload = {
"url": "https://google.com/new",
"custom": "google",
"status": "public",
"geotarget": [
{
"location": "France",
"link": "https://google.fr"
}
]
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 1,
"short": "https://rwz.fr/google",
"shorturl": "https://rwz.fr/google"
}
Delete a link
/api/url/1/delete
Deletes a link and its statistics. This cannot be undone.
Example request
curl --location --request DELETE 'https://rwz.fr/api/url/1/delete' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/url/1/delete', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/url/1/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/url/1/delete"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Link has been deleted successfully."
}
Quick shorten (simple API)
/api
Legacy one-line endpoint for scripts and tools that can only send GET requests. The key can be sent as key or api. Returns the short URL as plain text with format=text, JSON otherwise.
Parameters
| Parameter | Description |
|---|---|
keystring |
requiredYour API key. |
urlstring |
requiredThe long URL to shorten. |
customstring |
optionalCustom alias. |
domainstring |
optionalBranded domain. |
formatstring |
optionaljson (default) or text. |
Example request
curl --location --request GET 'https://rwz.fr/api?key=YOUR_API_KEY&url=https%3A%2F%2Fgoogle.com&custom=google&format=text'
const response = await fetch('https://rwz.fr/api?key=YOUR_API_KEY&url=https%3A%2F%2Fgoogle.com&custom=google&format=text', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api?key=YOUR_API_KEY&url=https%3A%2F%2Fgoogle.com&custom=google&format=text',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api?key=YOUR_API_KEY&url=https%3A%2F%2Fgoogle.com&custom=google&format=text"
headers = {
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"short": "https://rwz.fr/google",
"shorturl": "https://rwz.fr/google"
}
Branded Domains
Manage the branded domains of your account. New domains are activated once their DNS points to our server.
List domains
/api/domains
Returns your branded domains.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/domains?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/domains?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/domains?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/domains?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"domains": [
{
"id": 1,
"domain": "https://domain1.com",
"redirectroot": "https://rootdomain.com",
"redirect404": "https://rootdomain.com/404",
"status": "active",
"links": 42,
"date": "2026-01-10 18:01:43"
},
{
"id": 2,
"domain": "https://domain2.com",
"redirectroot": "https://rootdomain2.com",
"redirect404": null,
"status": "pending",
"links": 0,
"date": "2026-01-12 09:00:00"
}
]
}
}
Add a domain
/api/domain/add
Adds a branded domain. Point an A record (or CNAME) of the domain to our server.
Parameters
| Parameter | Description |
|---|---|
domainstring |
requiredDomain name, e.g. brand.link (without path). |
redirectrootstring |
optionalURL visitors are sent to when they open the root of the domain. |
redirect404string |
optionalURL visitors are sent to when a short link does not exist. |
Example request
curl --location --request POST 'https://rwz.fr/api/domain/add' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"domain": "brand.link",
"redirectroot": "https://example.com",
"redirect404": "https://example.com/404"
}'const response = await fetch('https://rwz.fr/api/domain/add', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"domain": "brand.link",
"redirectroot": "https://example.com",
"redirect404": "https://example.com/404"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/domain/add',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'domain' => 'brand.link',
'redirectroot' => 'https://example.com',
'redirect404' => 'https://example.com/404'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/domain/add"
payload = {
"domain": "brand.link",
"redirectroot": "https://example.com",
"redirect404": "https://example.com/404"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 1
}
Update a domain
/api/domain/1/update
Updates the redirections of a domain.
Parameters
| Parameter | Description |
|---|---|
redirectrootstring |
optionalRoot redirection URL. |
redirect404string |
optionalNot found redirection URL. |
Example request
curl --location --request PUT 'https://rwz.fr/api/domain/1/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"redirectroot": "https://example.com",
"redirect404": "https://example.com/404"
}'const response = await fetch('https://rwz.fr/api/domain/1/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"redirectroot": "https://example.com",
"redirect404": "https://example.com/404"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/domain/1/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'redirectroot' => 'https://example.com',
'redirect404' => 'https://example.com/404'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/domain/1/update"
payload = {
"redirectroot": "https://example.com",
"redirect404": "https://example.com/404"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"message": "Domain has been updated successfully."
}
Delete a domain
/api/domain/1/delete
Deletes a domain. Its links are moved to the main domain.
Example request
curl --location --request DELETE 'https://rwz.fr/api/domain/1/delete' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/domain/1/delete', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/domain/1/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/domain/1/delete"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Domain has been deleted successfully."
}
Campaigns
Group links into campaigns with an optional public list and a link rotator.
List campaigns
/api/campaigns
Returns your campaigns.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/campaigns?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/campaigns?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/campaigns?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/campaigns?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"campaigns": [
{
"id": 1,
"name": "Sample Campaign",
"slug": "sample-campaign",
"public": false,
"rotator": false,
"list": false,
"links": 4,
"clicks": 230,
"date": "2026-01-10 18:01:43"
},
{
"id": 2,
"name": "Facebook Campaign",
"slug": "facebook",
"public": true,
"rotator": "https://rwz.fr/r/facebook",
"list": "https://rwz.fr/campaign/facebook",
"links": 2,
"clicks": 87,
"date": "2026-01-11 10:00:00"
}
]
}
}
Create a campaign
/api/campaign/add
Creates a campaign.
Parameters
| Parameter | Description |
|---|---|
namestring |
requiredCampaign name. |
slugstring |
optionalSlug used by the rotator and the public list (generated from the name when empty). |
publicboolean |
optionalMake the list of links public. |
rotatorboolean |
optionalEnable the link rotator (/r/{slug}). |
descriptionstring |
optionalDescription. |
Example request
curl --location --request POST 'https://rwz.fr/api/campaign/add' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "New Campaign",
"slug": "new-campaign",
"public": true
}'const response = await fetch('https://rwz.fr/api/campaign/add', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "New Campaign",
"slug": "new-campaign",
"public": true
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/campaign/add',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'New Campaign',
'slug' => 'new-campaign',
'public' => true
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/campaign/add"
payload = {
"name": "New Campaign",
"slug": "new-campaign",
"public": True
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 3,
"name": "New Campaign",
"public": true,
"rotator": false,
"list": "https://rwz.fr/campaign/new-campaign"
}
Assign a link to a campaign
/api/campaign/1/assign/2
Adds a link (ID in the URL) to a campaign: /api/campaign/{campaignid}/assign/{linkid}.
Example request
curl --location --request POST 'https://rwz.fr/api/campaign/1/assign/2' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/campaign/1/assign/2', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/campaign/1/assign/2',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/campaign/1/assign/2"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Link successfully added to the campaign."
}
Update a campaign
/api/campaign/1/update
Updates a campaign.
Parameters
| Parameter | Description |
|---|---|
namestring |
optionalCampaign name. |
slugstring |
optionalSlug. |
publicboolean |
optionalPublic list. |
rotatorboolean |
optionalLink rotator. |
Example request
curl --location --request PUT 'https://rwz.fr/api/campaign/1/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true
}'const response = await fetch('https://rwz.fr/api/campaign/1/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": true
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/campaign/1/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Twitter Campaign',
'slug' => 'twitter-campaign',
'public' => true
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/campaign/1/update"
payload = {
"name": "Twitter Campaign",
"slug": "twitter-campaign",
"public": True
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 1,
"name": "Twitter Campaign",
"public": true,
"rotator": false,
"list": "https://rwz.fr/campaign/twitter-campaign"
}
Delete a campaign
/api/campaign/1/delete
Deletes a campaign (its links are kept).
Example request
curl --location --request DELETE 'https://rwz.fr/api/campaign/1/delete' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/campaign/1/delete', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/campaign/1/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/campaign/1/delete"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Campaign has been deleted successfully."
}
Channels
Organize links, bio pages and QR codes into channels.
List channels
/api/channels
Returns your channels.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/channels?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/channels?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/channels?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/channels?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"channels": [
{
"id": 1,
"name": "Channel 1",
"description": "Description of channel 1",
"color": "#000000",
"starred": true,
"items": 12,
"date": "2026-01-10 18:01:43"
},
{
"id": 2,
"name": "Channel 2",
"description": null,
"color": "#ff0000",
"starred": false,
"items": 3,
"date": "2026-01-11 08:30:00"
}
]
}
}
List channel items
/api/channel/1
Returns the items (links, bio pages, QR codes) of a channel.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/channel/1?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/channel/1?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/channel/1?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/channel/1?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 2,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"items": [
{
"type": "links",
"id": 1,
"title": "My Sample Link",
"preview": "https://google.com",
"link": "https://rwz.fr/google",
"date": "2026-05-12 10:00:00"
},
{
"type": "bio",
"id": 1,
"title": "My Sample Bio",
"preview": "https://rwz.fr/mybio",
"link": "https://rwz.fr/mybio",
"date": "2026-06-01 12:00:00"
}
]
}
}
Create a channel
/api/channel/add
Creates a channel.
Parameters
| Parameter | Description |
|---|---|
namestring |
requiredChannel name. |
descriptionstring |
optionalDescription. |
colorstring |
optionalBadge color (hex, e.g. #000000). |
starredboolean |
optionalStar the channel. |
Example request
curl --location --request POST 'https://rwz.fr/api/channel/add' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}'const response = await fetch('https://rwz.fr/api/channel/add', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/channel/add',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'New Channel',
'description' => 'my new channel',
'color' => '#000000',
'starred' => true
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/channel/add"
payload = {
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": True
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 3,
"name": "New Channel",
"description": "my new channel",
"color": "#000000",
"starred": true
}
Assign an item to a channel
/api/channel/1/assign/link/1
Adds an item to a channel: /api/channel/{channelid}/assign/{type}/{itemid} where type is link, bio or qr.
Example request
curl --location --request POST 'https://rwz.fr/api/channel/1/assign/link/1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/channel/1/assign/link/1', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/channel/1/assign/link/1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/channel/1/assign/link/1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Item successfully added to the channel."
}
Update a channel
/api/channel/1/update
Updates a channel.
Parameters
| Parameter | Description |
|---|---|
namestring |
optionalChannel name. |
descriptionstring |
optionalDescription. |
colorstring |
optionalBadge color. |
starredboolean |
optionalStarred. |
Example request
curl --location --request PUT 'https://rwz.fr/api/channel/1/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Acme Corp",
"color": "#FFFFFF",
"starred": false
}'const response = await fetch('https://rwz.fr/api/channel/1/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Acme Corp",
"color": "#FFFFFF",
"starred": false
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/channel/1/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Acme Corp',
'color' => '#FFFFFF',
'starred' => false
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/channel/1/update"
payload = {
"name": "Acme Corp",
"color": "#FFFFFF",
"starred": False
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"message": "Channel has been updated successfully."
}
Delete a channel
/api/channel/1/delete
Deletes a channel (its items are kept).
Example request
curl --location --request DELETE 'https://rwz.fr/api/channel/1/delete' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/channel/1/delete', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/channel/1/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/channel/1/delete"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Channel has been deleted successfully."
}
Pixels
Manage the retargeting pixels fired when your links are clicked.
List pixels
/api/pixels
Returns your tracking pixels.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/pixels?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/pixels?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/pixels?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/pixels?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"pixels": [
{
"id": 1,
"type": "gtm",
"name": "GTM Pixel",
"tag": "GTM-ABCDE12",
"date": "2026-01-10 18:00:00"
},
{
"id": 2,
"type": "facebook",
"name": "Facebook Pixel",
"tag": "123456789012345",
"date": "2026-01-10 18:10:00"
}
]
}
}
Create a pixel
/api/pixel/add
Creates a tracking pixel.
Parameters
| Parameter | Description |
|---|---|
typestring |
requiredProvider: facebook (fbpixel), gtag (gapixel), adwords (adwordspixel), gtm (gtmpixel), linkedin, twitter, adroll, quora, pinterest, bing, snapchat, reddit, tiktok, clarity. |
namestring |
requiredName of the pixel. |
tagstring |
requiredPixel / tracking ID. |
Example request
curl --location --request POST 'https://rwz.fr/api/pixel/add' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE12"
}'const response = await fetch('https://rwz.fr/api/pixel/add', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE12"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/pixel/add',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => 'gtmpixel',
'name' => 'My GTM',
'tag' => 'GTM-ABCDE12'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/pixel/add"
payload = {
"type": "gtmpixel",
"name": "My GTM",
"tag": "GTM-ABCDE12"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 1
}
Update a pixel
/api/pixel/1/update
Updates a pixel.
Parameters
| Parameter | Description |
|---|---|
namestring |
optionalName. |
tagstring |
optionalPixel / tracking ID. |
Example request
curl --location --request PUT 'https://rwz.fr/api/pixel/1/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "My GTM",
"tag": "GTM-ABCDE12"
}'const response = await fetch('https://rwz.fr/api/pixel/1/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "My GTM",
"tag": "GTM-ABCDE12"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/pixel/1/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'My GTM',
'tag' => 'GTM-ABCDE12'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/pixel/1/update"
payload = {
"name": "My GTM",
"tag": "GTM-ABCDE12"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"message": "Pixel has been updated successfully."
}
Delete a pixel
/api/pixel/1/delete
Deletes a pixel and removes it from your links.
Example request
curl --location --request DELETE 'https://rwz.fr/api/pixel/1/delete' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/pixel/1/delete', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/pixel/1/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/pixel/1/delete"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "Pixel has been deleted successfully."
}
Custom Splash
Custom splash pages that can be used as a redirect type (type = splash-{id}).
List splash pages
/api/splash
Returns your custom splash pages.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/splash?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/splash?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/splash?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/splash?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"splash": [
{
"id": 1,
"name": "Product 1 Promo",
"type": "splash-1",
"date": "2026-01-10 18:00:00"
},
{
"id": 2,
"name": "Product 2 Promo",
"type": "splash-2",
"date": "2026-01-10 18:10:00"
}
]
}
}
CTA Overlays
Call-to-action overlays that can be used as a redirect type (type = overlay-{id}).
List CTA overlays
/api/overlay
Returns your CTA overlays.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/overlay?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/overlay?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/overlay?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/overlay?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"cta": [
{
"id": 1,
"type": "message",
"name": "Product 1 Promo",
"redirect": "overlay-1",
"date": "2026-01-10 18:00:00"
},
{
"id": 2,
"type": "contact",
"name": "Contact Page",
"redirect": "overlay-2",
"date": "2026-01-10 18:10:00"
}
]
}
}
QR Codes
Create static QR codes or dynamic QR codes (type link) whose destination can be changed at any time.
List QR codes
/api/qr
Returns your QR codes.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/qr?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/qr?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/qr?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/qr?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 2,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"qrs": [
{
"id": 2,
"name": "Google",
"type": "link",
"dynamic": true,
"link": "https://rwz.fr/qr7x9",
"destination": "https://google.com",
"scans": 12,
"date": "2026-01-10 18:01:43"
},
{
"id": 1,
"name": "Office WiFi",
"type": "wifi",
"dynamic": false,
"link": null,
"scans": 0,
"date": "2026-01-09 08:00:00"
}
]
}
}
Get a single QR code
/api/qr/1
Returns a QR code with its image (SVG data URI) and scan statistics.
Example request
curl --location --request GET 'https://rwz.fr/api/qr/1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/qr/1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/qr/1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/qr/1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"details": {
"id": 1,
"name": "Google",
"type": "link",
"dynamic": true,
"link": "https://rwz.fr/qr7x9",
"destination": "https://google.com",
"scans": 12,
"content": "https://rwz.fr/qr7x9",
"svg": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0i...",
"date": "2026-01-10 18:01:43"
},
"data": {
"clicks": 12,
"uniqueClicks": 10,
"topCountries": {
"Unknown": 1
},
"topReferrers": {
"Direct, email & other": 12
},
"topBrowsers": {
"Chrome": 7
},
"topOs": {
"iOS": 9
},
"socialCount": {
"facebook": 0,
"twitter": 0,
"instagram": 0
}
}
}
Create a QR code
/api/qr/add
Creates a QR code. A link QR code is dynamic: it encodes a short link whose destination can be updated.
Parameters
| Parameter | Description |
|---|---|
typestring |
requiredlink, text, email, phone, sms, whatsapp, wifi, vcard, event, location, crypto, application, file, social, paypal, meeting or skype. |
datastring|object |
requiredContent: a URL or a text for simple types, or an object e.g. email { email, subject, body }, sms { phone, message }, wifi { ssid, password, encryption }, vcard { first_name (fname), last_name (lname), phone, email, organization (company), website (site), ... }, location { latitude, longitude } or { address }. |
dynamicboolean |
optionalDynamic code (short link with scan tracking and editable destination). Default: true for link codes; ignored for static-only types. |
namestring |
optionalName of the QR code (generated from the content when empty). |
backgroundstring |
optionalBackground color (hex or rgb(255,255,255)). |
foregroundstring |
optionalForeground color (hex or rgb(0,0,0)). |
logostring |
optionalURL of a PNG/JPG logo placed in the middle, or a multipart file (plan permitting). |
designobject |
optionalAdvanced design options: module, eye_frame, eye_ball, gradient, frame, frame_text, margin, ecc... |
customstring |
optionalCustom alias of the short link (dynamic codes). |
domainstring |
optionalBranded domain of the short link (dynamic codes). |
Example request
curl --location --request POST 'https://rwz.fr/api/qr/add' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"type": "link",
"data": "https://google.com",
"name": "Google",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)"
}'const response = await fetch('https://rwz.fr/api/qr/add', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"type": "link",
"data": "https://google.com",
"name": "Google",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/qr/add',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => 'link',
'data' => 'https://google.com',
'name' => 'Google',
'background' => 'rgb(255,255,255)',
'foreground' => 'rgb(0,0,0)'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/qr/add"
payload = {
"type": "link",
"data": "https://google.com",
"name": "Google",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"id": 3,
"link": "https://rwz.fr/qr7x9"
}
Update a QR code
/api/qr/1/update
Updates the content or the design of a QR code. Updating the data of a dynamic QR code changes its destination without changing the printed code.
Parameters
| Parameter | Description |
|---|---|
datastring|object |
optionalNew content (same format as on creation). |
namestring |
optionalName. |
backgroundstring |
optionalBackground color. |
foregroundstring |
optionalForeground color. |
logostring |
optionalLogo URL (empty to remove). |
designobject |
optionalAdvanced design options. |
domainstring |
optionalBranded domain (dynamic codes). |
Example request
curl --location --request PUT 'https://rwz.fr/api/qr/1/update' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": "https://google.com/new",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)"
}'const response = await fetch('https://rwz.fr/api/qr/1/update', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"data": "https://google.com/new",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)"
}),
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/qr/1/update',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'data' => 'https://google.com/new',
'background' => 'rgb(255,255,255)',
'foreground' => 'rgb(0,0,0)'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/qr/1/update"
payload = {
"data": "https://google.com/new",
"background": "rgb(255,255,255)",
"foreground": "rgb(0,0,0)"
}
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("PUT", url, headers=headers, json=payload)
print(response.json())
Example response
{
"error": 0,
"message": "QR has been updated successfully."
}
Delete a QR code
/api/qr/1/delete
Deletes a QR code (and its short link for dynamic codes).
Example request
curl --location --request DELETE 'https://rwz.fr/api/qr/1/delete' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/qr/1/delete', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/qr/1/delete',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/qr/1/delete"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("DELETE", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"message": "QR Code has been deleted successfully."
}
Bio Pages
Read your bio pages.
List bio pages
/api/bio
Returns your bio pages.
Parameters
| Parameter | Description |
|---|---|
limitinteger |
optionalNumber of results per page (1-100, default 10). |
pageinteger |
optionalPage number (default 1). |
Example request
curl --location --request GET 'https://rwz.fr/api/bio?limit=2&page=1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/bio?limit=2&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/bio?limit=2&page=1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/bio?limit=2&page=1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"result": 1,
"perpage": 10,
"currentpage": 1,
"nextpage": null,
"maxpage": 1,
"bios": [
{
"id": 1,
"name": "My Sample Bio",
"alias": "mybio",
"url": "https://rwz.fr/mybio",
"views": 340,
"uniqueViews": 290,
"default": true,
"status": true,
"date": "2026-01-10 18:01:43"
}
]
}
}
Get a single bio page
/api/bio/1
Returns a bio page with its blocks and statistics.
Example request
curl --location --request GET 'https://rwz.fr/api/bio/1' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json'
const response = await fetch('https://rwz.fr/api/bio/1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://rwz.fr/api/bio/1',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_MAXREDIRS => 2,
CURLOPT_TIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response, true);
print_r($data);import requests
url = "https://rwz.fr/api/bio/1"
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.json())
Example response
{
"error": 0,
"data": {
"id": 1,
"name": "My Sample Bio",
"alias": "mybio",
"url": "https://rwz.fr/mybio",
"views": 340,
"profile": {
"name": "Jane Doe",
"description": "Designer & creator"
},
"content": [
{
"id": "b1",
"type": "link",
"text": "My website",
"url": "https://example.com"
}
],
"date": "2026-01-10 18:01:43"
},
"stats": {
"clicks": 340,
"uniqueClicks": 290,
"topCountries": {
"France": 120
}
}
}
Need an integration without code?
Use the bookmarklet, the full-page script, Zapier, Slack or webhooks from the Tools page.