Démarrage rapide
- Ouvrez Clés d'API dans votre tableau de bord (plan Business) et créez une clé. Copiez-la : elle ne s'affiche qu'une fois.
- Stockez-la dans une variable d'environnement sur votre serveur, p. ex. TESSERA_API_KEY. Ne la mettez jamais dans le code du navigateur ou de l'application.
- Crée un QR code dynamique. La réponse contient son lien court dans url ; encodez ce lien, ou téléchargez une image prête à l'emploi depuis /qr.
cURL
curl "https://scanmosaic.com/api/v1/items" \
-H "Authorization: Bearer $TESSERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind": "qr", "name": "Table menu", "dest": "https://example.com/menu"}'JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"kind": "qr",
"name": "Table menu",
"dest": "https://example.com/menu"
})
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.post(
"https://scanmosaic.com/api/v1/items",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
json={
"kind": "qr",
"name": "Table menu",
"dest": "https://example.com/menu"
},
)
r.raise_for_status()
print(r.json()["data"])cURL
curl "https://scanmosaic.com/api/v1/qr?item=k3Xp9Qa&size=1024" \
-H "Authorization: Bearer $TESSERA_API_KEY" \
-o menu.pngJavaScript
import { writeFile } from "node:fs/promises";
const res = await fetch("https://scanmosaic.com/api/v1/qr?item=k3Xp9Qa&size=1024", {
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error.message);
await writeFile("menu.png", Buffer.from(await res.arrayBuffer()));Python
import os, requests
r = requests.get(
"https://scanmosaic.com/api/v1/qr?item=k3Xp9Qa&size=1024",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
open("menu.png", "wb").write(r.content)Authentification
Envoyez votre clé dans l'en-tête Authorization de chaque requête. Les clés commencent par tsk_ et appartiennent à un seul workspace : elles peuvent lire et modifier tout ce qu'un éditeur de ce workspace peut faire, et rien dans les autres workspaces.
Authorization: Bearer tsk_AbC123…
- Les propriétaires et les administrateurs créent et suppriment les clés dans Clés d'API, dans le tableau de bord. Supprimer une clé l'arrête immédiatement.
- L'API est incluse dans le plan Business. Si le plan prend fin, les requêtes reçoivent 402 business_required jusqu'au renouvellement ; vos codes et vos données sont conservés.
- Les modifications faites avec une clé apparaissent dans le journal d'activité de l'espace de travail sous la forme « API key tsk_… ».
- CORS est ouvert : vous pouvez appeler l'API depuis n'importe quelle origine, mais une clé placée dans une page web peut être copiée par quiconque l'ouvre. Appelez l'API depuis votre serveur.
Erreurs
Chaque erreur utilise la même structure JSON et un statut HTTP correspondant. code est stable : appuyez-vous dessus. message est un texte en anglais clair pour les journaux et les humains. Certaines erreurs ajoutent des détails, comme param.
{
"error": {
"code": "bad_param",
"message": "One of the parameters isn't valid.",
"status": 400,
"param": "size",
"hint": "64 to 2048"
}
}
| Statut | Code | Signification |
|---|---|---|
| 400 | bad_json | Le corps de la requête n'est pas un JSON valide. |
| 400 | bad_param | Un paramètre de requête ou de corps est hors limites. details : param, hint. |
| 400 | bad_destination | dest n'est pas une adresse web http(s) complète. |
| 400 | bad_kind | kind n'est ni qr, ni link, ni barcode. |
| 400 | bad_alias | alias ne fait pas 3 à 40 lettres, chiffres ou tirets, ou il est réservé. |
| 400 | domain_not_verified | domain n'est pas un domaine vérifié de votre espace de travail. |
| 400 | unsafe_destination | Google Web Risk signale la destination. |
| 400 | empty / too_long / bad_format | Images QR : aucune donnée, trop de données, ou un format autre que png ou svg. |
| 400 | bad_cursor | Ce curseur ne vient pas de nous. |
| 401 | api_key_required | Pas d'en-tête Authorization, ou il n'est pas de la forme Bearer tsk_… |
| 401 | invalid_api_key | La clé n'existe pas ou a été supprimée. |
| 402 | business_required | Le workspace n'est pas sur le plan Business (par exemple, celui-ci a pris fin). |
| 403 | limit_reached | La limite de votre plan pour ce type d'élément est atteinte. details: limit, kind. |
| 404 | not_found | Cet élément n'existe pas dans ce workspace. |
| 409 | alias_taken | Cet alias est déjà utilisé sur ce domaine. |
| 413 | too_big | Le corps de la requête est trop volumineux (250 KB pour les items). |
| 429 | rate_limited / daily_limit | Trop de requêtes. Attendez le nombre de secondes indiqué par Retry-After. |
| 500 | server_error | Un problème est survenu de notre côté. Réessayez avec un délai progressif. |
Limites de débit
Chaque clé peut effectuer 120 requêtes par minute et 20,000 par jour. Chaque réponse indique où vous en êtes :
| En-tête | Signification |
|---|---|
X-RateLimit-Limit | Requêtes autorisées par minute. |
X-RateLimit-Remaining | Requêtes restantes pour la minute en cours. |
X-RateLimit-Reset | Heure Unix de la réinitialisation de la minute. |
Retry-After | Uniquement pour 429 : secondes à attendre avant de réessayer. |
La création d'éléments est aussi limitée à 300 par heure et par espace de travail, et votre forfait fixe le nombre d'éléments que vous pouvez conserver. Besoin de plus ? Contactez-nous.
Pagination
Les listes renvoient les plus récents d’abord, jusqu’à limit éléments (25 par défaut, 100 au maximum). Quand has_more vaut true, passez next_cursor comme cursor pour obtenir la page suivante. Les curseurs restent valides quand des éléments sont ajoutés.
{
"data": [
"\u2026"
],
"has_more": true,
"next_cursor": "MTc2NzIyNTYwMC5rM1hwOVFh"
}
L'objet item
Les QR codes, liens et barcodes sont tous des éléments. Un élément seul est renvoyé comme données ; les listes comme données avec des champs de pagination.
| Nom | Type | Description |
|---|---|---|
id | string | Identifiant court, aussi la fin par défaut du lien court. |
kind | qr | link | barcode | Ce que c'est. Ne peut pas être modifié après la création. |
type | string | Type de contenu, p. ex. url (par défaut), pdf, menu, vcard pour les QR codes ; ean13, code128 pour les codes-barres. |
name | string | Votre libellé, 80 caractères maximum. |
dest | string | null | Où vont les scans et les clics. null pour les pages hébergées et les codes-barres. |
url | string | Le lien court encodé par le QR code, p. ex. https://go.yourbrand.com/menu. |
alias | string | null | Fin personnalisée (3 à 40 lettres, chiffres ou tirets), unique par domaine. |
domain | string | null | Votre domaine personnalisé vérifié, ou null pour le nôtre. |
campaign | string | null | Regroupez vos éléments pour les rapports. |
content | object | null | Données de page hébergée, ou données de code-barres ({ "data": "…" }). |
style | object | Design du QR code (couleurs, styles de points et de coins). |
rules | object | null | Règles de routage (par appareil, pays, heure…). |
paused | boolean | Les éléments en pause affichent une page « en pause » au lieu de rediriger. |
disabled | boolean | Désactivé par nos soins pour non-respect des conditions. |
hits | integer | Scans depuis toujours (QR codes) ou clics (liens). |
last_hit | integer | null | Heure Unix du dernier scan ou clic. |
created / updated | integer | Heures Unix. |
Points de terminaison
GET /api/v1/me
Compte
Le workspace auquel appartient cette clé, son plan, ses limites, son utilisation, ses domaines vérifiés et ses limites de débit. Pratique pour vérifier qu'une clé fonctionne.
cURL
curl "https://scanmosaic.com/api/v1/me" \
-H "Authorization: Bearer $TESSERA_API_KEY"JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/me", {
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.get(
"https://scanmosaic.com/api/v1/me",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": {
"workspace": {
"id": "w_8fK2mQ",
"name": "Acme"
},
"plan": "business",
"key": {
"prefix": "tsk_AbC123",
"name": "Shopify sync"
},
"limits": {
"qr": 1000,
"link": 5000,
"barcode": 10000,
"domains": 5
},
"usage": {
"dynamic": 12,
"links": 40,
"barcodes": 3,
"storageBytes": 0,
"workspaces": 1
},
"domains": [
"go.yourbrand.com"
],
"rate_limits": {
"per_minute": 120,
"per_day": 20000
}
}
}GET /api/v1/items
Lister les éléments
Éléments du workspace, les plus récents d’abord.
| Nom | Type | Description |
|---|---|---|
kind | qr | link | barcode | Uniquement ce type. |
type | string | Uniquement ce type de contenu, par exemple url ou pdf. |
campaign | string | Uniquement cette campagne. |
domain | string | Uniquement les éléments de ce domaine personnalisé. |
paused | true | false | Uniquement les éléments en pause, ou uniquement les éléments actifs. |
q | string | Recherchez par nom, destination et alias. |
limit | integer | 1–100, 25 par défaut. |
cursor | string | next_cursor de la page précédente. |
cURL
curl "https://scanmosaic.com/api/v1/items?kind=link&campaign=spring&limit=50" \
-H "Authorization: Bearer $TESSERA_API_KEY"JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items?kind=link&campaign=spring&limit=50", {
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.get(
"https://scanmosaic.com/api/v1/items?kind=link&campaign=spring&limit=50",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": [
{
"id": "k3Xp9Qa",
"kind": "link",
"type": "url",
"name": "Spring menu",
"dest": "https://example.com/menu",
"content": null,
"style": {},
"rules": null,
"alias": "menu",
"domain": "go.yourbrand.com",
"campaign": "spring",
"og": null,
"created": 1767225600,
"updated": 1767225600,
"paused": false,
"disabled": false,
"hits": 42,
"last_hit": 1767312000,
"url": "https://go.yourbrand.com/menu"
}
],
"has_more": false,
"next_cursor": null
}POST /api/v1/items
Créer un élément
Crée un QR code dynamique, un lien court ou un code-barres enregistré. Compte dans les limites de votre plan.
| Nom | Type | Description |
|---|---|---|
kind | qr | link | barcode | Par défaut qr. |
dest obligatoire | string | Adresse http(s) complète vers laquelle rediriger. Non utilisée pour les codes-barres et les pages hébergées. |
name | string | 80 caractères maximum. |
type | string | Par défaut url (codes, liens) ou code128 (codes-barres). |
alias | string | Fin personnalisée, p. ex. menu. 3 à 40 lettres, chiffres ou tirets, unique par domaine. |
domain | string | L'un de vos domaines personnalisés vérifiés (voir /domains). |
campaign | string | 60 caractères maximum. |
style | object | Design du QR, p. ex. {"fg": "#112233", "dot": "rounded"}. |
content | object | Données de page hébergée ou de code-barres, p. ex. {"bcid": "ean13", "text": "4006381333931"} pour un code-barres. |
rules | object | Règles de routage. |
paused | boolean | Démarrer en pause. |
cURL
curl "https://scanmosaic.com/api/v1/items" \
-H "Authorization: Bearer $TESSERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind": "link", "name": "Spring menu", "dest": "https://example.com/menu", "alias": "menu", "domain": "go.yourbrand.com", "campaign": "spring"}'JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"kind": "link",
"name": "Spring menu",
"dest": "https://example.com/menu",
"alias": "menu",
"domain": "go.yourbrand.com",
"campaign": "spring"
})
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.post(
"https://scanmosaic.com/api/v1/items",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
json={
"kind": "link",
"name": "Spring menu",
"dest": "https://example.com/menu",
"alias": "menu",
"domain": "go.yourbrand.com",
"campaign": "spring"
},
)
r.raise_for_status()
print(r.json()["data"])Réponse 201 Created
{
"data": {
"id": "k3Xp9Qa",
"kind": "link",
"type": "url",
"name": "Spring menu",
"dest": "https://example.com/menu",
"content": null,
"style": {},
"rules": null,
"alias": "menu",
"domain": "go.yourbrand.com",
"campaign": "spring",
"og": null,
"created": 1767225600,
"updated": 1767225600,
"paused": false,
"disabled": false,
"hits": 42,
"last_hit": 1767312000,
"url": "https://go.yourbrand.com/menu"
}
}GET /api/v1/items/{id}
Obtenir un article
Un élément par id.
cURL
curl "https://scanmosaic.com/api/v1/items/k3Xp9Qa" \
-H "Authorization: Bearer $TESSERA_API_KEY"JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa", {
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.get(
"https://scanmosaic.com/api/v1/items/k3Xp9Qa",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": {
"id": "k3Xp9Qa",
"kind": "link",
"type": "url",
"name": "Spring menu",
"dest": "https://example.com/menu",
"content": null,
"style": {},
"rules": null,
"alias": "menu",
"domain": "go.yourbrand.com",
"campaign": "spring",
"og": null,
"created": 1767225600,
"updated": 1767225600,
"paused": false,
"disabled": false,
"hits": 42,
"last_hit": 1767312000,
"url": "https://go.yourbrand.com/menu"
}
}PATCH /api/v1/items/{id}
Mettre à jour un article
N'envoyez que les champs à modifier. Changer dest prend effet au scan suivant ; les codes imprimés continuent de fonctionner. Changer domain ou alias modifie le lien court : les codes déjà imprimés cessent alors de fonctionner.
| Nom | Type | Description |
|---|---|---|
name, dest, alias, domain, campaign, style, content, rules, paused | Comme pour Create. kind ne peut pas être modifié. Envoyez null pour effacer alias, domain, campaign ou rules. |
cURL
curl -X PATCH "https://scanmosaic.com/api/v1/items/k3Xp9Qa" \
-H "Authorization: Bearer $TESSERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"dest": "https://example.com/summer-menu", "paused": false}'JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa", {
method: "PATCH",
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"dest": "https://example.com/summer-menu",
"paused": false
})
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.patch(
"https://scanmosaic.com/api/v1/items/k3Xp9Qa",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
json={
"dest": "https://example.com/summer-menu",
"paused": False
},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": {
"id": "k3Xp9Qa",
"kind": "link",
"type": "url",
"name": "Spring menu",
"dest": "https://example.com/summer-menu",
"content": null,
"style": {},
"rules": null,
"alias": "menu",
"domain": "go.yourbrand.com",
"campaign": "spring",
"og": null,
"created": 1767225600,
"updated": 1767225600,
"paused": false,
"disabled": false,
"hits": 42,
"last_hit": 1767312000,
"url": "https://go.yourbrand.com/menu"
}
}DELETE /api/v1/items/{id}
Supprimer un élément
Supprime l'élément et son historique de scans. Son lien court cesse de fonctionner immédiatement. Cette action est irréversible.
cURL
curl -X DELETE "https://scanmosaic.com/api/v1/items/k3Xp9Qa" \
-H "Authorization: Bearer $TESSERA_API_KEY"JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa", {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.delete(
"https://scanmosaic.com/api/v1/items/k3Xp9Qa",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": {
"id": "k3Xp9Qa",
"deleted": true
}
}GET /api/v1/items/{id}/stats
Statistiques de l’élément
Scans ou clics sur une période : une série quotidienne et des répartitions par pays, appareil, système d'exploitation, navigateur, langue et règle de routage. Les robots ne sont pas comptés.
| Nom | Type | Description |
|---|---|---|
days | integer | 1–365, 30 par défaut. |
cURL
curl "https://scanmosaic.com/api/v1/items/k3Xp9Qa/stats?days=7" \
-H "Authorization: Bearer $TESSERA_API_KEY"JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/items/k3Xp9Qa/stats?days=7", {
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.get(
"https://scanmosaic.com/api/v1/items/k3Xp9Qa/stats?days=7",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": {
"days": 7,
"total": 42,
"last_hit": 1767312000,
"inRange": 12,
"series": [
[
"2026-01-01",
3
],
[
"2026-01-02",
0
],
[
"…",
0
]
],
"countries": [
{
"k": "GB",
"n": 7
},
{
"k": "US",
"n": 5
}
],
"devices": [
{
"k": "Mobile",
"n": 10
},
{
"k": "Desktop",
"n": 2
}
],
"os": [
{
"k": "iOS",
"n": 6
}
],
"browsers": [
{
"k": "Safari",
"n": 6
}
],
"langs": [
{
"k": "en-gb",
"n": 7
}
],
"rules": [
{
"k": "default",
"n": 12
}
]
}
}GET /api/v1/qr
Image du QR code
Génère un QR code en PNG ou SVG. Utilisez GET avec des paramètres de requête, ou POST avec les mêmes paramètres en JSON. Passez item pour dessiner un code enregistré avec son propre design et son lien court, ou data pour un texte quelconque.
| Nom | Type | Description |
|---|---|---|
data | string | Texte ou lien à encoder (jusqu'à 2 953 octets). Obligatoire sauf si item est défini. |
item | string | Identifiant d’un QR code ou lien enregistré : encode son lien court avec le design enregistré. |
format | png | svg | Par défaut png. |
size | integer | Pixels, 64–2048 pour le PNG (512 par défaut), 64–4096 pour le SVG (1024 par défaut). |
color | #RRGGBB | Points. Par défaut #141A2E. |
background | #RRGGBB | Par défaut #FFFFFF. |
transparent | boolean | Fond transparent. |
corner_color | #RRGGBB | Carrés des coins. Par défaut : color. |
gradient_color | #RRGGBB | SVG uniquement : deuxième couleur d'un dégradé diagonal. |
error_correction | L | M | Q | H | Quelle part du code peut être abîmée : 7 %, 15 %, 25 %, 30 %. Par défaut M (PNG) ou Q (SVG). |
margin | integer | Zone de silence en modules, 0–8. 4 par défaut. |
dot_style | string | square, dots, rounded, extra-rounded, classy, classy-rounded |
corner_style | string | square, extra-rounded, dot |
corner_dot_style | string | square, dot |
download | string | Nom du fichier : ajoute Content-Disposition: attachment. |
Les PNG sont dessinés sur nos serveurs avec un nombre entier de pixels par module, pour des bords nets à l'impression. Les dégradés et les logos ne sont disponibles qu'en SVG ; pour les logos, utilisez le générateur.
cURL
curl "https://scanmosaic.com/api/v1/qr" \
-H "Authorization: Bearer $TESSERA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"data": "https://example.com", "format": "png", "size": 1024, "color": "#4865F0", "dot_style": "rounded", "corner_style": "extra-rounded"}' \
-o qr.pngJavaScript
import { writeFile } from "node:fs/promises";
const res = await fetch("https://scanmosaic.com/api/v1/qr", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"data": "https://example.com",
"format": "png",
"size": 1024,
"color": "#4865F0",
"dot_style": "rounded",
"corner_style": "extra-rounded"
})
});
if (!res.ok) throw new Error((await res.json()).error.message);
await writeFile("qr.png", Buffer.from(await res.arrayBuffer()));Python
import os, requests
r = requests.post(
"https://scanmosaic.com/api/v1/qr",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
json={
"data": "https://example.com",
"format": "png",
"size": 1024,
"color": "#4865F0",
"dot_style": "rounded",
"corner_style": "extra-rounded"
},
)
r.raise_for_status()
open("qr.png", "wb").write(r.content)GET /api/v1/domains
Domaines
Les domaines personnalisés du workspace. Utilisez comme domain un hôte dont ready est true lors de la création d'items.
cURL
curl "https://scanmosaic.com/api/v1/domains" \
-H "Authorization: Bearer $TESSERA_API_KEY"JavaScript
const res = await fetch("https://scanmosaic.com/api/v1/domains", {
headers: { Authorization: `Bearer ${process.env.TESSERA_API_KEY}` },
});
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
console.log(body.data);Python
import os, requests
r = requests.get(
"https://scanmosaic.com/api/v1/domains",
headers={"Authorization": f"Bearer {os.environ['TESSERA_API_KEY']}"},
)
r.raise_for_status()
print(r.json()["data"])Réponse 200 OK
{
"data": [
{
"host": "go.yourbrand.com",
"verified": true,
"ready": true
}
]
}Domaines personnalisés
Avec le plan Business, vos liens courts peuvent utiliser votre propre domaine, comme go.yourbrand.com/menu. Ajoutez et vérifiez le domaine dans Domaines, dans le tableau de bord : vous ajoutez un enregistrement CNAME qui pointe vers nous et un enregistrement TXT qui prouve qu'il est à vous, et nous émettons le certificat SSL. Ensuite, passez domain lorsque vous créez ou mettez à jour un élément.
Chaque domaine peut rediriger son adresse nue (go.yourbrand.com) et les chemins inconnus vers les pages de votre choix.
OpenAPI
L'API complète est décrite dans openapi.json (OpenAPI 3.1). Importez-le dans Postman, Insomnia ou un générateur de client.
Gestion des versions
La v1 est stable. Nous pouvons ajouter des endpoints, des champs et des codes d'erreur : ignorez donc les champs que vous ne connaissez pas. Nous ne supprimerons ni ne renommerons rien en v1 ; les changements incompatibles viendraient avec une v2, annoncée bien à l'avance.