Pour les développeurs

API ouverte pour les développeurs

Notre API RESTful vous permet de créer des intégrations personnalisées et d'étendre les fonctionnalités de Tiktak PRO selon vos besoins spécifiques.

Documentation complète et facile à comprendre
Authentification sécurisée via Token
Endpoints bien structurés pour toutes les fonctionnalités
Gestion complète des produits avec variations
Support technique dédié pour les développeurs
// Example: Get all products
fetch('https://api.tiktakpro.com/api/v1/products', {
  method: 'GET',
  headers: {
    'Authorization': 'Token YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

🚀 Pour commencer

Tout ce que vous devez savoir pour commencer à utiliser l'API TikTak PRO

URL de base

https://api.tiktakpro.com/api/v1

Authentification

Authorization: Token YOUR_API_TOKEN

💡 Note importante : Toutes les requêtes doivent inclure le header d'autorisation avec votre token d'API.

Documentation complète des APIs

Toutes les APIs disponibles avec exemples et paramètres détaillés

Récupérer les commandes

Détails d'une commande

Mettre à jour le statut

Modifier le statut (PATCH)

Créer / modifier une commande

Lister les produits

Détails d'un produit

Lire un produit avec ses déclinaisons

Créer un produit (payload complet)

Modifier un produit et ses déclinaisons

Supprimer un produit

Mise à jour rapide d'une déclinaison

Pack développeur

Storefront TikTak — générez votre boutique avec Claude

Générez un site vitrine + checkout COD branché sur l'API TikTak, avec un design totalement libre. Le backoffice (produits, stock, commandes, upsells) ne change pas.

STOREFRONT_API.md

Documentation humaine : logique complète + les 17 endpoints du storefront.

llms.txt

Contrat Storefront complet en texte brut, à coller dans un Projet Claude.ai comme base de connaissance.

Ouvrir /storefront-llms.txt

tiktak-storefront/

Skill Cursor / Claude, à copier dans .cursor/skills/ du projet.

Démarrer avec Claude / Cursor

  1. Copier tiktak-storefront/ vers .cursor/skills/tiktak-storefront/ du projet client.
  2. (Claude.ai) coller llms.txt dans la connaissance du projet.
  3. Utiliser le prompt type ci-dessous.
  4. Fournir le slug boutique (sous-domaine *.tiktak.space) ou le domaine custom.
Génère une boutique (Next.js ou Nuxt) pour TikTak.
Slug {slug} ou domaine {domaine}. API https://api.tiktakpro.com/api/v1/
Suis le skill tiktak-storefront : bootstrap, catalogue, panier local,
checkout COD, upsell, confirmation. N'invente aucun endpoint.
La création de commande doit toujours être signée par la clé de
sécurité de la boutique, côté serveur uniquement.

🔐 Règle non négociable : la clé de sécurité

  • Toute réception de commande doit obligatoirement inclure la clé de sécurité de la boutique.
  • Une requête sans clé, ou avec une clé invalide, est rejetée — aucune commande n'est enregistrée.
  • La clé ne doit jamais apparaître dans le code front, le bundle JS ou une variable publique.
  • Le checkout appelle une route serveur de votre boutique, qui seule ajoute la clé avant d'appeler l'API TikTak.
  • En cas de fuite suspectée : régénérer immédiatement la clé depuis le backoffice.

Phase 1 (disponible)

Bootstrap boutique, catalogue, catégories, recherche, homepage builder (optionnelle), panier côté client, codes promo, checkout COD, upsell post-achat, confirmation.

Pas encore couvert

Paiement en ligne (Flouci, Konnect…), compte client / login / VIP, wishlist, panier abandonné, CAPI Facebook, zones de livraison dynamiques signées, MCP.

Contrat Storefront — Phase 1 (MVP)

Le backoffice TikTak reste la source de vérité (produits, stock, transporteurs, upsells, réglages). Le site généré ne fait que consommer ces endpoints. Base URL : https://api.tiktakpro.com/api/v1/ — lecture publique, toujours passer company (hashid boutique).

Identifiants

EntitéType d'idExemple
Boutique (company)Hashid string8GPmlML
Produit, variante, catégorie, transport, pageEntier4218
UpsellHashid stringXyZ1
Commande (order_code = order_ref)StringK7P2M

Ne jamais inventer d'id : toujours les lire dans les réponses.

Pagination (listes DRF)

Query : ?page=1&size=20 (size max 1000, défaut 10). Utiliser size, jamais page_size ni limit.

{
  "count": 84,
  "total_pages": 5,
  "current_page": 1,
  "next": "https://…?page=2",
  "previous": null,
  "results": []
}

website/menus-read/ et website/informations-read/ ne sont pas paginés (tableau / objet unique).

Filtres produits fréquents

Toujours : company={hashid} + active=true. Le queryset public force déjà active=True et display_on_website=True.

ParamètreRôle
no_parent=trueUniquement produits parents (pas les variantes)
show-children=falseN'embarque pas declinaisons[] (listes)
show-children=trueInclut les variantes (fiche produit) — défaut API
ids_in=1,2,3Produits ciblés
ids_not_in=1Exclusion
has_category=12Catégorie principale ou M2M (12,15)
search=Nom / référence / code-barres
ordering=created_at, updated_at, price, sold, name, reference, order (préfixe - = desc)
discount__gte=1Produits en promo
has_attributs=Filtre facette (ids d'attributs)

Logique globale

Domaine / slug
  ├─ GET get-store/                  → company.id, currency, works_with_transport
  └─ GET website/informations-read/  → store_settings (checkout, COD, formulaire)
  ├─ menus, homepage (optionnel), catalogue
  Panier = localStorage (aucun endpoint panier)
  ├─ GET transports-read/            si works_with_transport
  └─ POST website/get-auto-discount
  POST create-fast-order/          payement_type = CASH
  ├─ upsell_id → GET upsell + offre → POST update-order-upsell | refuser
  └─ sinon     → confirmation
  GET get-order-by-idref/{order_ref}/{company}

Le backend recalcule les totaux : total_amount envoyé est indicatif. Prix, remise, transport et stock sont repris côté serveur.

Bootstrap

Identifier la boutique par slug (boutique.tiktak.spaceboutique) ou par domaine custom (?server=www.client.tn). GET get-store/ renvoie id (hashid), name, slug, logo, currency, works_with_transport, store_activated (403 si introuvable).

GET website/informations-read/ renvoie un objet : store_settings.cash_on_delivery, default_payement_type, formCheckout (champs dynamiques), checkout_message, seo_settings, css_settings, stock_settings.

slug formCheckoutChamp commande
name / phone / phone_extra / email / addressorder.name, order.phone, order.phone_extra, order.email, order.address
gouvorder.gouvernorat
cityorder.delegation
codeorder.code_postal
countryorder.country (défaut TN)
commentorder.comment
create_accountracine create_account (bool)
termsvalidation front uniquement
discount_coderacine promo_code

Si formCheckout est vide, afficher un formulaire par défaut : nom, téléphone, adresse, gouvernorat. Navigation : GET website/menus-read/?company={id}&position=header&active=true (prendre [0].menus).

Catalogue, prix et variantes

# Grille catégorie
products-read/?company={id}&page=1&size=20&active=true&no_parent=true&show-children=false&has_category={cat_id}&ordering=-created_at

# Recherche
products-read/?company={id}&no_parent=true&active=true&show-children=false&search={q}

# Fiche produit
products-read/{id}/?company={id}
product-by-slug?seo_slug={slug}&company={id}

Prix unitaire affiché :

discount_type == "fixed_amount"       → price - discount
discount_type == "percent"|"percentage" → price - (price * discount / 100)
formula et qty >= palier               → palier le plus haut dont quantity <= qty
  • Variantes : c'est declinaisons[i].id qui part dans product_id ; product_parent_id = parent de la variante (sinon id du produit).
  • Stock : si active_stock et pas order_without_stock, refuser qty > stock de la ligne commandée (variante, pas le parent).
  • Mise en page fiche : GET product-extra-read/?product={id}&company={id} (blocs data[]), fil d'Ariane : category-breadcrumb/{cat_id}/{company}.
  • Homepage optionnelle : GET website/page-read/?page_type=home&company={id} — un front custom peut ignorer main_content.

Panier (localStorage) — pas d'API

{
  "product_id": 4219,
  "product_parent_id": 4218,
  "product_name": "T-shirt",
  "product_ref": "TS-001",
  "category_id": 12,
  "quantity": 2,
  "active_stock": true,
  "price_ttc": 49.9,
  "price_ttc_after_discount": 39.9,
  "final_price": 79.8,
  "discount": 10,
  "product_attrs": "Rouge M",
  "product_thumb": "https://…"
}

Fusionner les lignes de même product_id (+ mêmes options). subtotal = somme des final_price ; total = subtotal - discount + transport_price.

Livraison et remises

  • Si company.works_with_transport : GET transports-read/?company={id} (use_for_web=true, active=true). Choisir le transporteur default, envoyer order.transport_id.
  • Prix custom produit : si tous les articles ont custom_delivery_price, port = max(delivery_price) ; sinon max(custom…, transporteur.price).
  • Phase 1 : ne pas implémenter delivery_quote_token / transport_key=delivery_zone_dynamic.
POST website/get-auto-discount
{
  "slug": "ma-boutique",
  "details": [
    { "product_id": 4218, "product_parent_id": 4218, "quantity": 1, "final_price": 39.9 }
  ],
  "code": "",
  "delivery_price": 7
}
// Réponse Phase 1 : un nombre = montant de remise (pas un %)

code vide → remise automatique boutique ; code renseigné → code promo. Au checkout, n'envoyer promo_code que pour un vrai code saisi (l'auto-remise envoie "").

Checkout COD — POST create-fast-order/

{
  "company": "8GPmlML",
  "source": "SITE CUSTOM",
  "promo_code": "",
  "create_account": false,
  "provider": null,
  "meta_data": {
    "client_ip": "41.x.x.x",
    "fingerprint": { "id": "fp_…" },
    "visit_source": null
  },
  "order": {
    "name": "Ahmed Ben Ali",
    "phone": "22123456",
    "phone_extra": "",
    "email": "",
    "address": "12 rue …",
    "gouvernorat": "Tunis",
    "delegation": "Tunis",
    "code_postal": "1000",
    "country": "TN",
    "comment": "",
    "payement_type": "CASH",
    "transport_id": 3,
    "total_amount": 86.8,
    "_details": []
  }
}

// Succès
{ "order_ref": "K7P2M", "payment": {}, "upsell_id": "XyZ1" }
  • payement_type : CASH (COD). Pas de ONLINE en Phase 1.
  • _details obligatoire et non vide ; phone nettoyé côté serveur.
  • 429 = trop de commandes IP/fingerprint → afficher une page succès factice (ne pas révéler le blocage) et ne pas vider le panier.
  • 400 : { "detail": "…" } (ex. _details is required, No step configured.).
  • Routage : upsell_id/upsell/{upsell_id}/{order_ref} ; sinon /checkout-confirmation/{order_ref}.

Obligatoire — challenge checkout : aucune commande ne peut être créée sans un challenge checkout déjà en place. Tout front custom doit l'implémenter avant d'appeler create-fast-order/ :

  • Fingerprint navigateur obligatoire dans meta_data.fingerprint.id (stable par appareil).
  • Rate-limit actif : la commande est comptée par IP + fingerprint ; un dépassement renvoie 429.
  • L'IP réelle du client doit être transmise dans meta_data.client_ip via votre proxy serveur.
  • Sur 429 : afficher une page succès factice, ne pas vider le panier, ne pas révéler le blocage.
  • Une requête sans fingerprint ni challenge est considérée comme non conforme et peut être rejetée.

Rappel : la création de commande doit toujours passer par une route serveur de votre boutique (proxy), qui seule injecte la clé de sécurité et l'IP client. Jamais de clé dans le bundle JS.

Upsell (COD uniquement) et confirmation

  1. GET website/upsell/{company}/{upsell_id}text_upsell, product_to_propose, discount (montant, pas %), free_shipping.
  2. GET get-order-by-idref/{order_ref}/{company} — commande déjà créée.
  3. GET products-read/?ids_in={product_to_propose}&company=… — prix barré = price, prix offre = price - discount.
  4. Accepter : POST update-order-upsell { "upsell", "order": "<order_ref>", "company" }"Success".
  5. Refuser : aller à la confirmation sans POST.

Confirmation : GET get-order-by-idref/{order_ref}/{company} — afficher order_code, created_at, coordonnées, details[], transport_price, discount, total_after_discount et le checkout_message du store (404 si ref inconnue).

Catalogue des 17 endpoints Storefront

MéthodeCheminRôle
GETget-store/Boutique
GETwebsite/informations-read/Réglages store
GETwebsite/menus-read/Navigation
GETwebsite/page-read/Homepage / pages (page_type ou id)
GETproducts-read/Liste / recherche
GETproducts-read/{id}/Fiche par id
GETproduct-by-slugFiche par seo_slug
GETproduct-extra-read/Blocs fiche
GETcategories-read/{id}/Catégorie
GETcategory-breadcrumb/{id}/{company}Fil d'Ariane
GETtransports-read/Transporteurs web
POSTwebsite/get-auto-discountRemise
POSTcreate-fast-order/Créer commande
GETget-order-by-idref/{ref}/{company}Lire commande
GETwebsite/upsell/{company}/{id}Config upsell
POSTupdate-order-upsellAccepter upsell
GETwebsite/page-read/{id}/Page CMS par id

Ne pas appeler d'autres routes (products/, orders/, login-jwt/, stats, Shopify, MCP…).

Pièges à éviter

  1. company est un hashid, pas un entier.
  2. Pas d'endpoint panier — localStorage / Pinia / cookie.
  3. payement_type s'écrit avec un seul « e » (pas payment_type).
  4. order_ref = order_code, pas l'id numérique interne.
  5. Jamais d'upsell après un paiement ONLINE.
  6. discount upsell = montant, pas un pourcentage.
  7. Totaux recalculés côté serveur — ne pas faire confiance au front.
  8. Listes : no_parent=true + show-children=false ; fiche : show-children=true.
  9. Pagination : size, pas page_size / limit.
  10. Le challenge checkout est exigé pour tout front custom : meta_data.fingerprint + IP client + rate-limit. Le HMAC X-Checkout-Challenge reste spécifique au store officiel Nuxt.

Le MCP TikTak (mcp.tiktak.space) pilote le thème Nuxt officiel. Ce pack sert à construire un autre front. Implémentation officielle de référence : dépôt store-nuxt.

📋 Statuts de commande disponibles

Utilisez ces codes de statut (slug) pour filtrer ou mettre à jour vos commandes

standbyEn attente
confirmedConfirmée
preparingEn préparation
expdExpédiée
deliveredLivrée
cancelledAnnulée
abandoned-cartPanier abandonné

💡 Bonnes pratiques

🔐

Sécurité

Ne partagez jamais votre token d'API. Stockez-le dans des variables d'environnement sécurisées.

Performance

Utilisez la pagination pour les grandes listes. Mettez en cache les données fréquemment consultées.

🔄

Gestion d'erreurs

Implémentez une gestion robuste des erreurs et des mécanismes de retry pour les requêtes critiques.

📝

Logging

Loguez toutes vos requêtes API pour faciliter le débogage et le monitoring de vos intégrations.

Prêt à commencer ?

Créez votre compte et obtenez votre clé API pour commencer à intégrer TikTak PRO dès maintenant