REST API · v1

Developer API

Shorten links, generate QR codes, manage campaigns and read your statistics from your own applications with a simple JSON REST API.

Base URL
https://rwz.fr/api
JSON responses Bearer authentication 36 endpoints

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.

Log in to see your API key. Your key is available in your account settings.
Example request
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.

Response headers
X-RateLimit-LimitMaximum number of requests per minute.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetUnix timestamp at which the window resets.
Retry-AfterSeconds to wait (sent with 429 responses).
Limits per plan
  • 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.

Success
{
  "error": 0,
  "id": 3,
  "shorturl": "https://rwz.fr/google"
}
Error
{
  "error": 1,
  "message": "This alias is already taken. Please choose another one.",
  "field": "alias"
}
StatusMeaning
200The request succeeded.
400Invalid parameters: the message (and field) explain what is wrong.
401Missing or invalid API key.
403The feature is not available in your plan, your account is not active or the endpoint is reserved to administrators.
404The resource does not exist or does not belong to you.
409The resource already exists (domain, email, slug…).
429Too many requests: wait until the rate limit window resets.
500Unexpected server error. Please try again later.

Account

Retrieve and update the account the API key belongs to.

Get account

GET /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
200 · application/json
{
  "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

PUT /api/account/update

Updates the email address and/or the password of your account. Changing the password logs out every browser session.

Parameters
ParameterDescription
email
string
optionalNew email address.
password
string
optionalNew password (at least 6 characters).
name
string
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
200 · application/json
{
  "error": 0,
  "message": "Account has been successfully updated."
}

Create, list, update and delete your short links.

Branded Domains

Manage the branded domains of your account. New domains are activated once their DNS points to our server.

List domains

GET /api/domains

Returns your branded domains.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

POST /api/domain/add

Adds a branded domain. Point an A record (or CNAME) of the domain to our server.

Parameters
ParameterDescription
domain
string
requiredDomain name, e.g. brand.link (without path).
redirectroot
string
optionalURL visitors are sent to when they open the root of the domain.
redirect404
string
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
200 · application/json
{
  "error": 0,
  "id": 1
}

Update a domain

PUT /api/domain/1/update

Updates the redirections of a domain.

Parameters
ParameterDescription
redirectroot
string
optionalRoot redirection URL.
redirect404
string
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
200 · application/json
{
  "error": 0,
  "message": "Domain has been updated successfully."
}

Delete a domain

DELETE /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
200 · application/json
{
  "error": 0,
  "message": "Domain has been deleted successfully."
}

Campaigns

Group links into campaigns with an optional public list and a link rotator.

List campaigns

GET /api/campaigns

Returns your campaigns.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

POST /api/campaign/add

Creates a campaign.

Parameters
ParameterDescription
name
string
requiredCampaign name.
slug
string
optionalSlug used by the rotator and the public list (generated from the name when empty).
public
boolean
optionalMake the list of links public.
rotator
boolean
optionalEnable the link rotator (/r/{slug}).
description
string
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
200 · application/json
{
  "error": 0,
  "id": 3,
  "name": "New Campaign",
  "public": true,
  "rotator": false,
  "list": "https://rwz.fr/campaign/new-campaign"
}

Assign a link to a campaign

POST /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
200 · application/json
{
  "error": 0,
  "message": "Link successfully added to the campaign."
}

Update a campaign

PUT /api/campaign/1/update

Updates a campaign.

Parameters
ParameterDescription
name
string
optionalCampaign name.
slug
string
optionalSlug.
public
boolean
optionalPublic list.
rotator
boolean
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
200 · application/json
{
  "error": 0,
  "id": 1,
  "name": "Twitter Campaign",
  "public": true,
  "rotator": false,
  "list": "https://rwz.fr/campaign/twitter-campaign"
}

Delete a campaign

DELETE /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
200 · application/json
{
  "error": 0,
  "message": "Campaign has been deleted successfully."
}

Channels

Organize links, bio pages and QR codes into channels.

List channels

GET /api/channels

Returns your channels.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

GET /api/channel/1

Returns the items (links, bio pages, QR codes) of a channel.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

POST /api/channel/add

Creates a channel.

Parameters
ParameterDescription
name
string
requiredChannel name.
description
string
optionalDescription.
color
string
optionalBadge color (hex, e.g. #000000).
starred
boolean
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
200 · application/json
{
  "error": 0,
  "id": 3,
  "name": "New Channel",
  "description": "my new channel",
  "color": "#000000",
  "starred": true
}

Assign an item to a channel

POST /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
200 · application/json
{
  "error": 0,
  "message": "Item successfully added to the channel."
}

Update a channel

PUT /api/channel/1/update

Updates a channel.

Parameters
ParameterDescription
name
string
optionalChannel name.
description
string
optionalDescription.
color
string
optionalBadge color.
starred
boolean
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
200 · application/json
{
  "error": 0,
  "message": "Channel has been updated successfully."
}

Delete a channel

DELETE /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
200 · application/json
{
  "error": 0,
  "message": "Channel has been deleted successfully."
}

Pixels

Manage the retargeting pixels fired when your links are clicked.

List pixels

GET /api/pixels

Returns your tracking pixels.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

POST /api/pixel/add

Creates a tracking pixel.

Parameters
ParameterDescription
type
string
requiredProvider: facebook (fbpixel), gtag (gapixel), adwords (adwordspixel), gtm (gtmpixel), linkedin, twitter, adroll, quora, pinterest, bing, snapchat, reddit, tiktok, clarity.
name
string
requiredName of the pixel.
tag
string
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
200 · application/json
{
  "error": 0,
  "id": 1
}

Update a pixel

PUT /api/pixel/1/update

Updates a pixel.

Parameters
ParameterDescription
name
string
optionalName.
tag
string
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
200 · application/json
{
  "error": 0,
  "message": "Pixel has been updated successfully."
}

Delete a pixel

DELETE /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
200 · application/json
{
  "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

GET /api/splash

Returns your custom splash pages.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

GET /api/overlay

Returns your CTA overlays.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

GET /api/qr

Returns your QR codes.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

GET /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
200 · application/json
{
  "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

POST /api/qr/add

Creates a QR code. A link QR code is dynamic: it encodes a short link whose destination can be updated.

Parameters
ParameterDescription
type
string
requiredlink, text, email, phone, sms, whatsapp, wifi, vcard, event, location, crypto, application, file, social, paypal, meeting or skype.
data
string|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 }.
dynamic
boolean
optionalDynamic code (short link with scan tracking and editable destination). Default: true for link codes; ignored for static-only types.
name
string
optionalName of the QR code (generated from the content when empty).
background
string
optionalBackground color (hex or rgb(255,255,255)).
foreground
string
optionalForeground color (hex or rgb(0,0,0)).
logo
string
optionalURL of a PNG/JPG logo placed in the middle, or a multipart file (plan permitting).
design
object
optionalAdvanced design options: module, eye_frame, eye_ball, gradient, frame, frame_text, margin, ecc...
custom
string
optionalCustom alias of the short link (dynamic codes).
domain
string
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
200 · application/json
{
  "error": 0,
  "id": 3,
  "link": "https://rwz.fr/qr7x9"
}

Update a QR code

PUT /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
ParameterDescription
data
string|object
optionalNew content (same format as on creation).
name
string
optionalName.
background
string
optionalBackground color.
foreground
string
optionalForeground color.
logo
string
optionalLogo URL (empty to remove).
design
object
optionalAdvanced design options.
domain
string
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
200 · application/json
{
  "error": 0,
  "message": "QR has been updated successfully."
}

Delete a QR code

DELETE /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
200 · application/json
{
  "error": 0,
  "message": "QR Code has been deleted successfully."
}

Bio Pages

Read your bio pages.

List bio pages

GET /api/bio

Returns your bio pages.

Parameters
ParameterDescription
limit
integer
optionalNumber of results per page (1-100, default 10).
page
integer
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
200 · application/json
{
  "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

GET /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
200 · application/json
{
  "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.

Tools & Integrations