{"openapi":"3.1.0","info":{"title":"Wassit API","version":"1.0.0","description":"API REST de la marketplace marocaine d’influence Wassit. Recherchez les créateurs, créez des commandes, gérez les livrables, les paiements en escrow et les webhooks. Tous les montants sont en MAD par défaut ; la conversion EUR/USD/GBP/CAD est exposée via `/v1/fx`.","termsOfService":"https://wassit.ma/legal/conditions","contact":{"name":"Équipe API Wassit","email":"developers@wassit.ma","url":"https://wassit.ma/developpeurs"},"license":{"name":"Conditions d’utilisation Wassit","url":"https://wassit.ma/legal/api"}},"servers":[{"url":"https://api.wassit.ma","description":"Production"},{"url":"http://localhost:3003","description":"Développement local"}],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"tags":[{"name":"Creators","description":"Profils publics des créateurs vérifiés."},{"name":"Packages","description":"Offres publiées par les créateurs."},{"name":"Orders","description":"Cycle de vie des commandes : création, paiement, livraison, litige."},{"name":"Webhooks","description":"Abonnements aux événements asynchrones."},{"name":"Account","description":"Informations sur l’organisation appelante."},{"name":"Payments","description":"Transactions, payouts et factures."},{"name":"Search","description":"Recherche plein texte."},{"name":"FX","description":"Taux de change indicatifs MAD."},{"name":"Admin","description":"Endpoints réservés aux administrateurs Wassit."}],"paths":{"/v1/creators":{"get":{"tags":["Creators"],"summary":"Lister les créateurs","description":"Renvoie la liste paginée des créateurs publics, filtrable par niche, ville et seuil d’abonnés.","operationId":"listCreators","parameters":[{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"},{"name":"niche","in":"query","description":"Filtrer par niche (fashion, beauty, food, tech...).","required":false,"schema":{"type":"string","example":"fashion"}},{"name":"city","in":"query","description":"Filtrer par ville marocaine.","required":false,"schema":{"type":"string","example":"Casablanca"}},{"name":"minFollowers","in":"query","description":"Nombre minimum d’abonnés.","required":false,"schema":{"type":"integer","minimum":0,"example":10000}}],"responses":{"200":{"description":"Liste paginée de créateurs.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Creator"}}}}]},"example":{"object":"list","hasMore":true,"nextCursor":"cur_eyJpZCI6InNhbG1hZWxpZHJpc3NpIn0","data":[{"handle":"salmaelidrissi","displayName":"Salma El Idrissi","avatarUrl":"https://cdn.wassit.ma/creators/salmaelidrissi.jpg","bio":"Créatrice mode & lifestyle basée à Casablanca. Bilingue FR/AR.","city":"Casablanca","niches":["fashion","lifestyle","beauty"],"followers":184200,"engagementRate":4.7,"languages":["fr","ar","en"],"verified":true,"address":{"line1":"12 rue Ibn Khaldoun","city":"Casablanca","region":"Casablanca-Settat","postalCode":"20000","country":"MA"}}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/creators/{handle}":{"get":{"tags":["Creators"],"summary":"Récupérer un créateur","description":"Renvoie le profil public détaillé d’un créateur via son handle.","operationId":"getCreator","parameters":[{"$ref":"#/components/parameters/Handle"}],"responses":{"200":{"description":"Profil créateur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Creator"},"example":{"handle":"salmaelidrissi","displayName":"Salma El Idrissi","avatarUrl":"https://cdn.wassit.ma/creators/salmaelidrissi.jpg","bio":"Créatrice mode & lifestyle basée à Casablanca. Bilingue FR/AR.","city":"Casablanca","niches":["fashion","lifestyle","beauty"],"followers":184200,"engagementRate":4.7,"languages":["fr","ar","en"],"verified":true,"address":{"line1":"12 rue Ibn Khaldoun","city":"Casablanca","region":"Casablanca-Settat","postalCode":"20000","country":"MA"}}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/packages":{"get":{"tags":["Packages"],"summary":"Lister les packages","description":"Liste les offres publiées, filtrable par créateur, niche et fourchette de budget en MAD.","operationId":"listPackages","parameters":[{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"},{"name":"creatorHandle","in":"query","description":"Restreindre aux packages d’un créateur donné.","required":false,"schema":{"type":"string","example":"salmaelidrissi"}},{"name":"niche","in":"query","description":"Filtrer par niche.","required":false,"schema":{"type":"string","example":"fashion"}},{"name":"minPriceMad","in":"query","description":"Prix plancher en MAD.","required":false,"schema":{"type":"integer","minimum":0,"example":2000}},{"name":"maxPriceMad","in":"query","description":"Prix plafond en MAD.","required":false,"schema":{"type":"integer","minimum":0,"example":15000}}],"responses":{"200":{"description":"Liste paginée de packages.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Package"}}}}]},"example":{"object":"list","hasMore":false,"nextCursor":null,"data":[{"id":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","title":"Reel Instagram 30 secondes","description":"Vidéo Reel verticale de 30s avec montage, voix-off et hashtags proposés.","format":"reel","deliveryDays":7,"revisionsIncluded":2,"price":{"amount":8500,"currency":"MAD"},"priceMad":8500,"niche":"fashion","active":true}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/orders":{"post":{"tags":["Orders"],"summary":"Créer une commande","description":"Crée une commande pour le compte d’une marque. Le paiement est capturé en escrow lors de l’appel à `/pay`.","operationId":"createOrder","requestBody":{"description":"Brief et référence du package à commander.","required":true,"content":{"application/json":{"schema":{"type":"object","required":["packageId","brief"],"properties":{"packageId":{"type":"string","example":"pkg_reel_30s_salma"},"brief":{"type":"string","minLength":30,"example":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7."},"deliveryDate":{"type":"string","format":"date","example":"2026-06-04"},"hashtags":{"type":"array","items":{"type":"string"},"example":["#AtlasN7","#MadeInMorocco"]}}},"example":{"packageId":"pkg_reel_30s_salma","brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","deliveryDate":"2026-06-04","hashtags":["#AtlasN7","#MadeInMorocco"]}}}},"responses":{"201":{"description":"Commande créée, en attente de paiement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"pending_payment","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":null,"createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/orders/{id}":{"get":{"tags":["Orders"],"summary":"Récupérer une commande","description":"Renvoie l’état détaillé, le brief et la timeline d’une commande.","operationId":"getOrder","parameters":[{"$ref":"#/components/parameters/OrderId"}],"responses":{"200":{"description":"Détail de la commande.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"paid","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":null,"createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/orders/{id}/pay":{"post":{"tags":["Orders","Payments"],"summary":"Payer une commande (mock)","description":"Capture le paiement en escrow. Cet endpoint est mocké en bac à sable : aucune carte n’est débitée réellement.","operationId":"payOrder","parameters":[{"$ref":"#/components/parameters/OrderId"}],"requestBody":{"description":"Méthode de paiement utilisée.","required":true,"content":{"application/json":{"schema":{"type":"object","required":["method"],"properties":{"method":{"type":"string","enum":["card","cmi","bank_transfer","cash_pickup","wallet"],"example":"cmi"},"paymentMethodId":{"type":"string","description":"Identifiant tokenisé (CMI, Stripe...) lorsqu’il s’applique.","example":"pm_card_visa_4242"}}},"example":{"method":"cmi","paymentMethodId":"pm_cmi_demo"}}}},"responses":{"200":{"description":"Paiement capturé, commande passée à `paid`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"paid","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":null,"createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/orders/{id}/proof":{"post":{"tags":["Orders"],"summary":"Soumettre une preuve","description":"Le créateur transmet l’URL publique de la publication et les métriques associées.","operationId":"submitProof","parameters":[{"$ref":"#/components/parameters/OrderId"}],"requestBody":{"description":"URL et métriques de la publication.","required":true,"content":{"application/json":{"schema":{"type":"object","required":["proofUrl"],"properties":{"proofUrl":{"type":"string","format":"uri","example":"https://www.instagram.com/reel/Cxy_demo/"},"metrics":{"type":"object","properties":{"views":{"type":"integer","example":18400},"likes":{"type":"integer","example":1320},"saves":{"type":"integer","example":86}}},"note":{"type":"string","example":"Publié ce matin 9h. Engagement initial conforme aux estimations."}}},"example":{"proofUrl":"https://www.instagram.com/reel/Cxy_demo/","metrics":{"views":18400,"likes":1320,"saves":86},"note":"Publié ce matin 9h. Engagement initial conforme aux estimations."}}}},"responses":{"200":{"description":"Preuve enregistrée, commande passée à `proof_submitted`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"proof_submitted","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":"https://www.instagram.com/reel/Cxy_demo/","createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/orders/{id}/approve":{"post":{"tags":["Orders"],"summary":"Approuver une livraison","description":"La marque valide la livraison ; le paiement est libéré au créateur sous 24h ouvrées.","operationId":"approveOrder","parameters":[{"$ref":"#/components/parameters/OrderId"}],"responses":{"200":{"description":"Commande passée à `completed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"completed","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":null,"createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/orders/{id}/revision":{"post":{"tags":["Orders"],"summary":"Demander une révision","description":"La marque demande une révision du livrable selon les quotas du package.","operationId":"requestRevision","parameters":[{"$ref":"#/components/parameters/OrderId"}],"requestBody":{"description":"Note adressée au créateur.","required":true,"content":{"application/json":{"schema":{"type":"object","required":["note"],"properties":{"note":{"type":"string","minLength":10,"example":"Merci de retravailler le cadrage final pour mieux faire apparaitre le flacon."}}},"example":{"note":"Merci de retravailler le cadrage final pour mieux faire apparaitre le flacon."}}}},"responses":{"200":{"description":"Commande passée à `revision_requested`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"revision_requested","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":null,"createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/orders/{id}/dispute":{"post":{"tags":["Orders"],"summary":"Ouvrir un litige","description":"Ouvre un litige formel : un médiateur Wassit prend le dossier sous 48h ouvrées.","operationId":"openDispute","parameters":[{"$ref":"#/components/parameters/OrderId"}],"requestBody":{"description":"Motif et pièces justificatives.","required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","enum":["content_off_brief","not_delivered","low_quality","other"],"example":"content_off_brief"},"description":{"type":"string","example":"Le brief mentionnait un fond clair, la vidéo est tournée de nuit."},"attachments":{"type":"array","items":{"type":"string","format":"uri"},"example":["https://cdn.wassit.ma/disputes/d1.jpg","https://cdn.wassit.ma/disputes/d2.jpg"]}}},"example":{"reason":"content_off_brief","description":"Le brief mentionnait un fond clair, la vidéo est tournée de nuit."}}}},"responses":{"200":{"description":"Litige enregistré, commande passée à `disputed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"},"example":{"id":"ord_7K2M9P","reference":"WST-2026-00042","packageId":"pkg_reel_30s_salma","creatorHandle":"salmaelidrissi","brandId":"org_atlas_cosmetics","status":"disputed","amount":{"amount":8500,"currency":"MAD"},"platformFee":{"amount":1275,"currency":"MAD"},"brief":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7.","proofUrl":null,"createdAt":"2026-05-18T10:24:00Z","updatedAt":"2026-05-21T08:00:00Z","escrowReleaseAt":"2026-06-04T12:00:00Z"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/transactions":{"get":{"tags":["Payments"],"summary":"Lister les transactions","description":"Renvoie la liste paginée des transactions comptables (charges, payouts, frais).","operationId":"listTransactions","parameters":[{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Limit"},{"name":"orderId","in":"query","description":"Filtrer par commande.","required":false,"schema":{"type":"string","example":"ord_7K2M9P"}},{"name":"type","in":"query","description":"Filtrer par type de transaction.","required":false,"schema":{"type":"string","enum":["charge","refund","payout","platform_fee","tax"],"example":"payout"}}],"responses":{"200":{"description":"Liste de transactions.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Transaction"}}}}]},"example":{"object":"list","hasMore":false,"nextCursor":null,"data":[{"id":"tx_01HQR9X4F2","orderId":"ord_7K2M9P","type":"charge","amount":{"amount":8500,"currency":"MAD"},"method":"cmi","createdAt":"2026-05-18T10:25:11Z","invoiceUrl":"https://api.wassit.ma/v1/invoices/inv_01HQR9X4F2.pdf"}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/account/me":{"get":{"tags":["Account"],"summary":"Compte courant","description":"Renvoie l’organisation appelante, les scopes accordés et le quota de rate-limit.","operationId":"getMe","responses":{"200":{"description":"Informations sur le compte appelant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"},"example":{"organization":"atlas-cosmetics","scopes":["creators.read","orders.write","webhooks.manage"],"rateLimit":600,"environment":"live","contactEmail":"dev@atlas-cosmetics.ma"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/fx":{"get":{"tags":["FX"],"summary":"Taux de change indicatifs","description":"Renvoie la table des taux indicatifs MAD vers EUR/USD/GBP/CAD. Mise à jour quotidienne.","operationId":"getFxRates","security":[],"responses":{"200":{"description":"Taux indicatifs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxRates"},"example":{"baseCurrency":"MAD","rates":{"EUR":0.0918,"USD":0.0996,"GBP":0.0782,"CAD":0.1358},"updatedAt":"2026-05-21T06:00:00Z"}}}}}}},"/v1/search/creators":{"get":{"tags":["Search"],"summary":"Recherche créateurs","description":"Recherche plein texte sur le nom, le handle et la biographie des créateurs.","operationId":"searchCreators","parameters":[{"name":"q","in":"query","description":"Texte de recherche (au moins 2 caractères).","required":true,"schema":{"type":"string","minLength":2,"example":"salma"}},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"Résultats de recherche.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Creator"}}}}]},"example":{"object":"list","hasMore":false,"nextCursor":null,"data":[{"handle":"salmaelidrissi","displayName":"Salma El Idrissi","avatarUrl":"https://cdn.wassit.ma/creators/salmaelidrissi.jpg","bio":"Créatrice mode & lifestyle basée à Casablanca. Bilingue FR/AR.","city":"Casablanca","niches":["fashion","lifestyle","beauty"],"followers":184200,"engagementRate":4.7,"languages":["fr","ar","en"],"verified":true,"address":{"line1":"12 rue Ibn Khaldoun","city":"Casablanca","region":"Casablanca-Settat","postalCode":"20000","country":"MA"}}]}}}},"400":{"$ref":"#/components/responses/ValidationError"}}}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Lister les webhooks","description":"Renvoie tous les abonnements webhook actifs pour l’organisation.","operationId":"listWebhooks","responses":{"200":{"description":"Liste d’abonnements.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookSubscription"}}}}]},"example":{"object":"list","hasMore":false,"nextCursor":null,"data":[{"id":"whk_01HQRB1C7N","url":"https://hooks.atlas-cosmetics.ma/wassit","events":["order.created","order.completed"],"secret":"whsec_HxJpQ8R2zT...","active":true,"createdAt":"2026-05-10T09:00:00Z"}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}},"post":{"tags":["Webhooks"],"summary":"Enregistrer un webhook","description":"Crée un nouvel abonnement webhook. Un `secret` HMAC est renvoyé une seule fois.","operationId":"createWebhook","requestBody":{"description":"URL HTTPS et liste d’événements à écouter.","required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","example":"https://hooks.atlas-cosmetics.ma/wassit"},"events":{"type":"array","items":{"type":"string"},"example":["order.created","order.completed","order.disputed"]}}},"example":{"url":"https://hooks.atlas-cosmetics.ma/wassit","events":["order.created","order.completed","order.disputed"]}}}},"responses":{"201":{"description":"Abonnement créé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscription"},"example":{"id":"whk_01HQRB1C7N","url":"https://hooks.atlas-cosmetics.ma/wassit","events":["order.created","order.completed","order.disputed"],"secret":"whsec_HxJpQ8R2zT...","active":true,"createdAt":"2026-05-21T12:00:00Z"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/webhooks/{id}":{"delete":{"tags":["Webhooks"],"summary":"Supprimer un webhook","description":"Supprime un abonnement webhook. Opération irréversible.","operationId":"deleteWebhook","parameters":[{"$ref":"#/components/parameters/WebhookId"}],"responses":{"204":{"description":"Webhook supprimé."},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"schemas":{"Money":{"type":"object","description":"Montant monétaire avec devise ISO-4217.","required":["amount","currency"],"properties":{"amount":{"type":"integer","description":"Montant en unité mineure (centimes) ou entier MAD.","example":8500},"currency":{"type":"string","description":"Code devise ISO-4217.","enum":["MAD","EUR","USD","GBP","CAD"],"example":"MAD"}}},"Address":{"type":"object","description":"Adresse postale marocaine.","required":["city","country"],"properties":{"line1":{"type":"string","example":"12 rue Ibn Khaldoun"},"line2":{"type":"string","nullable":true,"example":"Résidence Al Andalous, Apt 4B"},"city":{"type":"string","example":"Casablanca"},"region":{"type":"string","example":"Casablanca-Settat"},"postalCode":{"type":"string","example":"20000"},"country":{"type":"string","description":"Code pays ISO-3166 alpha-2.","example":"MA"}}},"OrderStatus":{"type":"string","description":"Cycle de vie d’une commande Wassit.","enum":["pending_payment","paid","in_production","proof_submitted","revision_requested","completed","disputed","cancelled","refunded"],"example":"paid"},"Creator":{"type":"object","description":"Profil public d’un créateur vérifié sur Wassit.","required":["handle","displayName","city","niches","followers"],"properties":{"handle":{"type":"string","description":"Identifiant unique (slug) du créateur.","pattern":"^[a-z0-9.-]{3,40}$","example":"salmaelidrissi"},"displayName":{"type":"string","example":"Salma El Idrissi"},"avatarUrl":{"type":"string","format":"uri","example":"https://cdn.wassit.ma/creators/salmaelidrissi.jpg"},"bio":{"type":"string","example":"Créatrice mode & lifestyle basée à Casablanca. Bilingue FR/AR."},"city":{"type":"string","example":"Casablanca"},"niches":{"type":"array","items":{"type":"string"},"example":["fashion","lifestyle","beauty"]},"followers":{"type":"integer","minimum":0,"example":184200},"engagementRate":{"type":"number","format":"float","description":"Taux d’engagement moyen sur 30 jours (pourcentage).","example":4.7},"languages":{"type":"array","items":{"type":"string"},"example":["fr","ar","en"]},"verified":{"type":"boolean","example":true},"address":{"$ref":"#/components/schemas/Address"}}},"Package":{"type":"object","description":"Offre publiée par un créateur (story, reel, post UGC...).","required":["id","creatorHandle","title","format","price"],"properties":{"id":{"type":"string","example":"pkg_reel_30s_salma"},"creatorHandle":{"type":"string","example":"salmaelidrissi"},"title":{"type":"string","example":"Reel Instagram 30 secondes"},"description":{"type":"string","example":"Vidéo Reel verticale de 30s avec montage, voix-off et hashtags proposés."},"format":{"type":"string","enum":["reel","story","post","ugc_video","tiktok","youtube_short"],"example":"reel"},"deliveryDays":{"type":"integer","minimum":1,"example":7},"revisionsIncluded":{"type":"integer","minimum":0,"example":2},"price":{"$ref":"#/components/schemas/Money"},"priceMad":{"type":"integer","description":"Prix en MAD (raccourci, sans objet Money).","example":8500},"niche":{"type":"string","example":"fashion"},"active":{"type":"boolean","example":true}}},"Order":{"type":"object","description":"Commande passée par une marque auprès d’un créateur.","required":["id","reference","packageId","status","amount"],"properties":{"id":{"type":"string","example":"ord_7K2M9P"},"reference":{"type":"string","description":"Référence humaine pour la facturation.","example":"WST-2026-00042"},"packageId":{"type":"string","example":"pkg_reel_30s_salma"},"creatorHandle":{"type":"string","example":"salmaelidrissi"},"brandId":{"type":"string","example":"org_atlas_cosmetics"},"status":{"$ref":"#/components/schemas/OrderStatus"},"amount":{"$ref":"#/components/schemas/Money"},"platformFee":{"$ref":"#/components/schemas/Money"},"brief":{"type":"string","example":"Lancement du parfum Atlas N°7 : ambiance rosée, plan large sur la bouteille, mention #AtlasN7."},"proofUrl":{"type":"string","format":"uri","nullable":true,"example":"https://www.instagram.com/reel/Cxy_demo/"},"createdAt":{"type":"string","format":"date-time","example":"2026-05-18T10:24:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-05-21T08:00:00Z"},"escrowReleaseAt":{"type":"string","format":"date-time","nullable":true,"example":"2026-06-04T12:00:00Z"}}},"Transaction":{"type":"object","description":"Mouvement comptable lié à une commande.","required":["id","orderId","type","amount","createdAt"],"properties":{"id":{"type":"string","example":"tx_01HQR9X4F2"},"orderId":{"type":"string","example":"ord_7K2M9P"},"type":{"type":"string","enum":["charge","refund","payout","platform_fee","tax"],"example":"charge"},"amount":{"$ref":"#/components/schemas/Money"},"method":{"type":"string","enum":["card","cmi","bank_transfer","cash_pickup","wallet"],"example":"cmi"},"createdAt":{"type":"string","format":"date-time","example":"2026-05-18T10:25:11Z"},"invoiceUrl":{"type":"string","format":"uri","nullable":true,"example":"https://api.wassit.ma/v1/invoices/inv_01HQR9X4F2.pdf"}}},"ApiError":{"type":"object","description":"Format unifié des erreurs renvoyées par l’API.","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Code stable identifiant l’erreur.","example":"order_not_found"},"message":{"type":"string","example":"La commande demandée est introuvable ou a été archivée."},"requestId":{"type":"string","description":"Identifiant d’audit à fournir au support.","example":"req_01HQRA8B5T"},"details":{"type":"array","description":"Détails par champ pour les erreurs de validation.","items":{"type":"object","properties":{"field":{"type":"string","example":"brief"},"issue":{"type":"string","example":"minLength"}}}}}}}},"Pagination":{"type":"object","description":"Enveloppe de pagination par curseur.","required":["object","data","hasMore"],"properties":{"object":{"type":"string","enum":["list"],"example":"list"},"data":{"type":"array","items":{"type":"object"}},"hasMore":{"type":"boolean","example":true},"nextCursor":{"type":"string","nullable":true,"example":"cur_eyJpZCI6Im9yZF83SzJNOVAifQ"},"total":{"type":"integer","nullable":true,"example":312}}},"WebhookSubscription":{"type":"object","description":"Abonnement à un ou plusieurs événements webhook.","required":["id","url","events"],"properties":{"id":{"type":"string","example":"whk_01HQRB1C7N"},"url":{"type":"string","format":"uri","example":"https://hooks.atlas-cosmetics.ma/wassit"},"events":{"type":"array","items":{"type":"string"},"example":["order.created","order.completed","order.disputed"]},"secret":{"type":"string","description":"Clé partagée pour signer les payloads (HMAC-SHA256).","example":"whsec_HxJpQ8R2zT..."},"active":{"type":"boolean","example":true},"createdAt":{"type":"string","format":"date-time","example":"2026-05-10T09:00:00Z"}}},"Account":{"type":"object","description":"Compte appelant : organisation, scopes et quotas.","required":["organization","scopes","rateLimit","environment"],"properties":{"organization":{"type":"string","example":"atlas-cosmetics"},"scopes":{"type":"array","items":{"type":"string"},"example":["creators.read","orders.write","webhooks.manage"]},"rateLimit":{"type":"integer","example":600},"environment":{"type":"string","enum":["live","sandbox"],"example":"live"},"contactEmail":{"type":"string","format":"email","example":"dev@atlas-cosmetics.ma"}}},"FxRates":{"type":"object","description":"Table des taux indicatifs depuis MAD.","required":["baseCurrency","rates","updatedAt"],"properties":{"baseCurrency":{"type":"string","enum":["MAD"],"example":"MAD"},"rates":{"type":"object","additionalProperties":{"type":"number"},"example":{"EUR":0.0918,"USD":0.0996,"GBP":0.0782,"CAD":0.1358}},"updatedAt":{"type":"string","format":"date-time","example":"2026-05-21T06:00:00Z"}}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Clé d’API privée fournie en en-tête `X-API-Key`. À générer depuis le tableau de bord développeur Wassit."},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sk_live_*","description":"Jeton porteur (`Authorization: Bearer sk_live_*`) pour les SDKs officiels."},"OAuth2":{"type":"oauth2","description":"Flux OAuth 2.0 (à venir) pour les intégrations multi-utilisateurs et applications marketplace.","flows":{"authorizationCode":{"authorizationUrl":"https://api.wassit.ma/oauth/authorize","tokenUrl":"https://api.wassit.ma/oauth/token","refreshUrl":"https://api.wassit.ma/oauth/refresh","scopes":{"creators.read":"Lire les profils créateurs.","orders.read":"Lire les commandes de l’organisation.","orders.write":"Créer et modifier des commandes.","webhooks.manage":"Gérer les abonnements webhook.","payments.read":"Lire les transactions et factures."}}}}},"responses":{"Unauthorized":{"description":"Jeton manquant, expiré ou révoqué.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"unauthorized","message":"Jeton manquant ou invalide. Vérifiez l’en-tête Authorization.","requestId":"req_01HQRA8B5T"}}}}},"NotFound":{"description":"Ressource introuvable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"not_found","message":"La ressource demandée n’existe pas ou n’est pas accessible.","requestId":"req_01HQRA9V2K"}}}}},"ValidationError":{"description":"Le corps de requête est invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"validation_error","message":"Certains champs requis sont manquants ou mal formatés.","requestId":"req_01HQRAB7G3","details":[{"field":"brief","issue":"minLength"}]}}}}}},"parameters":{"Cursor":{"name":"cursor","in":"query","description":"Curseur de pagination renvoyé par la réponse précédente.","required":false,"schema":{"type":"string","example":"cur_eyJpZCI6Im9yZF83SzJNOVAifQ"}},"Limit":{"name":"limit","in":"query","description":"Nombre maximum d’éléments par page (1 à 100).","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":20}},"OrderId":{"name":"id","in":"path","description":"Identifiant de la commande (`ord_*`).","required":true,"schema":{"type":"string","example":"ord_7K2M9P"}},"Handle":{"name":"handle","in":"path","description":"Identifiant public du créateur.","required":true,"schema":{"type":"string","example":"salmaelidrissi"}},"WebhookId":{"name":"id","in":"path","description":"Identifiant de l’abonnement webhook (`whk_*`).","required":true,"schema":{"type":"string","example":"whk_01HQRB1C7N"}}}}}