ScanMosaic
REST API · v1

Intégrez des QR codes et des liens courts à votre application

Créez des QR codes dynamiques, des liens courts et des codes-barres, changez leur destination, lisez leurs statistiques de scans et générez des images QR prêtes à imprimer, le tout depuis votre propre code. JSON sur HTTPS, une seule clé API, des erreurs claires.

URL de base
https://scanmosaic.com/api/v1
Auth
Authorization: Bearer tsk_…
Plan
Business

Démarrage rapide

  1. 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.
  2. 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.
  3. 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.png

JavaScript

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"
  }
}
Codes d'erreur
StatutCodeSignification
400bad_jsonLe corps de la requête n'est pas un JSON valide.
400bad_paramUn paramètre de requête ou de corps est hors limites. details : param, hint.
400bad_destinationdest n'est pas une adresse web http(s) complète.
400bad_kindkind n'est ni qr, ni link, ni barcode.
400bad_aliasalias ne fait pas 3 à 40 lettres, chiffres ou tirets, ou il est réservé.
400domain_not_verifieddomain n'est pas un domaine vérifié de votre espace de travail.
400unsafe_destinationGoogle Web Risk signale la destination.
400empty / too_long / bad_formatImages QR : aucune donnée, trop de données, ou un format autre que png ou svg.
400bad_cursorCe curseur ne vient pas de nous.
401api_key_requiredPas d'en-tête Authorization, ou il n'est pas de la forme Bearer tsk_…
401invalid_api_keyLa clé n'existe pas ou a été supprimée.
402business_requiredLe workspace n'est pas sur le plan Business (par exemple, celui-ci a pris fin).
403limit_reachedLa limite de votre plan pour ce type d'élément est atteinte. details: limit, kind.
404not_foundCet élément n'existe pas dans ce workspace.
409alias_takenCet alias est déjà utilisé sur ce domaine.
413too_bigLe corps de la requête est trop volumineux (250 KB pour les items).
429rate_limited / daily_limitTrop de requêtes. Attendez le nombre de secondes indiqué par Retry-After.
500server_errorUn 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êteSignification
X-RateLimit-LimitRequêtes autorisées par minute.
X-RateLimit-RemainingRequêtes restantes pour la minute en cours.
X-RateLimit-ResetHeure Unix de la réinitialisation de la minute.
Retry-AfterUniquement 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.

Champs de l’article
NomTypeDescription
idstringIdentifiant court, aussi la fin par défaut du lien court.
kindqr | link | barcodeCe que c'est. Ne peut pas être modifié après la création.
typestringType de contenu, p. ex. url (par défaut), pdf, menu, vcard pour les QR codes ; ean13, code128 pour les codes-barres.
namestringVotre libellé, 80 caractères maximum.
deststring | nullOù vont les scans et les clics. null pour les pages hébergées et les codes-barres.
urlstringLe lien court encodé par le QR code, p. ex. https://go.yourbrand.com/menu.
aliasstring | nullFin personnalisée (3 à 40 lettres, chiffres ou tirets), unique par domaine.
domainstring | nullVotre domaine personnalisé vérifié, ou null pour le nôtre.
campaignstring | nullRegroupez vos éléments pour les rapports.
contentobject | nullDonnées de page hébergée, ou données de code-barres ({ "data": "…" }).
styleobjectDesign du QR code (couleurs, styles de points et de coins).
rulesobject | nullRègles de routage (par appareil, pays, heure…).
pausedbooleanLes éléments en pause affichent une page « en pause » au lieu de rediriger.
disabledbooleanDésactivé par nos soins pour non-respect des conditions.
hitsintegerScans depuis toujours (QR codes) ou clics (liens).
last_hitinteger | nullHeure Unix du dernier scan ou clic.
created / updatedintegerHeures 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.

Paramètres
NomTypeDescription
kindqr | link | barcodeUniquement ce type.
typestringUniquement ce type de contenu, par exemple url ou pdf.
campaignstringUniquement cette campagne.
domainstringUniquement les éléments de ce domaine personnalisé.
pausedtrue | falseUniquement les éléments en pause, ou uniquement les éléments actifs.
qstringRecherchez par nom, destination et alias.
limitinteger1–100, 25 par défaut.
cursorstringnext_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.

Paramètres
NomTypeDescription
kindqr | link | barcodePar défaut qr.
dest obligatoirestringAdresse http(s) complète vers laquelle rediriger. Non utilisée pour les codes-barres et les pages hébergées.
namestring80 caractères maximum.
typestringPar défaut url (codes, liens) ou code128 (codes-barres).
aliasstringFin personnalisée, p. ex. menu. 3 à 40 lettres, chiffres ou tirets, unique par domaine.
domainstringL'un de vos domaines personnalisés vérifiés (voir /domains).
campaignstring60 caractères maximum.
styleobjectDesign du QR, p. ex. {"fg": "#112233", "dot": "rounded"}.
contentobjectDonnées de page hébergée ou de code-barres, p. ex. {"bcid": "ean13", "text": "4006381333931"} pour un code-barres.
rulesobjectRègles de routage.
pausedbooleanDé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.

Paramètres
NomTypeDescription
name, dest, alias, domain, campaign, style, content, rules, pausedComme 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.

Paramètres
NomTypeDescription
daysinteger1–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.

Paramètres
NomTypeDescription
datastringTexte ou lien à encoder (jusqu'à 2 953 octets). Obligatoire sauf si item est défini.
itemstringIdentifiant d’un QR code ou lien enregistré : encode son lien court avec le design enregistré.
formatpng | svgPar défaut png.
sizeintegerPixels, 64–2048 pour le PNG (512 par défaut), 64–4096 pour le SVG (1024 par défaut).
color#RRGGBBPoints. Par défaut #141A2E.
background#RRGGBBPar défaut #FFFFFF.
transparentbooleanFond transparent.
corner_color#RRGGBBCarrés des coins. Par défaut : color.
gradient_color#RRGGBBSVG uniquement : deuxième couleur d'un dégradé diagonal.
error_correctionL | M | Q | HQuelle part du code peut être abîmée : 7 %, 15 %, 25 %, 30 %. Par défaut M (PNG) ou Q (SVG).
marginintegerZone de silence en modules, 0–8. 4 par défaut.
dot_stylestringsquare, dots, rounded, extra-rounded, classy, classy-rounded
corner_stylestringsquare, extra-rounded, dot
corner_dot_stylestringsquare, dot
downloadstringNom 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.png

JavaScript

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.